From 7e44338b1157daeb75b1757e41b5408311e87d88 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 4 Mar 2019 19:41:35 +0200 Subject: [PATCH 01/54] PHP 5.6 Update --- Clear.bat | 1 + DelphiFunctions.pas | 1237 +--- .../Extensions/Borland Demo/Unit1.ddp | Bin 0 -> 51 bytes .../Extensions/Borland Demo/Unit1.dfm | 246 + .../Extensions/Borland Demo/Unit1.dti | 41 + .../Extensions/Borland Demo/Unit1.pas | 244 + .../Extensions/Borland Demo/borland_demo.dpr | 16 + .../Borland Demo/borland_demo.dproj | 107 + .../Extensions/Borland Demo/borland_demo.php | 18 + .../Extensions/Borland Demo/borland_demo.res | Bin 0 -> 876 bytes .../Extensions/Class demo/class_demo.dpr | 16 + .../Extensions/Class demo/class_demo.dproj | 112 + .../Extensions/Class demo/class_demo.res | Bin 0 -> 876 bytes .../Extensions/Class demo/dm_Class.ddp | Bin 0 -> 51 bytes .../Extensions/Class demo/dm_Class.dfm | 61 + .../Extensions/Class demo/dm_Class.dti | 41 + .../Extensions/Class demo/dm_Class.pas | 102 + .../Extensions/Class demo/test_class.php | 15 + .../Delphi Class 1/delphi_class.dpr | 16 + .../Delphi Class 1/delphi_class.dproj | 111 + .../Delphi Class 1/delphi_class.php | 15 + .../Delphi Class 1/delphi_class.res | Bin 0 -> 4396 bytes .../Delphi Class 1/delphi_class_module.ddp | Bin 0 -> 51 bytes .../Delphi Class 1/delphi_class_module.dfm | 89 + .../Delphi Class 1/delphi_class_module.dti | 41 + .../Delphi Class 1/delphi_class_module.pas | 344 ++ .../Extensions/Delphi Class 1/readme.txt | 1 + .../Delphi Class 2/delphi_class.php | 42 + .../Delphi Class 2/delphi_class2.dpr | 146 + .../Delphi Class 2/delphi_class2.dproj | 108 + .../Delphi Class 2/delphi_class2.php | 26 + .../Extensions/Delphi Class 2/readme.txt | 1 + .../Extensions/Math/delphi_math.dpr | 16 + .../Extensions/Math/delphi_math.dproj | 107 + .../Extensions/Math/delphi_math.res | Bin 0 -> 876 bytes .../Extensions/Math/extmain.ddp | Bin 0 -> 51 bytes .../Extensions/Math/extmain.dfm | 50 + .../Extensions/Math/extmain.dti | 41 + .../Extensions/Math/extmain.pas | 86 + .../Extensions/Math/test_math.php | 30 + .../Read array parameters/Unit1.ddp | Bin 0 -> 51 bytes .../Read array parameters/Unit1.dfm | 23 + .../Read array parameters/Unit1.pas | 68 + .../Extensions/Read array parameters/rarp.dpr | 16 + .../Read array parameters/rarp.dproj | 107 + .../Extensions/Read array parameters/rarp.res | Bin 0 -> 876 bytes .../Read array parameters/rarptest.php | 13 + .../Extensions/Resources/Unit1.ddp | Bin 0 -> 51 bytes .../Extensions/Resources/Unit1.dfm | 25 + .../Extensions/Resources/Unit1.dti | 41 + .../Extensions/Resources/Unit1.pas | 94 + .../Extensions/Resources/res_ext.dpr | 16 + .../Extensions/Resources/res_ext.dproj | 107 + .../Extensions/Resources/res_ext.res | Bin 0 -> 876 bytes .../Extensions/Resources/test_resource.php | 21 + .../Extensions/array result/Unit1.ddp | Bin 0 -> 51 bytes .../Extensions/array result/Unit1.dfm | 20 + .../Extensions/array result/Unit1.pas | 119 + .../Extensions/array result/rarray.dpr | 16 + .../Extensions/array result/rarray.dproj | 112 + .../Extensions/array result/rarray.php | 31 + .../Extensions/array result/rarray.res | Bin 0 -> 876 bytes .../Extensions/css/CREDITS | 1 + .../Extensions/css/EXPERIMENTAL | 0 .../Extensions/css/css.dpr | 135 + .../Extensions/css/css.dproj | 103 + .../Extensions/php class/php_class.dpr | 163 + .../Extensions/php class/php_class.dproj | 103 + .../Extensions/php class/test_class.php | 15 + .../Extensions/phpDLL/Unit1.ddp | Bin 0 -> 51 bytes .../Extensions/phpDLL/Unit1.dfm | 18 + .../Extensions/phpDLL/Unit1.dti | 41 + .../Extensions/phpDLL/Unit1.pas | 59 + .../Extensions/phpDLL/phpDLL.dpr | 16 + .../Extensions/phpDLL/phpDLL.dproj | 107 + .../Extensions/phpDLL/phpDLL.res | Bin 0 -> 876 bytes .../Extensions/phpDLL/testdll.php | 24 + .../Extensions/reference/Unit1.ddp | Bin 0 -> 51 bytes .../Extensions/reference/Unit1.dfm | 24 + .../Extensions/reference/Unit1.pas | 45 + .../Extensions/reference/php_ref.dpr | 16 + .../Extensions/reference/php_ref.dproj | 107 + .../Extensions/reference/php_ref.res | Bin 0 -> 876 bytes .../Extensions/reference/testref.php | 28 + .../Extensions/skeleton/CREDITS | 1 + .../Extensions/skeleton/EXPERIMENTAL | 0 .../Extensions/skeleton/skeleton.bdsproj | 175 + .../Extensions/skeleton/skeleton.dpr | 126 + .../Extensions/skeleton/skeleton.dproj | 111 + .../Extensions/skeleton/tests/skeleton.php | 19 + .../skeleton/tests/test_skeleton.php | 25 + .../Tutorial/Step.01/Project1.dpr | 16 + .../Tutorial/Step.01/Project1.dproj | 107 + .../Tutorial/Step.01/Project1.res | Bin 0 -> 876 bytes .../Tutorial/Step.01/Unit1.ddp | Bin 0 -> 51 bytes .../Tutorial/Step.01/Unit1.dfm | 9 + .../Tutorial/Step.01/Unit1.dti | 41 + .../Tutorial/Step.01/Unit1.pas | 45 + .../Tutorial/Step.02/Project1.dpr | 16 + .../Tutorial/Step.02/Project1.dproj | 107 + .../Tutorial/Step.02/Project1.res | Bin 0 -> 876 bytes .../Tutorial/Step.02/Unit1.ddp | Bin 0 -> 51 bytes .../Tutorial/Step.02/Unit1.dfm | 10 + .../Tutorial/Step.02/Unit1.dti | 41 + .../Tutorial/Step.02/Unit1.pas | 45 + .../Tutorial/Step.03/Project1.dpr | 16 + .../Tutorial/Step.03/Project1.dproj | 107 + .../Tutorial/Step.03/Project1.res | Bin 0 -> 876 bytes .../Tutorial/Step.03/Unit1.ddp | Bin 0 -> 51 bytes .../Tutorial/Step.03/Unit1.dfm | 15 + .../Tutorial/Step.03/Unit1.dti | 41 + .../Tutorial/Step.03/Unit1.pas | 45 + .../Tutorial/Step.04/Project1.dpr | 16 + .../Tutorial/Step.04/Project1.dproj | 107 + .../Tutorial/Step.04/Project1.res | Bin 0 -> 876 bytes .../Tutorial/Step.04/Unit1.ddp | Bin 0 -> 51 bytes .../Tutorial/Step.04/Unit1.dfm | 19 + .../Tutorial/Step.04/Unit1.dti | 41 + .../Tutorial/Step.04/Unit1.pas | 45 + .../Tutorial/Step.05/Project1.dpr | 16 + .../Tutorial/Step.05/Project1.dproj | 113 + .../Tutorial/Step.05/Project1.res | Bin 0 -> 876 bytes .../Tutorial/Step.05/Unit1.ddp | Bin 0 -> 51 bytes .../Tutorial/Step.05/Unit1.dfm | 20 + .../Tutorial/Step.05/Unit1.dti | 41 + .../Tutorial/Step.05/Unit1.pas | 57 + .../Tutorial/Step.06/test_script.php | 22 + .../C#/PHP4DelphiDemo/App.ico | Bin 0 -> 1078 bytes .../C#/PHP4DelphiDemo/AssemblyInfo.cs | 58 + .../C#/PHP4DelphiDemo/Form1.cs | 223 + .../C#/PHP4DelphiDemo/Form1.resx | 123 + .../C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj | 112 + .../PHP4DelphiDemo/PHP4DelphiDemo.csproj.user | 58 + .../C#/PHP4DelphiDemo/PHP4DelphiDemo.sln | 19 + .../C#/PHP4DelphiDemo/app.config | 4 + .../C#/PHP4DelphiDemo/test.php | 4 + .../php4Applications/C++ VS 2005/StdAfx.cpp | 8 + .../php4Applications/C++ VS 2005/StdAfx.h | 19 + .../php4Applications/C++ VS 2005/cdemo.cpp | 101 + .../php4Applications/C++ VS 2005/cdemo.dsp | 113 + .../php4Applications/C++ VS 2005/cdemo.dsw | 29 + .../php4Applications/C++ VS 2005/cdemo.sln | 20 + .../php4Applications/C++ VS 2005/cdemo.vcproj | 268 + .../php4Applications/C++ VS 2005/test.php | 5 + .../php4Applications/C++ VS 6.0/StdAfx.cpp | 8 + .../php4Applications/C++ VS 6.0/StdAfx.h | 19 + .../php4Applications/C++ VS 6.0/cdemo.cpp | 101 + .../php4Applications/C++ VS 6.0/cdemo.dsp | 113 + .../php4Applications/C++ VS 6.0/cdemo.dsw | 29 + .../php4Applications/C++ VS 6.0/test.php | 5 + .../Delphi .NET/php4Delphi.MainForm.pas | 142 + .../Delphi .NET/php4Delphi.MainForm.resx | 142 + .../Delphi .NET/php4Delphi.Standard.pas | 52 + .../Delphi .NET/php4Delphi.TWinForm.resources | Bin 0 -> 4101 bytes .../Delphi .NET/php4DelphiDemo.bdsproj | 235 + .../Delphi .NET/php4DelphiDemo.dpr | 100 + .../Delphi .NET/php4DelphiDemo.res | Bin 0 -> 4396 bytes .../php4Applications/Delphi/Project1.dpr | 13 + .../php4Applications/Delphi/Project1.dproj | 105 + .../php4Applications/Delphi/Project1.res | Bin 0 -> 876 bytes .../php4Applications/Delphi/Unit1.ddp | Bin 0 -> 51 bytes .../php4Applications/Delphi/Unit1.dfm | 62 + .../php4Applications/Delphi/Unit1.pas | 120 + .../php4Applications/Delphi/result.txt | 1 + .../php4Applications/Delphi/test.php | 5 + .../php4Applications/MS Word/Doc1.doc | Bin 0 -> 33280 bytes .../php4Applications/MS Word/test.php | 4 + .../VB .NET/php4delphi/php4delphi.sln | 20 + .../php4delphi/ApplicationEvents.vb | 15 + .../php4delphi/php4delphi/Form1.Designer.vb | 71 + .../VB .NET/php4delphi/php4delphi/Form1.resx | 123 + .../VB .NET/php4delphi/php4delphi/Form1.vb | 32 + .../My Project/Application.Designer.vb | 38 + .../php4delphi/My Project/Application.myapp | 10 + .../php4delphi/php4delphi/php4delphi.vbproj | 88 + .../php4delphi/php4delphi.vbproj.user | 16 + .../php4Applications/Visual Basic/Form1.frm | 50 + .../Visual Basic/MSSCCPRJ.SCC | 5 + .../php4Applications/Visual Basic/php_VB.vbp | 32 + .../php4Applications/Visual Basic/php_VB.vbw | 2 + .../Visual Basic/php_module.bas | 14 + .../php4Applications/Visual Basic/test.php | 4 + .../psvPHP/Components/ComponentsDemo.dpr | 14 + .../psvPHP/Components/ComponentsDemo.dproj | 105 + .../psvPHP/Components/ComponentsDemo.res | Bin 0 -> 1860 bytes .../psvPHP/Components/Unit1.ddp | Bin 0 -> 51 bytes .../psvPHP/Components/Unit1.dfm | 60 + .../psvPHP/Components/Unit1.pas | 134 + .../psvPHP/Components/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/Custom Library/DemoMain.dfm | 40 + .../psvPHP/Custom Library/DemoMain.pas | 49 + .../psvPHP/Custom Library/ExtDemo.dpr | 13 + .../psvPHP/Custom Library/ExtDemo.dproj | 105 + .../psvPHP/Custom Library/ExtDemo.res | Bin 0 -> 1860 bytes .../psvPHP/Custom Library/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/Custom Library/phpShellLibrary.pas | 104 + .../psvPHP/Dynamic Array/dynamic_array.dpr | 26 + .../psvPHP/Dynamic Array/dynamic_array.dproj | 102 + .../psvPHP/Encryption/EncDemo.dpr | 14 + .../psvPHP/Encryption/EncDemo.dproj | 105 + .../psvPHP/Encryption/EncDemo.res | Bin 0 -> 1860 bytes .../psvPHP/Encryption/WindowsXP.res | Bin 0 -> 648 bytes .../Encryption/std.encryption.class.inc | 253 + .../psvPHP/Encryption/uMain.ddp | Bin 0 -> 51 bytes .../psvPHP/Encryption/uMain.dfm | 235 + .../psvPHP/Encryption/uMain.pas | 143 + .../psvPHP/Graph/Project1.dpr | 13 + .../psvPHP/Graph/Project1.dproj | 105 + .../psvPHP/Graph/Project1.res | Bin 0 -> 876 bytes .../psvPHP/Graph/Unit1.ddp | Bin 0 -> 51 bytes .../psvPHP/Graph/Unit1.dfm | 120 + .../psvPHP/Graph/Unit1.pas | 210 + .../psvPHP/Graph/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/ISAPI Module/dmEngine.ddp | Bin 0 -> 51 bytes .../psvPHP/ISAPI Module/dmEngine.dfm | 30 + .../psvPHP/ISAPI Module/dmEngine.pas | 56 + .../psvPHP/ISAPI Module/dmMain.ddp | Bin 0 -> 51 bytes .../psvPHP/ISAPI Module/dmMain.dfm | 23 + .../psvPHP/ISAPI Module/dmMain.pas | 51 + .../psvPHP/ISAPI Module/phpISAPITest.dpr | 54 + .../psvPHP/ISAPI Module/phpisapitest.bdsproj | 177 + .../psvPHP/ISAPI Module/phpisapitest.dproj | 114 + .../psvPHP/ISAPI Module/phpisapitest.res | Bin 0 -> 4396 bytes .../psvPHP/Library demo/LibraryDemo.dpr | 18 + .../psvPHP/Library demo/LibraryDemo.dproj | 112 + .../psvPHP/Library demo/LibraryDemo.res | Bin 0 -> 1860 bytes .../psvPHP/Library demo/Unit1.ddp | Bin 0 -> 51 bytes .../psvPHP/Library demo/Unit1.dfm | 80 + .../psvPHP/Library demo/Unit1.pas | 77 + .../psvPHP/Library demo/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/Library demo/dm_Main.dfm | 18 + .../psvPHP/Library demo/dm_Main.dti | 41 + .../psvPHP/Library demo/dm_Main.pas | 39 + .../psvPHP/Library demo/frm_dialog.dfm | 34 + .../psvPHP/Library demo/frm_dialog.pas | 32 + .../psvPHP/Logo/LogoDemo.dpr | 13 + .../psvPHP/Logo/LogoDemo.dproj | 105 + .../psvPHP/Logo/LogoDemo.res | Bin 0 -> 1860 bytes .../psvPHP/Logo/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/Logo/egg.gif | Bin 0 -> 7538 bytes .../psvPHP/Logo/uMain.dfm | 36 + .../psvPHP/Logo/uMain.pas | 46 + .../Multithread simple/MultithreadSample.dpr | 14 + .../MultithreadSample.dproj | 106 + .../Multithread simple/MultithreadSample.res | Bin 0 -> 1860 bytes .../psvPHP/Multithread simple/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/Multithread simple/frm_main.ddp | Bin 0 -> 51 bytes .../psvPHP/Multithread simple/frm_main.dfm | 44 + .../psvPHP/Multithread simple/frm_main.pas | 62 + .../psvPHP/Multithread simple/php_thread.pas | 45 + .../psvPHP/array demo/Project1.dpr | 13 + .../psvPHP/array demo/Project1.dproj | 105 + .../psvPHP/array demo/Project1.res | Bin 0 -> 1860 bytes .../psvPHP/array demo/Unit1.ddp | Bin 0 -> 51 bytes .../psvPHP/array demo/Unit1.dfm | 60 + .../psvPHP/array demo/Unit1.pas | 108 + .../psvPHP/array demo/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/console/phpcon.dpr | 35 + .../psvPHP/console/phpcon.dproj | 102 + .../psvPHP/console/test.php | 4 + .../psvPHP/sample1/Sample1.dpr | 16 + .../psvPHP/sample1/Sample1.dproj | 110 + .../psvPHP/sample1/Sample1.res | Bin 0 -> 3436 bytes .../psvPHP/sample1/frm_phpDemo.ddp | Bin 0 -> 51 bytes .../psvPHP/sample1/frm_phpDemo.dfm | 192 + .../psvPHP/sample1/frm_phpDemo.pas | 179 + .../psvPHP/sample1/internal.RES | Bin 0 -> 10608 bytes .../psvPHP/sample1/internal.rc | 3 + .../psvPHP/sample1/php.gif | Bin 0 -> 3872 bytes .../psvPHP/sample1/test.php | 4 + .../psvPHP/sample1/zend1.gif | Bin 0 -> 4440 bytes .../psvPHP/sample1/zend2.gif | Bin 0 -> 2146 bytes .../psvPHP/sample2/Sample2.dpr | 14 + .../psvPHP/sample2/Sample2.dproj | 105 + .../psvPHP/sample2/Sample2.res | Bin 0 -> 1860 bytes .../psvPHP/sample2/Unit1.ddp | Bin 0 -> 51 bytes .../psvPHP/sample2/Unit1.dfm | 84 + .../psvPHP/sample2/Unit1.pas | 54 + .../psvPHP/sample2/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/sample3/Sample3.dpr | 13 + .../psvPHP/sample3/Sample3.dproj | 105 + .../psvPHP/sample3/Sample3.res | Bin 0 -> 1860 bytes .../psvPHP/sample3/Unit1.ddp | Bin 0 -> 51 bytes .../psvPHP/sample3/Unit1.dfm | 91 + .../psvPHP/sample3/Unit1.pas | 77 + .../psvPHP/sample3/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/sample4/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/sample4/frm_PHPTest.ddp | Bin 0 -> 51 bytes .../psvPHP/sample4/frm_PHPTest.dfm | 103 + .../psvPHP/sample4/frm_PHPTest.pas | 53 + .../psvPHP/sample4/psvPHP_test.dpr | 13 + .../psvPHP/sample4/psvPHP_test.dproj | 105 + .../psvPHP/sample4/psvPHP_test.res | Bin 0 -> 1860 bytes Demos/Bonus/JpegConverter/php_jpeg.bdsproj | 658 ++ Demos/Bonus/JpegConverter/php_jpeg.dpr | 36 +- Demos/Bonus/PHPEncoder/phpencoder.bdsproj | 658 ++ Demos/Bonus/PHPEncoder/phpencoder.dpr | 18 +- Demos/Bonus/phpRegistry/php_registry.dproj | 97 + .../phpRegistry/php_registry.dproj.local | 2 + .../Bonus/phpRegistry/php_registry.identcache | Bin 0 -> 84 bytes Demos/Bonus/phpRegistry/php_registry.stat | 10 + Demos/Bonus/wincon/test_wincon.php | 13 + Demos/Delphi4PHP/DesignIDE/d4pide.dpr | 166 + Demos/Delphi4PHP/DesignIDE/readme.txt | 59 + Demos/Extensions/Borland Demo/Unit1.ddp | Bin 0 -> 51 bytes Demos/Extensions/Borland Demo/Unit1.dfm | 109 - Demos/Extensions/Borland Demo/Unit1.pas | 37 +- .../Borland Demo/borland_demo.dproj | 503 ++ .../Borland Demo/borland_demo.dproj.local | 2 + .../Borland Demo/borland_demo.identcache | Bin 0 -> 153 bytes .../Extensions/Borland Demo/borland_demo.res | Bin 876 -> 1484 bytes .../Extensions/Borland Demo/borland_demo.stat | 10 + .../Borland Demo/borland_demo_Icon.ico | Bin 0 -> 766 bytes .../Extensions/Class demo/class_demo.bdsproj | 658 ++ Demos/Extensions/Class demo/dm_Class.ddp | Bin 0 -> 51 bytes Demos/Extensions/Class demo/dm_Class.pas | 10 +- .../Delphi Class 1/delphi_class.bdsproj | 658 ++ .../Delphi Class 1/delphi_class_module.pas | 24 +- .../Delphi Class 2/delphi_class2.bdsproj | 658 ++ .../Delphi Class 2/delphi_class2.dpr | 67 +- Demos/Extensions/Math/delphi_math.bdsproj | 658 ++ Demos/Extensions/Math/extmain.pas | 18 +- .../Read array parameters/Unit1.ddp | Bin 0 -> 51 bytes .../Read array parameters/Unit1.dfm | 25 + .../Read array parameters/Unit1.pas | 68 + .../Read array parameters/rarp.bdsproj | 658 ++ .../Extensions/Read array parameters/rarp.dpr | 16 + .../Extensions/Read array parameters/rarp.res | Bin 0 -> 876 bytes .../Read array parameters/rarptest.php | 13 + Demos/Extensions/Resources/Unit1.pas | 17 +- Demos/Extensions/Resources/res_ext.bdsproj | 658 ++ Demos/Extensions/array result/Unit1.ddp | Bin 0 -> 51 bytes Demos/Extensions/array result/Unit1.pas | 14 +- Demos/Extensions/array result/rarray.bdsproj | 658 ++ Demos/Extensions/array result/rarray.dproj | 112 + .../array result/rarray.dproj.local | 2 + .../Extensions/array result/rarray.identcache | Bin 0 -> 163 bytes Demos/Extensions/array result/rarray.res | Bin 876 -> 1460 bytes Demos/Extensions/array result/rarray.stat | 10 + Demos/Extensions/array result/rarray_Icon.ico | Bin 0 -> 766 bytes Demos/Extensions/css/css.bdsproj | 658 ++ Demos/Extensions/css/css.dpr | 21 +- Demos/Extensions/css/css.dproj | 99 + Demos/Extensions/css/css.dproj.local | 2 + Demos/Extensions/css/css.identcache | Bin 0 -> 64 bytes Demos/Extensions/css/css.res | Bin 0 -> 600 bytes Demos/Extensions/css/css.stat | 10 + Demos/Extensions/php class/php_class.bdsproj | 658 ++ Demos/Extensions/php class/php_class.dpr | 9 +- Demos/Extensions/phpDLL/Unit1.ddp | Bin 0 -> 51 bytes Demos/Extensions/phpDLL/Unit1.pas | 6 +- Demos/Extensions/phpDLL/phpDLL.bdsproj | 658 ++ Demos/Extensions/reference/Unit1.ddp | Bin 0 -> 51 bytes Demos/Extensions/reference/Unit1.pas | 4 +- Demos/Extensions/reference/php_ref.bdsproj | 658 ++ Demos/Extensions/skeleton/skeleton.bdsproj | 658 ++ Demos/Extensions/skeleton/skeleton.dpr | 23 +- Demos/Extensions/skeleton/skeleton.dproj | 565 ++ Demos/Tutorial/Step.01/Unit1.ddp | Bin 0 -> 51 bytes Demos/Tutorial/Step.01/Unit1.dfm | 6 +- Demos/Tutorial/Step.01/Unit1.pas | 2 +- Demos/Tutorial/Step.02/Unit1.ddp | Bin 0 -> 51 bytes Demos/Tutorial/Step.02/Unit1.dfm | 6 +- Demos/Tutorial/Step.02/Unit1.pas | 2 +- Demos/Tutorial/Step.03/Unit1.ddp | Bin 0 -> 51 bytes Demos/Tutorial/Step.03/Unit1.dfm | 6 +- Demos/Tutorial/Step.03/Unit1.pas | 2 +- Demos/Tutorial/Step.04/Unit1.ddp | Bin 0 -> 51 bytes Demos/Tutorial/Step.04/Unit1.dfm | 6 +- Demos/Tutorial/Step.04/Unit1.pas | 2 +- Demos/Tutorial/Step.05/Project1.dproj | 557 ++ Demos/Tutorial/Step.05/Unit1.ddp | Bin 0 -> 51 bytes Demos/Tutorial/Step.05/Unit1.dfm | 6 +- Demos/Tutorial/Step.05/Unit1.pas | 6 +- .../C#/PHP4DelphiDemo/Form1.cs | 154 +- .../C#/PHP4DelphiDemo/Form1.resx | 146 +- .../C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj | 235 +- .../PHP4DelphiDemo/PHP4DelphiDemo.csproj.user | 106 +- .../C#/PHP4DelphiDemo/PHP4DelphiDemo.sln | 26 +- .../C#/PHP4DelphiDemo/app.config | 3 +- Demos/php4Applications/C++ VS 2005/cdemo.cpp | 1 - Demos/php4Applications/C++ VS 6.0/cdemo.cpp | 1 - .../php4Applications/Delphi/Project1.bdsproj | 658 ++ Demos/php4Applications/Delphi/Project1.res | Bin 876 -> 876 bytes Demos/php4Applications/Delphi/Unit1.ddp | Bin 0 -> 51 bytes Demos/php4Applications/Delphi/Unit1.dfm | 2 +- Demos/php4Applications/Delphi/Unit1.pas | 20 +- Demos/php4Applications/Delphi/result.txt | 1 + .../psvPHP/Components/ComponentsDemo.bdsproj | 658 ++ Demos/psvPHP/Components/ComponentsDemo.dpr | 1 + Demos/psvPHP/Components/ComponentsDemo.res | Bin 876 -> 1860 bytes Demos/psvPHP/Components/Unit1.ddp | Bin 0 -> 51 bytes Demos/psvPHP/Components/Unit1.dfm | 17 +- Demos/psvPHP/Components/Unit1.pas | 54 +- Demos/psvPHP/Components/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/Custom Library/DemoMain.dfm | 40 + Demos/psvPHP/Custom Library/DemoMain.pas | 49 + Demos/psvPHP/Custom Library/ExtDemo.bdsproj | 658 ++ Demos/psvPHP/Custom Library/ExtDemo.dpr | 13 + Demos/psvPHP/Custom Library/ExtDemo.res | Bin 0 -> 1860 bytes Demos/psvPHP/Custom Library/WindowsXP.res | Bin 0 -> 648 bytes .../psvPHP/Custom Library/phpShellLibrary.pas | 8 +- Demos/psvPHP/Encryption/EncDemo.dpr | 1 + Demos/psvPHP/Encryption/EncDemo.res | Bin 876 -> 1860 bytes Demos/psvPHP/Encryption/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/Encryption/uMain.dfm | 14 +- Demos/psvPHP/Encryption/uMain.pas | 26 +- Demos/psvPHP/Graph/Unit1.ddp | Bin 0 -> 51 bytes Demos/psvPHP/Graph/Unit1.dfm | 82 +- Demos/psvPHP/Graph/Unit1.pas | 160 +- Demos/psvPHP/Graph/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/ISAPI Module/dmEngine.ddp | Bin 0 -> 51 bytes Demos/psvPHP/ISAPI Module/dmEngine.dfm | 30 + Demos/psvPHP/ISAPI Module/dmEngine.pas | 56 + Demos/psvPHP/ISAPI Module/dmMain.ddp | Bin 0 -> 51 bytes Demos/psvPHP/ISAPI Module/dmMain.dfm | 23 + Demos/psvPHP/ISAPI Module/dmMain.pas | 51 + .../psvPHP/ISAPI Module/phpisapitest.bdsproj | 177 + Demos/psvPHP/ISAPI Module/phpisapitest.dpr | 54 + Demos/psvPHP/ISAPI Module/phpisapitest.res | Bin 0 -> 4396 bytes Demos/psvPHP/Library demo/LibraryDemo.dpr | 18 + Demos/psvPHP/Library demo/LibraryDemo.res | Bin 0 -> 1860 bytes Demos/psvPHP/Library demo/Unit1.ddp | Bin 0 -> 51 bytes Demos/psvPHP/Library demo/Unit1.dfm | 25 +- Demos/psvPHP/Library demo/Unit1.pas | 34 +- Demos/psvPHP/Library demo/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/Library demo/dm_Main.dfm | 18 + Demos/psvPHP/Library demo/dm_Main.dti | 41 + Demos/psvPHP/Library demo/dm_Main.pas | 39 + Demos/psvPHP/Library demo/frm_dialog.dfm | 34 + Demos/psvPHP/Library demo/frm_dialog.pas | 32 + Demos/psvPHP/Logo/LogoDemo.res | Bin 876 -> 1860 bytes Demos/psvPHP/Logo/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/Logo/egg.gif | Bin 0 -> 7538 bytes Demos/psvPHP/Logo/uMain.pas | 1 + .../Multithread simple/MultithreadSample.dpr | 14 + .../Multithread simple/MultithreadSample.res | Bin 0 -> 1860 bytes Demos/psvPHP/Multithread simple/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/Multithread simple/frm_main.ddp | Bin 0 -> 51 bytes Demos/psvPHP/Multithread simple/frm_main.dfm | 44 + Demos/psvPHP/Multithread simple/frm_main.pas | 62 + .../psvPHP/Multithread simple/php_thread.pas | 45 + .../Thread Management/ManageThreads.dpr | 14 + .../Thread Management/ManageThreads.res | Bin 0 -> 1860 bytes Demos/psvPHP/Thread Management/frm_main.dfm | 56 + Demos/psvPHP/Thread Management/frm_main.pas | 67 + Demos/psvPHP/Thread Management/php_thread.pas | 61 + .../psvPHP/Threads Library/ManageThreads.dpr | 14 + .../psvPHP/Threads Library/ManageThreads.res | Bin 0 -> 1860 bytes Demos/psvPHP/Threads Library/frm_main.ddp | Bin 0 -> 51 bytes Demos/psvPHP/Threads Library/frm_main.dfm | 98 + Demos/psvPHP/Threads Library/frm_main.pas | 93 + Demos/psvPHP/Threads Library/php_thread.pas | 81 + Demos/psvPHP/array demo/Project1.bdsproj | 658 ++ Demos/psvPHP/array demo/Project1.res | Bin 876 -> 1860 bytes Demos/psvPHP/array demo/Unit1.ddp | Bin 0 -> 51 bytes Demos/psvPHP/array demo/Unit1.dfm | 22 +- Demos/psvPHP/array demo/Unit1.pas | 60 +- Demos/psvPHP/array demo/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/console/phpcon.dpr | 7 +- Demos/psvPHP/sample1/Sample1.bdsproj | 658 ++ Demos/psvPHP/sample1/Sample1.dpr | 16 + Demos/psvPHP/sample1/Sample1.dproj | 37 + Demos/psvPHP/sample1/Sample1.res | Bin 0 -> 2552 bytes Demos/psvPHP/sample1/Thumbs.db | Bin 0 -> 18944 bytes Demos/psvPHP/sample1/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/sample1/frm_phpDemo.ddp | Bin 0 -> 51 bytes Demos/psvPHP/sample1/frm_phpDemo.dfm | 194 + Demos/psvPHP/sample1/frm_phpDemo.pas | 178 + Demos/psvPHP/sample2/Sample2.bdsproj | 658 ++ Demos/psvPHP/sample2/Sample2.dpr | 14 + Demos/psvPHP/sample2/Sample2.res | Bin 0 -> 1860 bytes Demos/psvPHP/sample2/Unit1.dfm | 18 +- Demos/psvPHP/sample2/Unit1.pas | 7 +- Demos/psvPHP/sample3/Sample3.dpr | 13 + Demos/psvPHP/sample3/Sample3.res | Bin 0 -> 1860 bytes Demos/psvPHP/sample3/Unit1.ddp | Bin 0 -> 51 bytes Demos/psvPHP/sample3/Unit1.dfm | 11 +- Demos/psvPHP/sample3/Unit1.pas | 18 +- Demos/psvPHP/sample3/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/sample4/WindowsXP.res | Bin 0 -> 648 bytes Demos/psvPHP/sample4/frm_PHPTest.ddp | Bin 51 -> 51 bytes Demos/psvPHP/sample4/frm_PHPTest.dfm | 13 +- Demos/psvPHP/sample4/frm_PHPTest.pas | 16 +- Demos/psvPHP/sample4/psvPHP_test.res | Bin 876 -> 1860 bytes Documentation/Delphi 7/php4delphid7.als | 137 + Documentation/Delphi 7/php4delphid7.cnt | 25 + Documentation/Delphi 7/php4delphid7.hlp | Bin 0 -> 147336 bytes Documentation/php4Delphi.pdf | Bin 0 -> 205551 bytes ExtensionBuilder/phpExtensionBuilder.pas | 2 +- PHP.INC | 104 +- PHP4DelphiD2006.bdsproj | 833 ++- PHP4DelphiD2006.dpk | 19 +- PHP4DelphiD2006.dproj | 125 + PHP4DelphiD2006.dproj.local | 2 + PHP4DelphiD2006.stat | 10 + PHP4DelphiD2006_Icon.ico | Bin 0 -> 766 bytes PHPAPI.pas | 1404 +++-- PHPCommon.pas | 828 +-- PHPFunctions.pas | 1584 ++--- PHPLibrary.pas | 692 +-- PHPProjectWizard.pas | 1164 ++-- PHPTypes.pas | 852 +-- ProjectGroup1.groupproj | 48 + ProjectGroup1.groupproj.local | 7 + ProjectGroup1_prjgroup.tvsconfig | 2 + ZENDAPI.pas | 5430 +++++++++++------ ZendTypes.pas | 2955 ++++----- license.txt | 136 +- logos.pas | 3052 ++++----- php4App.dll | Bin 0 -> 2192384 bytes php4App.dpr | 86 +- php4App.dproj | 106 + php4App.dproj.local | 2 + php4App.identcache | Bin 0 -> 47 bytes php4App.res | Bin 1764 -> 1460 bytes php4App.stat | 10 + php4AppIntf.pas | 78 +- php4AppUnit.pas | 1301 ++-- php4App_Icon.ico | Bin 0 -> 766 bytes php4Applications/PHP 4.4.6/php4App.dll | Bin 0 -> 130560 bytes php4Applications/PHP 5.2.11/php4App.dll | Bin 0 -> 134656 bytes php4Applications/PHP 5.3.0/php4App.dll | Bin 0 -> 135168 bytes php4DelphiD2005.dpk | 19 +- php4DelphiD2005.dproj | 123 + php4DelphiD2005.dproj.local | 2 + php4DelphiD2005.stat | 10 + php4DelphiD2005_Icon.ico | Bin 0 -> 766 bytes php4DelphiD2007.dpk | 48 + php4DelphiD2007.dproj | 125 + php4DelphiD2007.dproj.local | 2 + php4DelphiD2007.res | Bin 0 -> 1560 bytes php4DelphiD2007.stat | 10 + php4DelphiD2007_Icon.ico | Bin 0 -> 766 bytes php4DelphiD2009.dpk | 47 + php4DelphiD2009.dproj | 123 + php4DelphiD2009.dproj.local | 2 + php4DelphiD2009.res | Bin 0 -> 4396 bytes php4DelphiD2009.stat | 10 + php4DelphiD2009_Icon.ico | Bin 0 -> 4286 bytes php4DelphiD2010.dpk | 46 + php4DelphiD2010.dproj | 490 ++ php4DelphiD2010.dproj.local | 6 + php4DelphiD2010.identcache | Bin 0 -> 286 bytes php4DelphiD2010.res | Bin 0 -> 4876 bytes php4DelphiD2010.stat | 10 + php4DelphiD2010_Icon.ico | Bin 0 -> 4286 bytes php4DelphiD5.dpk | 23 +- php4DelphiD5.dproj | 133 + php4DelphiD5.dproj.local | 2 + php4DelphiD5.res | Bin 1536 -> 1484 bytes php4DelphiD5.stat | 10 + php4DelphiD5_Icon.ico | Bin 0 -> 766 bytes php4DelphiD6.dpk | 19 +- php4DelphiD6.dproj | 110 + php4DelphiD6.dproj.local | 2 + php4DelphiD6.stat | 10 + php4DelphiD6_Icon.ico | Bin 0 -> 766 bytes php4DelphiD7.dpk | 19 +- php4DelphiD7.dproj | 123 + php4DelphiD7.dproj.local | 2 + php4DelphiD7.stat | 10 + php4DelphiD7_Icon.ico | Bin 0 -> 766 bytes php4DelphiR2005.dpk | 29 +- php4DelphiR2005.dproj | 123 + php4DelphiR2005.dproj.local | 2 + php4DelphiR2005.stat | 10 + php4DelphiR2005_Icon.ico | Bin 0 -> 766 bytes php4DelphiR2006.bdsproj | 833 ++- php4DelphiR2006.dpk | 19 +- php4DelphiR2006.dproj | 123 + php4DelphiR2006.dproj.local | 2 + php4DelphiR2006.stat | 10 + php4DelphiR2006_Icon.ico | Bin 0 -> 766 bytes php4DelphiR2007.bpl | Bin 0 -> 174592 bytes php4DelphiR2007.dpk | 51 + php4DelphiR2007.dproj | 123 + php4DelphiR2007.dproj.local | 2 + php4DelphiR2007.res | Bin 0 -> 1556 bytes php4DelphiR2007.stat | 10 + php4DelphiR2007_Icon.ico | Bin 0 -> 766 bytes php4DelphiR2009.dpk | 51 + php4DelphiR2009.dproj | 110 + php4DelphiR2009.dproj.local | 2 + php4DelphiR2009.res | Bin 0 -> 4396 bytes php4DelphiR2009.stat | 10 + php4DelphiR2009_Icon.ico | Bin 0 -> 4286 bytes php4DelphiR2010.dpk | 51 + php4DelphiR2010.dproj | 492 ++ php4DelphiR2010.dproj.local | 6 + php4DelphiR2010.identcache | Bin 0 -> 556 bytes php4DelphiR2010.res | Bin 0 -> 4876 bytes php4DelphiR2010.stat | 10 + php4DelphiR2010_Icon.ico | Bin 0 -> 4286 bytes php4DelphiR5.dpk | 31 +- php4DelphiR5.dproj | 136 + php4DelphiR5.dproj.local | 2 + php4DelphiR5.identcache | Bin 0 -> 556 bytes php4DelphiR5.res | Bin 1536 -> 1484 bytes php4DelphiR5.stat | 10 + php4DelphiR5_Icon.ico | Bin 0 -> 766 bytes php4DelphiR6.dpk | 33 +- php4DelphiR6.dproj | 123 + php4DelphiR6.dproj.local | 2 + php4DelphiR6.stat | 10 + php4DelphiR6_Icon.ico | Bin 0 -> 766 bytes php4DelphiR7.dpk | 29 +- php4DelphiR7.dproj | 123 + php4DelphiR7.dproj.local | 2 + php4DelphiR7.stat | 10 + php4DelphiR7_Icon.ico | Bin 0 -> 766 bytes php4DelphiReg.pas | 419 +- php4DelphiWeb.pas | 167 +- php4delphi.dcr | Bin 6800 -> 8492 bytes php4delphi.pas | 2890 +++++---- phpAbout.dfm | 2466 ++++---- phpAbout.pas | 223 +- phpApp.pas | 112 +- phpClass.pas | 2296 +++---- phpCustomLibrary.pas | 373 +- phpModules.pas | 1564 ++--- phpWeb.pas | 246 +- readme.txt | 109 +- zend_dynamic_array.pas | 156 +- 624 files changed, 53885 insertions(+), 16311 deletions(-) create mode 100644 Clear.bat create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dti create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dti create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Class demo/test_class.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dti create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/readme.txt create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/readme.txt create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dti create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Math/test_math.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarptest.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dti create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/Resources/test_resource.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/css/CREDITS create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/css/EXPERIMENTAL create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/css/css.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/php class/test_class.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dti create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/phpDLL/testdll.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.res create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/reference/testref.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/skeleton/CREDITS create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/skeleton/EXPERIMENTAL create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.bdsproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/skeleton.php create mode 100644 Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/test_skeleton.php create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.res create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dti create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.res create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dti create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.res create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dti create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.res create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dti create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.res create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dti create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/Tutorial/Step.06/test_script.php create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/App.ico create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.cs create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.resx create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/app.config create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/test.php create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.cpp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.h create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.cpp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsw create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.sln create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.vcproj create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/test.php create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.cpp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.h create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.cpp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsw create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/test.php create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.pas create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.resx create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.Standard.pas create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.dpr create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.res create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.res create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi/result.txt create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Delphi/test.php create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/MS Word/Doc1.doc create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/MS Word/test.php create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi.sln create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/Form1.frm create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/MSSCCPRJ.SCC create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbp create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbw create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_module.bas create mode 100644 Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/test.php create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Components/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/phpShellLibrary.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Encryption/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Encryption/std.encryption.class.inc create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Graph/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpISAPITest.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.bdsproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dti create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Logo/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Logo/egg.gif create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/php_thread.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/array demo/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/console/test.php create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.RES create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.rc create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/php.gif create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/test.php create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend1.gif create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend2.gif create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample2/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample3/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample4/WindowsXP.res create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.ddp create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.dfm create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.pas create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dpr create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dproj create mode 100644 Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.res create mode 100644 Demos/Bonus/JpegConverter/php_jpeg.bdsproj create mode 100644 Demos/Bonus/PHPEncoder/phpencoder.bdsproj create mode 100644 Demos/Bonus/phpRegistry/php_registry.dproj create mode 100644 Demos/Bonus/phpRegistry/php_registry.dproj.local create mode 100644 Demos/Bonus/phpRegistry/php_registry.identcache create mode 100644 Demos/Bonus/phpRegistry/php_registry.stat create mode 100644 Demos/Bonus/wincon/test_wincon.php create mode 100644 Demos/Delphi4PHP/DesignIDE/d4pide.dpr create mode 100644 Demos/Delphi4PHP/DesignIDE/readme.txt create mode 100644 Demos/Extensions/Borland Demo/Unit1.ddp create mode 100644 Demos/Extensions/Borland Demo/borland_demo.dproj create mode 100644 Demos/Extensions/Borland Demo/borland_demo.dproj.local create mode 100644 Demos/Extensions/Borland Demo/borland_demo.identcache create mode 100644 Demos/Extensions/Borland Demo/borland_demo.stat create mode 100644 Demos/Extensions/Borland Demo/borland_demo_Icon.ico create mode 100644 Demos/Extensions/Class demo/class_demo.bdsproj create mode 100644 Demos/Extensions/Class demo/dm_Class.ddp create mode 100644 Demos/Extensions/Delphi Class 1/delphi_class.bdsproj create mode 100644 Demos/Extensions/Delphi Class 2/delphi_class2.bdsproj create mode 100644 Demos/Extensions/Math/delphi_math.bdsproj create mode 100644 Demos/Extensions/Read array parameters/Unit1.ddp create mode 100644 Demos/Extensions/Read array parameters/Unit1.dfm create mode 100644 Demos/Extensions/Read array parameters/Unit1.pas create mode 100644 Demos/Extensions/Read array parameters/rarp.bdsproj create mode 100644 Demos/Extensions/Read array parameters/rarp.dpr create mode 100644 Demos/Extensions/Read array parameters/rarp.res create mode 100644 Demos/Extensions/Read array parameters/rarptest.php create mode 100644 Demos/Extensions/Resources/res_ext.bdsproj create mode 100644 Demos/Extensions/array result/Unit1.ddp create mode 100644 Demos/Extensions/array result/rarray.bdsproj create mode 100644 Demos/Extensions/array result/rarray.dproj create mode 100644 Demos/Extensions/array result/rarray.dproj.local create mode 100644 Demos/Extensions/array result/rarray.identcache create mode 100644 Demos/Extensions/array result/rarray.stat create mode 100644 Demos/Extensions/array result/rarray_Icon.ico create mode 100644 Demos/Extensions/css/css.bdsproj create mode 100644 Demos/Extensions/css/css.dproj create mode 100644 Demos/Extensions/css/css.dproj.local create mode 100644 Demos/Extensions/css/css.identcache create mode 100644 Demos/Extensions/css/css.res create mode 100644 Demos/Extensions/css/css.stat create mode 100644 Demos/Extensions/php class/php_class.bdsproj create mode 100644 Demos/Extensions/phpDLL/Unit1.ddp create mode 100644 Demos/Extensions/phpDLL/phpDLL.bdsproj create mode 100644 Demos/Extensions/reference/Unit1.ddp create mode 100644 Demos/Extensions/reference/php_ref.bdsproj create mode 100644 Demos/Extensions/skeleton/skeleton.bdsproj create mode 100644 Demos/Extensions/skeleton/skeleton.dproj create mode 100644 Demos/Tutorial/Step.01/Unit1.ddp create mode 100644 Demos/Tutorial/Step.02/Unit1.ddp create mode 100644 Demos/Tutorial/Step.03/Unit1.ddp create mode 100644 Demos/Tutorial/Step.04/Unit1.ddp create mode 100644 Demos/Tutorial/Step.05/Project1.dproj create mode 100644 Demos/Tutorial/Step.05/Unit1.ddp create mode 100644 Demos/php4Applications/Delphi/Project1.bdsproj create mode 100644 Demos/php4Applications/Delphi/Unit1.ddp create mode 100644 Demos/php4Applications/Delphi/result.txt create mode 100644 Demos/psvPHP/Components/ComponentsDemo.bdsproj create mode 100644 Demos/psvPHP/Components/Unit1.ddp create mode 100644 Demos/psvPHP/Components/WindowsXP.res create mode 100644 Demos/psvPHP/Custom Library/DemoMain.dfm create mode 100644 Demos/psvPHP/Custom Library/DemoMain.pas create mode 100644 Demos/psvPHP/Custom Library/ExtDemo.bdsproj create mode 100644 Demos/psvPHP/Custom Library/ExtDemo.dpr create mode 100644 Demos/psvPHP/Custom Library/ExtDemo.res create mode 100644 Demos/psvPHP/Custom Library/WindowsXP.res create mode 100644 Demos/psvPHP/Encryption/WindowsXP.res create mode 100644 Demos/psvPHP/Graph/Unit1.ddp create mode 100644 Demos/psvPHP/Graph/WindowsXP.res create mode 100644 Demos/psvPHP/ISAPI Module/dmEngine.ddp create mode 100644 Demos/psvPHP/ISAPI Module/dmEngine.dfm create mode 100644 Demos/psvPHP/ISAPI Module/dmEngine.pas create mode 100644 Demos/psvPHP/ISAPI Module/dmMain.ddp create mode 100644 Demos/psvPHP/ISAPI Module/dmMain.dfm create mode 100644 Demos/psvPHP/ISAPI Module/dmMain.pas create mode 100644 Demos/psvPHP/ISAPI Module/phpisapitest.bdsproj create mode 100644 Demos/psvPHP/ISAPI Module/phpisapitest.dpr create mode 100644 Demos/psvPHP/ISAPI Module/phpisapitest.res create mode 100644 Demos/psvPHP/Library demo/LibraryDemo.dpr create mode 100644 Demos/psvPHP/Library demo/LibraryDemo.res create mode 100644 Demos/psvPHP/Library demo/Unit1.ddp create mode 100644 Demos/psvPHP/Library demo/WindowsXP.res create mode 100644 Demos/psvPHP/Library demo/dm_Main.dfm create mode 100644 Demos/psvPHP/Library demo/dm_Main.dti create mode 100644 Demos/psvPHP/Library demo/dm_Main.pas create mode 100644 Demos/psvPHP/Library demo/frm_dialog.dfm create mode 100644 Demos/psvPHP/Library demo/frm_dialog.pas create mode 100644 Demos/psvPHP/Logo/WindowsXP.res create mode 100644 Demos/psvPHP/Logo/egg.gif create mode 100644 Demos/psvPHP/Multithread simple/MultithreadSample.dpr create mode 100644 Demos/psvPHP/Multithread simple/MultithreadSample.res create mode 100644 Demos/psvPHP/Multithread simple/WindowsXP.res create mode 100644 Demos/psvPHP/Multithread simple/frm_main.ddp create mode 100644 Demos/psvPHP/Multithread simple/frm_main.dfm create mode 100644 Demos/psvPHP/Multithread simple/frm_main.pas create mode 100644 Demos/psvPHP/Multithread simple/php_thread.pas create mode 100644 Demos/psvPHP/Thread Management/ManageThreads.dpr create mode 100644 Demos/psvPHP/Thread Management/ManageThreads.res create mode 100644 Demos/psvPHP/Thread Management/frm_main.dfm create mode 100644 Demos/psvPHP/Thread Management/frm_main.pas create mode 100644 Demos/psvPHP/Thread Management/php_thread.pas create mode 100644 Demos/psvPHP/Threads Library/ManageThreads.dpr create mode 100644 Demos/psvPHP/Threads Library/ManageThreads.res create mode 100644 Demos/psvPHP/Threads Library/frm_main.ddp create mode 100644 Demos/psvPHP/Threads Library/frm_main.dfm create mode 100644 Demos/psvPHP/Threads Library/frm_main.pas create mode 100644 Demos/psvPHP/Threads Library/php_thread.pas create mode 100644 Demos/psvPHP/array demo/Project1.bdsproj create mode 100644 Demos/psvPHP/array demo/Unit1.ddp create mode 100644 Demos/psvPHP/array demo/WindowsXP.res create mode 100644 Demos/psvPHP/sample1/Sample1.bdsproj create mode 100644 Demos/psvPHP/sample1/Sample1.dpr create mode 100644 Demos/psvPHP/sample1/Sample1.dproj create mode 100644 Demos/psvPHP/sample1/Sample1.res create mode 100644 Demos/psvPHP/sample1/Thumbs.db create mode 100644 Demos/psvPHP/sample1/WindowsXP.res create mode 100644 Demos/psvPHP/sample1/frm_phpDemo.ddp create mode 100644 Demos/psvPHP/sample1/frm_phpDemo.dfm create mode 100644 Demos/psvPHP/sample1/frm_phpDemo.pas create mode 100644 Demos/psvPHP/sample2/Sample2.bdsproj create mode 100644 Demos/psvPHP/sample2/Sample2.dpr create mode 100644 Demos/psvPHP/sample2/Sample2.res create mode 100644 Demos/psvPHP/sample3/Sample3.dpr create mode 100644 Demos/psvPHP/sample3/Sample3.res create mode 100644 Demos/psvPHP/sample3/Unit1.ddp create mode 100644 Demos/psvPHP/sample3/WindowsXP.res create mode 100644 Demos/psvPHP/sample4/WindowsXP.res create mode 100644 Documentation/Delphi 7/php4delphid7.als create mode 100644 Documentation/Delphi 7/php4delphid7.cnt create mode 100644 Documentation/Delphi 7/php4delphid7.hlp create mode 100644 Documentation/php4Delphi.pdf create mode 100644 PHP4DelphiD2006.dproj create mode 100644 PHP4DelphiD2006.dproj.local create mode 100644 PHP4DelphiD2006.stat create mode 100644 PHP4DelphiD2006_Icon.ico create mode 100644 ProjectGroup1.groupproj create mode 100644 ProjectGroup1.groupproj.local create mode 100644 ProjectGroup1_prjgroup.tvsconfig create mode 100644 php4App.dll create mode 100644 php4App.dproj create mode 100644 php4App.dproj.local create mode 100644 php4App.identcache create mode 100644 php4App.stat create mode 100644 php4App_Icon.ico create mode 100644 php4Applications/PHP 4.4.6/php4App.dll create mode 100644 php4Applications/PHP 5.2.11/php4App.dll create mode 100644 php4Applications/PHP 5.3.0/php4App.dll create mode 100644 php4DelphiD2005.dproj create mode 100644 php4DelphiD2005.dproj.local create mode 100644 php4DelphiD2005.stat create mode 100644 php4DelphiD2005_Icon.ico create mode 100644 php4DelphiD2007.dpk create mode 100644 php4DelphiD2007.dproj create mode 100644 php4DelphiD2007.dproj.local create mode 100644 php4DelphiD2007.res create mode 100644 php4DelphiD2007.stat create mode 100644 php4DelphiD2007_Icon.ico create mode 100644 php4DelphiD2009.dpk create mode 100644 php4DelphiD2009.dproj create mode 100644 php4DelphiD2009.dproj.local create mode 100644 php4DelphiD2009.res create mode 100644 php4DelphiD2009.stat create mode 100644 php4DelphiD2009_Icon.ico create mode 100644 php4DelphiD2010.dpk create mode 100644 php4DelphiD2010.dproj create mode 100644 php4DelphiD2010.dproj.local create mode 100644 php4DelphiD2010.identcache create mode 100644 php4DelphiD2010.res create mode 100644 php4DelphiD2010.stat create mode 100644 php4DelphiD2010_Icon.ico create mode 100644 php4DelphiD5.dproj create mode 100644 php4DelphiD5.dproj.local create mode 100644 php4DelphiD5.stat create mode 100644 php4DelphiD5_Icon.ico create mode 100644 php4DelphiD6.dproj create mode 100644 php4DelphiD6.dproj.local create mode 100644 php4DelphiD6.stat create mode 100644 php4DelphiD6_Icon.ico create mode 100644 php4DelphiD7.dproj create mode 100644 php4DelphiD7.dproj.local create mode 100644 php4DelphiD7.stat create mode 100644 php4DelphiD7_Icon.ico create mode 100644 php4DelphiR2005.dproj create mode 100644 php4DelphiR2005.dproj.local create mode 100644 php4DelphiR2005.stat create mode 100644 php4DelphiR2005_Icon.ico create mode 100644 php4DelphiR2006.dproj create mode 100644 php4DelphiR2006.dproj.local create mode 100644 php4DelphiR2006.stat create mode 100644 php4DelphiR2006_Icon.ico create mode 100644 php4DelphiR2007.bpl create mode 100644 php4DelphiR2007.dpk create mode 100644 php4DelphiR2007.dproj create mode 100644 php4DelphiR2007.dproj.local create mode 100644 php4DelphiR2007.res create mode 100644 php4DelphiR2007.stat create mode 100644 php4DelphiR2007_Icon.ico create mode 100644 php4DelphiR2009.dpk create mode 100644 php4DelphiR2009.dproj create mode 100644 php4DelphiR2009.dproj.local create mode 100644 php4DelphiR2009.res create mode 100644 php4DelphiR2009.stat create mode 100644 php4DelphiR2009_Icon.ico create mode 100644 php4DelphiR2010.dpk create mode 100644 php4DelphiR2010.dproj create mode 100644 php4DelphiR2010.dproj.local create mode 100644 php4DelphiR2010.identcache create mode 100644 php4DelphiR2010.res create mode 100644 php4DelphiR2010.stat create mode 100644 php4DelphiR2010_Icon.ico create mode 100644 php4DelphiR5.dproj create mode 100644 php4DelphiR5.dproj.local create mode 100644 php4DelphiR5.identcache create mode 100644 php4DelphiR5.stat create mode 100644 php4DelphiR5_Icon.ico create mode 100644 php4DelphiR6.dproj create mode 100644 php4DelphiR6.dproj.local create mode 100644 php4DelphiR6.stat create mode 100644 php4DelphiR6_Icon.ico create mode 100644 php4DelphiR7.dproj create mode 100644 php4DelphiR7.dproj.local create mode 100644 php4DelphiR7.stat create mode 100644 php4DelphiR7_Icon.ico diff --git a/Clear.bat b/Clear.bat new file mode 100644 index 0000000..235952d --- /dev/null +++ b/Clear.bat @@ -0,0 +1 @@ +del *.dcu diff --git a/DelphiFunctions.pas b/DelphiFunctions.pas index fc4cc61..3bfcaef 100644 --- a/DelphiFunctions.pas +++ b/DelphiFunctions.pas @@ -1,1181 +1,56 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: DelphiFunctions.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit DelphiFunctions; - -interface -uses - Windows, SysUtils, Classes, - Controls, - ZendTypes, ZendAPI, PHPTypes, PHPAPI, Dialogs, ShellAPI, typinfo, - {$IFDEF VERSION7} - ActiveX, - ObjComAuto, - {$ENDIF} - Forms, stdctrls; - - -{$IFDEF VERSION7} -{$METHODINFO ON} -type - TPHPScriptableObject = class(TObjectDispatch) - private - FRetValue : Variant; - FInstanceObj : TObject; - public - function NameToDispID(const AName: string): TDispID; - function Invoke2(dispidMember: TDispID; wFlags: Word; - var pdispparams: TDispParams; Res: PVariant): PVariant; - function GetPropertyByID(ID: TDispID): PVariant; - procedure SetPropertyByID(ID: TDispID; const Prop: array of const); - function CallMethod(ID: TDispID; const Args : array of variant; - NeedResult: Boolean): PVariant; - property InstanceObj : TObject read FInstanceObj write FInstanceObj; - end; -{$METHODINFO OFF} -{$ENDIF} - -var - DelphiTable : array [0..12] of zend_function_entry; - - - object_functions : array[0..2] of zend_function_entry; - author_functions : array[0..2] of zend_function_entry; - - DelphiObject : pzend_class_entry; - ce : pzend_class_entry; - - {$IFDEF PHP5} - DelphiObjectHandlers : zend_object_handlers; - {$ENDIF} - -procedure InitDelphiFunctions; - -procedure RegisterInternalClasses(p : pointer); - - -const - SimpleProps = [tkInteger, tkChar, tkEnumeration, tkFloat, - tkString, tkWChar, tkLString, tkWString, tkVariant]; - -implementation - - - -//proto string delphi_get_system_directory(void) -{$IFDEF PHP510} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - Dir: array[0..MAX_PATH] of Char; - p : pchar; -begin - GetSystemDirectory(Dir, MAX_PATH); - p := dir; - p := p; - ZVAL_STRING(return_value, p, true); -end; - -//proto string delphi_str_date(void) -{$IFDEF PHP510} -procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - ZVAL_STRING(return_value, PChar(DateToStr(Date)), true); -end; - -//proto float delphi_date(void) -{$IFDEF PHP510} -procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - ZVAL_DOUBLE(return_value, Date); -end; - -//proto string delphi_extract_file_dir(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - Param : pzval_array; - P : PChar; -begin - if ( not (zend_get_parameters_ex(1, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - convert_to_string(param[0]^); - p := PChar(ExtractFileDir(param[0]^.value.str.val)); - ZVAL_STRING(return_value, p, true); - dispose_pzval_array(Param); -end; - -//proto string delphi_extract_file_drive(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - Param : pzval_array; - P : PChar; -begin - if ( not (zend_get_parameters_ex(1, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - convert_to_string(param[0]^); - p := PChar(ExtractFileDrive(param[0]^.value.str.val)); - ZVAL_STRING(return_value, p, true); - dispose_pzval_array(Param); -end; - -//proto string delphi_extract_file_name(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - Param : pzval_array; - P : PChar; -begin - if ( not (zend_get_parameters_ex(1, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - convert_to_string(param[0]^); - p := PChar(ExtractFileName(param[0]^.value.str.val)); - ZVAL_STRING(return_value, p, true); - dispose_pzval_array(Param); -end; - -//proto string delphi_extract_file_ext(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - Param : pzval_array; - P : PChar; -begin - if ( not (zend_get_parameters_ex(1, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - convert_to_string(param[0]^); - p := PChar(ExtractFileExt(param[0]^.value.str.val)); - ZVAL_STRING(return_value, p, true); - dispose_pzval_array(Param); -end; - -//proto void delphi_show_message(string message) -{$IFDEF PHP510} -procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - Param : pzval_array; - P : PChar; -begin - if ( not (zend_get_parameters_ex(1, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - convert_to_string(param[0]^); - p := param[0]^.value.str.val; - ShowMessage(P); - dispose_pzval_array(Param); -end; - -//proto string delphi_input_box(string caption, string prompt, string default) -{$IFDEF PHP510} -procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; - this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - Param : pzval_array; - Caption, Prompt, Default : string; - P : PChar; -begin - if ( not (zend_get_parameters_ex(3, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - convert_to_string(param[0]^); - convert_to_string(param[1]^); - convert_to_string(param[2]^); - Caption := param[0]^.value.str.val; - Prompt := param[1]^.value.str.val; - Default := param[2]^.value.str.val; - p := PChar(InputBox(Caption, Prompt, Default)); - ZVAL_STRING(return_value, PChar(p), true); - dispose_pzval_array(Param); -end; - -//proto void delphi_send_message(void) -{$IFDEF PHP510} -procedure delphi_send_email(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_send_email(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - ShellExecute(0, 'open', 'mailto:serge_perevoznyk@hotmail.com', nil, nil, SW_SHOWNORMAL); -end; - -//proto void delphi_visit_homepage(void) -{$IFDEF PHP510} -procedure delphi_visit_homepage(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_visit_homepage(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - ShellExecute(0, 'open', 'http://users.chello.be/ws36637', nil, nil, SW_SHOW); -end; - - -//Delphi objects support - -{$IFDEF PHP510} -procedure delphi_object_classname(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_object_classname(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - OBJ : TObject; - data: ^ppzval; - P : string; -begin - new(data); - {$IFDEF PHP5} - zend_hash_find(this_ptr^.value.obj.handlers.get_properties(this_ptr, TSRMLS_DC), 'instance', strlen('instance') + 1, data); - {$ELSE} - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - {$ENDIF} - - Obj := TObject(data^^^.value.lval); - P := Obj.ClassName; - ZVAL_STRING(return_value, PChar(p), true); - freemem(data); -end; - -{$IFDEF PHP510} -procedure delphi_object_classnameis(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_object_classnameis(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - OBJ : TObject; - data: ^ppzval; - P : PChar; - Param : pzval_array; -begin - - if ( not (zend_get_parameters_ex(1, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - convert_to_string(param[0]^); - p := param[0]^.value.str.val; - new(data); - - {$IFDEF PHP5} - zend_hash_find(this_ptr^.value.obj.handlers.get_properties(this_ptr, TSRMLS_DC), 'instance', strlen('instance') + 1, data); - {$ELSE} - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - {$ENDIF} - - Obj := TObject(data^^^.value.lval); - ZVAL_BOOL(return_value,Obj.ClassNameIs(p)); - freemem(data); -end; - - - -{$IFDEF PHP4} -function delphi_set_property_handler(property_reference : Pzend_property_reference; value : pzval) : integer; cdecl; -var - this_ptr : pzval; - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - propname : string; - pt : TTypeKind; -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - SetPropValue(OBJ, propname, zval2variant(value^)) - else - if pt = tkClass then - begin - Obj := GetObjectProp(Obj, propname); - while element <> nil do - begin - element := element^.prev; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - begin - SetPropValue(OBJ, propname, zval2variant(value^)); - break; - end - else - if pt = tkClass then - Obj := GetObjectProp(Obj, propname); - end; - end; - - Result := SUCCESS; -end; - - - -procedure delphi_get_property_handler(val : pzval; property_reference : PZend_property_reference); cdecl; -var - this_ptr : pzval; - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - propname : string; - pt : TTypeKind; -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - variant2zval(GetPropValue(OBJ, propname), val) - else - if pt = tkClass then - begin - Obj := GetObjectProp(Obj, propname); - while element <> nil do - begin - element := element^.prev; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - begin - variant2zval(GetPropValue(OBJ, propname), val); - break; - end - else - if pt = tkClass then - Obj := GetObjectProp(Obj, propname); - end; - end; -end; - - - -procedure _delphi_get_property_wrapper; assembler; -asm - push ebp - mov ebp,esp - sub esp,50h - push ebx - push esi - push edi - lea edi,[ebp-50h] - mov ecx,14h - mov eax,0CCCCCCCCh - rep stosd - mov eax,dword ptr [ebp+0Ch] - push eax - lea ecx,[ebp-10h] - push ecx - call delphi_get_property_handler - add esp,8 - mov edx,dword ptr [ebp+8] - mov eax,dword ptr [ebp-10h] - mov dword ptr [edx],eax - mov ecx,dword ptr [ebp-0Ch] - mov dword ptr [edx+4],ecx - mov eax,dword ptr [ebp-8] - mov dword ptr [edx+8],eax - mov ecx,dword ptr [ebp-4] - mov dword ptr [edx+0Ch],ecx - mov eax,dword ptr [ebp+8] - - pop edi - pop esi - pop ebx - add esp,50h - cmp ebp,esp - mov esp,ebp - pop ebp - ret -end; - - -procedure delphi_call_function(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; -var - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - MethodName : string; - Params : pzval_array; - M, D : integer; -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - MethodName := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - if ( Obj.InheritsFrom(TCustomEdit) ) then - begin - if SameText(MethodName, 'Clear') then - TCustomEdit(Obj).Clear; - if SameText(MethodName, 'ClearSelection') then - TCustomEdit(Obj).ClearSelection; - if SameText(MethodName, 'CopyToClipboard') then - TCustomEdit(Obj).CopyToClipboard; - if SameText(MethodName, 'ControlCount') then - ZVAL_LONG(return_value, TCustomEdit(Obj).ControlCount); - if SameText(MethodName, 'ScaleBy') then - begin - if ht > 0 then - begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - end; - M := Params[0]^.value.lval; - D := Params[1]^.value.lval; - TCustomEdit(Obj).ScaleBy(M, D); - dispose_pzval_array(Params); - end; - end; -end; -{$ENDIF} - - - -{$IFDEF PHP5} - -// Read object property value (getter) -function delphi_get_property_handler(_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; -var - retval : pzval; - OBJ : TObject; - data: ^ppzval; - propname : string; - object_properties : PHashTable; - {$IFDEF VERSION7} - Scripter : TPHPScriptableObject; - V : Variant; - {$ELSE} - pt : TTypeKind; - _property : PChar; - {$ENDIF} -begin - retval := emalloc(sizeof(zval)); - FillChar(retval^, sizeof(zval), 0); - propname := member^.value.str.val; - new(data); - try - object_properties := Z_OBJPROP(_object^); - if zend_hash_find(object_properties, 'instance', strlen('instance') + 1, data) = SUCCESS then - Obj := TObject(data^^^.value.lval) - else - Obj := nil; - finally - freemem(data); - end; - - if Assigned(Obj) then - begin - {$IFDEF VERSION7} - Scripter := TPHPScriptableObject(Obj); - V := Scripter.GetPropertyByID(Scripter.NameToDispID(propName))^; - variant2zval(V, retval); - {$ELSE} - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - variant2zval(GetPropValue(OBJ, propname), retval) - else - if pt = tkClass then - begin - Obj := GetObjectProp(Obj, propname); - retval._type := IS_OBJECT; - object_init(retval, DelphiObject, TSRMLS_DC); - _property := 'instance'; - add_property_long_ex(retval, _property, strlen(_property) + 1, Integer(Obj), TSRMLS_DC); - retval.value.obj.handlers := @DelphiObjectHandlers; - end; - {$ENDIF} - end; - Result := retval; -end; - -// Write object property value (setter) -procedure delphi_set_property_handler(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; -var - OBJ : TObject; - data: ^ppzval; - propname : string; - object_properties : PHashTable; -{$IFDEF VERSION7} - Scripter : TPHPScriptableObject; -{$ELSE} - pt : TypInfo.TTypeKind; -{$ENDIF} - -begin - propname := member^.value.str.val; - new(data); - try - object_properties := Z_OBJPROP(_object^); - if zend_hash_find(object_properties, 'instance', strlen('instance') + 1, data) = SUCCESS then - Obj := TObject(data^^^.value.lval) - else - Obj := nil; - finally - freemem(data); - end; - - if Assigned(Obj) then - begin - {$IFDEF VERSION7} - Scripter := TPHPScriptableObject(Obj); - if SameText('Parent', propname) then - begin - TWinControl(Scripter.InstanceObj).Parent := TWinControl(value^.value.lval); - end - else - Scripter.SetPropertyByID(Scripter.NameToDispID(propname), [zval2variant(value^)] ); - {$ELSE} - pt := TypInfo.PropType(Obj, propname); - if ( pt in SimpleProps) then - SetPropValue(OBJ, propname, zval2variant(value^)) - {$ENDIF} - end; -end; - -{$IFDEF PHP510} -function delphi_call_method(method : pchar; ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; -{$ELSE} -function delphi_call_method(method : pchar; ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; -{$ENDIF} -{$IFDEF VERSION7} -var - OBJ : TObject; - data: ^ppzval; - Params : pzval_array; - Scripter : TPHPScriptableObject; - ValArray : array of Variant; - I : integer; - V : variant; -{$ENDIF} -begin - {$IFDEF VERSION7} - new(data); - if zend_hash_find(this_ptr^.value.obj.handlers.get_properties(this_ptr, TSRMLS_DC), 'instance', strlen('instance') + 1, data) = SUCCESS then - Obj := TObject(data^^^.value.lval) - else - Obj := nil; - freemem(data); - if Obj <> nil then - begin - Scripter := TPHPScriptableObject(Obj); - if ht > 0 then - begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Result := FAILURE; - Exit; - end; - end; - - SetLength(ValArray, ht); - for I := 0 to ht - 1 do - ValArray[i] := zval2variant(Params[i]^^); - V := Scripter.CallMethod(Scripter.NameToDispID(method), ValArray, true)^; - variant2zval(V, return_value); - dispose_pzval_array(Params); - - end; - {$ENDIF} - result := SUCCESS; -end; - -function delphi_get_method(_object : pzval; method_name : pchar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; -var - fnc : pZendFunction; -begin - fnc := emalloc(sizeof(TZendFunction)); - FillChar(fnc^, sizeOf(TZendFunction), 0); - fnc^.internal_function._type := ZEND_OVERLOADED_FUNCTION; - fnc^.internal_function.function_name := estrndup(method_name, method_len); - fnc^.internal_function.handler := @delphi_call_method; - result := fnc; -end; - - -{$ENDIF} - -{$IFDEF PHP510} -procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - properties : array[0..3] of pchar; -begin - properties[0] := 'name'; - properties[1] := 'last'; - properties[2] := 'height'; - properties[3] := 'email'; - {$IFDEF PHP4} - _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); - {$ELSE} - object_init(return_value, ce, TSRMLS_DC ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1); - {$ELSE} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1, TSRMLS_DC); - {$ENDIF} - - {$IFDEF PHP5} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); - {$ELSE} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); - {$ENDIF} - - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1); - {$ELSE} - add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1, TSRMLS_DC); - {$ENDIF} -end; - - - - -{$IFDEF PHP510} -procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - _property : pchar; - Param : pzval_array; - Obj : TObject; -{$IFDEF VERSION7} - Scripter : TPHPScriptableObject; -{$ENDIF} -begin - - if ( not (zend_get_parameters_ex(1, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - - Obj := TObject(Param[0]^.value.lval); - {$IFDEF VERSION7} - Scripter := TPHPScriptableObject.Create(Obj, false); - Scripter.InstanceObj := Obj; - Obj := Scripter; - {$ENDIF} - _property := 'instance'; - - return_value._type := IS_OBJECT; - {$IFDEF PHP4} - _object_init_ex(return_value, DelphiObject, nil, 0, TSRMLS_DC ); - {$ELSE} - object_init(return_value, DelphiObject, TSRMLS_DC); - {$ENDIF} - - {$IFDEF PHP5} - add_property_long_ex(return_value, _property, strlen(_property) + 1, Integer(Obj), TSRMLS_DC); - {$ELSE} - add_property_long_ex(return_value, _property, strlen(_property) + 1, Integer(Obj)); - {$ENDIF} - - {$IFDEF PHP5} - return_value.value.obj.handlers := @DelphiObjectHandlers; - {$ENDIF} - - dispose_pzval_array(Param); - -end; - -{$IFDEF PHP510} -procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - _property : pchar; - Param : pzval_array; - Obj : TObject; - ObjName : string; - php : TComponent; - gl : psapi_globals_struct; - p : pointer; - Form : TCustomForm; -{$IFDEF VERSION7} - Scripter : TPHPScriptableObject; -{$ENDIF} -begin - if ( not (zend_get_parameters_ex(1, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - ObjName := Param[0]^.value.str.val; - - p := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(p); - php := TComponent(gl^.server_context); - if not Assigned(php) then - begin - ZVAL_NULL(return_value); - exit; - end; - - Form := TCustomForm(php.Owner); - if not Assigned(Form) then - begin - ZVAL_NULL(return_value); - exit; - end; - - if SameText(Form.Name, ObjName) then - Obj := Form - else - OBJ := Form.FindComponent(ObjName); - if not Assigned(Obj) then - begin - ZVAL_NULL(return_value); - exit; - end; - - {$IFDEF VERSION7} - Scripter := TPHPScriptableObject.Create(Obj, false); - Obj := Scripter; - {$ENDIF} - _property := 'instance'; - {$IFDEF PHP4} - _object_init_ex(return_value, DelphiObject, nil, 0, TSRMLS_DC ); - {$ELSE} - object_init(return_value, DelphiObject, TSRMLS_DC); - {$ENDIF} - - {$IFDEF PHP5} - add_property_long_ex(return_value, _property, strlen(_property) + 1, Integer(Obj), TSRMLS_DC); - {$ELSE} - add_property_long_ex(return_value, _property, strlen(_property) + 1, Integer(Obj)); - {$ENDIF} - - {$IFDEF PHP5} - return_value.value.obj.handlers := @DelphiObjectHandlers; - {$ENDIF} - - dispose_pzval_array(Param); - -end; - - - -procedure InitDelphiFunctions; -begin - PHP_FUNCTION(DelphiTable[0], 'delphi_date', @delphi_date); - PHP_FUNCTION(DelphiTable[1], 'delphi_extract_file_dir', @delphi_extract_file_dir); - PHP_FUNCTION(DelphiTable[2], 'delphi_extract_file_drive', @delphi_extract_file_drive); - PHP_FUNCTION(DelphiTable[3], 'delphi_extract_file_name', @delphi_extract_file_name); - - DelphiTable[4].fname := 'delphi_extract_file_ext'; - DelphiTable[4].handler := @delphi_extract_file_ext; - {$IFDEF PHP4} - DelphiTable[4].func_arg_types := nil; - {$ELSE} - DelphiTable[4].arg_info := nil; - {$ENDIF} - - DelphiTable[5].fname := 'delphi_show_message'; - DelphiTable[5].handler := @delphi_show_message; - {$IFDEF PHP4} - DelphiTable[5].func_arg_types := nil; - {$ELSE} - DelphiTable[5].arg_info := nil; - {$ENDIF} - - DelphiTable[6].fname := 'register_delphi_object'; - delphitable[6].handler := @register_delphi_object; - {$IFDEF PHP4} - DelphiTable[6].func_arg_types := nil; - {$ELSE} - DelphiTable[6].arg_info := nil; - {$ENDIF} - - DelphiTable[7].fname := 'delphi_get_author'; - DelphiTable[7].handler := @delphi_get_author; - {$IFDEF PHP4} - DelphiTable[7].func_arg_types := nil; - {$ELSE} - DelphiTable[7].arg_info := nil; - {$ENDIF} - - DelphiTable[8].fname := 'delphi_str_date'; - DelphiTable[8].handler := @delphi_str_date; - {$IFDEF PHP4} - DelphiTable[8].func_arg_types := nil; - {$ELSE} - DelphiTable[8].arg_info := nil; - {$ENDIF} - - - PHP_FUNCTION(DelphiTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); - - - PHP_FUNCTION(DelphiTable[10], 'delphi_input_box', @delphi_input_box); - PHP_FUNCTION(DelphiTable[11], 'register_delphi_component', @register_delphi_component); - DelphiTable[12].fname := nil; - DelphiTable[12].handler := nil; -end; - - - -procedure RegisterInternalClasses(p : pointer); -var - author_class_entry : Tzend_class_entry; - delphi_object_entry : TZend_class_entry; - -begin - object_functions[0].fname := 'delphi_classname'; - object_functions[0].handler := @delphi_object_classname; - object_functions[1].fname := 'delphi_classnameis'; - object_functions[1].handler := @delphi_object_classnameis; - INIT_CLASS_ENTRY(delphi_object_entry, 'delphi_class' , @object_functions); - {$IFDEF PHP4} - Delphi_Object_Entry.handle_property_get := @_delphi_get_property_wrapper; - Delphi_Object_Entry.handle_property_set := @delphi_set_property_handler; - Delphi_Object_Entry.handle_function_call := @delphi_call_function; - {$ELSE} - Move(zend_get_std_object_handlers()^, DelphiObjectHandlers, sizeof(zend_object_handlers)); - DelphiObjectHandlers.read_property := @delphi_get_property_handler; - DelphiObjecthandlers.write_property := @delphi_set_property_handler; - DelphiObjectHandlers.call_method := @delphi_call_method; - DelphiObjectHandlers.get_method := @delphi_get_method; - {$ENDIF} - DelphiObject := zend_register_internal_class(@delphi_object_entry, p); - - author_functions[0].fname := 'send_email'; - author_functions[0].handler := @delphi_send_email; - author_functions[1].fname := 'visit_homepage'; - author_functions[1].handler := @delphi_visit_homepage; - INIT_CLASS_ENTRY(author_class_entry, 'php4delphi_author', @author_functions); - ce := zend_register_internal_class(@author_class_entry, p); - -end; - -{$IFDEF VERSION7} - -{ -Delphi scripting support - -The Original Code is: JvOle2Auto.PAS, released on 2002-07-04. - -The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev -Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev -Copyright (c) 2001,2002 SGB Software -All Rights Reserved. -} - - -function TPHPScriptableObject.NameToDispID(const AName: string): TDispID; -var - CharBuf: array [0..255] of WideChar; - P: array [0..0] of PWideChar; -begin - StringToWideChar(AName, @CharBuf[0], 256); - P[0] := @CharBuf[0]; - GetIDsOfNames(GUID_NULL, @P, 1, GetThreadLocale, @Result); -end; - - -function TPHPScriptableObject.Invoke2(dispidMember: TDispID; wFlags: Word; - var pdispparams: TDispParams; Res: PVariant): PVariant; -var - pexcepinfo: TExcepInfo; - puArgErr: Integer; -begin - if Res <> nil then VarClear(Res^); - try - Invoke(dispidMember, GUID_NULL, GetThreadLocale, wFlags, pdispparams, Res, @pexcepinfo, @puArgErr); - except - if Res <> nil then VarClear(Res^); - raise; - end; - Result := Res; -end; - -function TPHPScriptableObject.GetPropertyByID(ID: TDispID): PVariant; -const - Disp: TDispParams = (rgvarg: nil; rgdispidNamedArgs: nil; - cArgs: 0; cNamedArgs: 0); -begin - Result := Invoke2(ID, DISPATCH_PROPERTYGET, Disp, @FRetValue); -end; - -procedure AssignVariant(var Dest: TVariantArg; const Value: TVarRec); -begin - with Value do - case VType of - vtInteger: - begin - Dest.vt := VT_I4; - Dest.lVal := VInteger; - end; - vtBoolean: - begin - Dest.vt := VT_BOOL; - Dest.vbool := VBoolean; - end; - vtChar: - begin - Dest.vt := VT_BSTR; - Dest.bstrVal := StringToOleStr(VChar); - end; - vtExtended: - begin - Dest.vt := VT_R8; - Dest.dblVal := VExtended^; - end; - vtString: - begin - Dest.vt := VT_BSTR; - Dest.bstrVal := StringToOleStr(VString^); - end; - vtPointer: - if VPointer = nil then begin - Dest.vt := VT_NULL; - Dest.byRef := nil; - end - else begin - Dest.vt := VT_BYREF; - Dest.byRef := VPointer; - end; - vtPChar: - begin - Dest.vt := VT_BSTR; - Dest.bstrVal := StringToOleStr(StrPas(VPChar)); - end; - vtObject: - begin - Dest.vt := VT_BYREF; - Dest.byRef := VObject; - end; - vtClass: - begin - Dest.vt := VT_BYREF; - Dest.byRef := VClass; - end; - vtWideChar: - begin - Dest.vt := VT_BSTR; - Dest.bstrVal := @VWideChar; - end; - vtPWideChar: - begin - Dest.vt := VT_BSTR; - Dest.bstrVal := VPWideChar; - end; - vtAnsiString: - begin - Dest.vt := VT_BSTR; - Dest.bstrVal := StringToOleStr(string(VAnsiString)); - end; - vtCurrency: - begin - Dest.vt := VT_CY; - Dest.cyVal := VCurrency^; - end; - vtVariant: - begin - Dest.vt := VT_BYREF or VT_VARIANT; - Dest.pvarVal := VVariant; - end; - vtInterface: - begin - Dest.vt := VT_UNKNOWN or VT_BYREF; - Dest.byRef := VInterface; - end; - vtInt64: - begin - Dest.vt := VT_I8 or VT_BYREF; - Dest.byRef := VInt64; - end; - end; -end; - - -procedure TPHPScriptableObject.SetPropertyByID(ID: TDispID; const Prop: array of const); -const - NameArg: TDispID = DISPID_PROPERTYPUT; -var - Disp: TDispParams; - ArgCnt, I: Integer; - Args: array[0..63] of TVariantArg; -begin - ArgCnt := 0; - try - for I := 0 to High(Prop) do begin - AssignVariant(Args[I], Prop[I]); - Inc(ArgCnt); - if ArgCnt >= 64 then Break; - end; - with Disp do begin - rgvarg := @Args; - rgdispidNamedArgs := @NameArg; - cArgs := ArgCnt; - cNamedArgs := 1; - end; - Invoke2(ID, DISPATCH_PROPERTYPUT, Disp, nil); - finally - end; -end; - - -function WashVariant(const Value: Variant): OleVariant; -begin - if TVarData(Value).VType = (varString or varByRef) then - Result := PString(TVarData(VAlue).VString)^ + '' - else - Result := Value; -end; - -function TPHPScriptableObject.CallMethod(ID: TDispID; const Args : array of variant; - NeedResult: Boolean): PVariant; -var - DispParams: TDispParams; - I: Integer; - OleArgs: array of OleVariant; -begin - SetLength(OleArgs, High(Args) + 1); - for I := Low(Args) to High(Args) do - OleArgs[I] := WashVariant(Args[I]); - DispParams.rgvarg := @OleArgs[0]; - DispParams.cArgs := High(Args) + 1; - DispParams.rgdispidNamedArgs := nil; - DispParams.cNamedArgs := 0; - if NeedResult then - Result := Invoke2(ID, DISPATCH_METHOD or DISPATCH_PROPERTYGET, DispParams, @FRetValue) - else - Result := Invoke2(ID, DISPATCH_METHOD or DISPATCH_PROPERTYGET, DispParams, nil); -end; - -initialization - OleInitialize(nil); -finalization - OleUninitialize; - -{$ENDIF} - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: DelphiFunctions.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit DelphiFunctions; + +interface +uses + SysUtils, Classes, + ZendTypes, ZendAPI, PHPTypes, PHPAPI, VCL.Dialogs; + +{$ifdef fpc} + {$mode delphi} +{$endif} + +//proto string delphi_input_box(string caption, string prompt, string default) +{$IFDEF PHP510} +procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; + this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +implementation + +//proto string delphi_input_box(string caption, string prompt, string default) +{$IFDEF PHP510} +procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; + this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var p: pzval_array; +begin +if ht <> 3 then +begin + zend_wrong_param_count(TSRMLS_DC); + exit; +end; + zend_get_parameters_my(ht, p, TSRMLS_DC); + ZVAL_STRINGW(return_value, PWideChar(InputBox( Z_STRVAL(p[0]^), Z_STRVAL(p[1]^), Z_STRVAL(p[2]^) )), true); + dispose_pzval_array(p); +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.ddp b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dfm new file mode 100644 index 0000000..adbf54b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dfm @@ -0,0 +1,246 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + OnCreate = PHPExtensionCreate + OnDestroy = PHPExtensionDestroy + Version = '0.0' + Functions = < + item + FunctionName = 'produce_page' + Tag = 0 + Parameters = < + item + Name = 'Action' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions0Execute + end + item + FunctionName = 'runquery' + Tag = 0 + Parameters = < + item + Name = 'CustNo' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions1Execute + end> + ModuleName = 'borland_demo' + Height = 640 + Width = 870 + object Customer: TTable + DatabaseName = 'Phpdemo' + SessionName = 'Session1_1' + IndexFieldNames = 'Company' + TableName = 'CUSTOMER.DB' + Left = 26 + Top = 64 + object CustomerCustNo: TFloatField + FieldName = 'CustNo' + end + object CustomerCompany: TStringField + FieldName = 'Company' + Size = 30 + end + end + object BioLife: TTable + DatabaseName = 'Phpdemo' + SessionName = 'Session1_1' + TableName = 'biolife.db' + Left = 25 + Top = 126 + object BioLifeSpeciesNo: TFloatField + FieldName = 'Species No' + end + object BioLifeCategory: TStringField + FieldName = 'Category' + Size = 15 + end + object BioLifeCommon_Name: TStringField + FieldName = 'Common_Name' + Size = 30 + end + object BioLifeSpeciesName: TStringField + FieldName = 'Species Name' + Size = 40 + end + object BioLifeLengthcm: TFloatField + FieldName = 'Length (cm)' + end + object BioLifeLength_In: TFloatField + FieldName = 'Length_In' + end + object BioLifeNotes: TMemoField + FieldName = 'Notes' + OnGetText = BioLifeNotesGetText + BlobType = ftMemo + Size = 50 + end + object BioLifeGraphic: TGraphicField + FieldName = 'Graphic' + OnGetText = BioLifeGraphicGetText + BlobType = ftGraphic + end + end + object Root: TPageProducer + HTMLDoc.Strings = ( + '' + 'PHP Example ( Former ISAPI/NSAPI/CGI Example)' + '' + '

PHP Example server

' + '

' + 'Web Examples' + '

' + 'TPageProducer using a Custom Tag
' + 'For an example of using a TPageProducer with a Custom Tag click' + + 'here. This exam' + + 'ple returns' + + 'list of all customers from the Customer.DB table. You can click' + + ' the customer'#39's' + 'name to view a listing of their orders.' + '

' + 'TDatasetPageProducer
' + + 'For an example of using the TDatasetPageProducer and of returnin' + + 'g a graphic' + + 'from a table click here. This example' + + 'makes use of the JPeg unit to display a bitmap stored in the gra' + + 'phic field of the' + 'Biolife.DB table.' + '

' + 'Server Redirect
' + + 'Click
here for a dem' + + 'onstration of' + 'how to redirect a use to an other web site.
' + '' + '' + '' + '' + ' ' + ' ') + OnHTMLTag = RootHTMLTag + Left = 26 + Top = 176 + end + object BioLifeProducer: TDataSetPageProducer + HTMLDoc.Strings = ( + '' + '' + ' Biolife Data' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Category:<#Category>
Common Name:<#Common_Name>
Notes:<#Notes>
Picture:<#Graphic>
' + '' + '' + '') + DataSet = BioLife + Left = 110 + Top = 126 + end + object CustSource: TDataSource + DataSet = Customer + Left = 90 + Top = 65 + end + object CustomerOrders: TQueryTableProducer + Caption = 'Customer Orders' + Columns = < + item + FieldName = 'OrderNo' + end + item + FieldName = 'SaleDate' + Title.Align = haCenter + end + item + FieldName = 'ShipDate' + end> + Query = Query1 + TableAttributes.Border = 1 + TableAttributes.CellSpacing = 1 + TableAttributes.CellPadding = 1 + TableAttributes.Width = 50 + Left = 170 + Top = 64 + end + object CustomerList: TPageProducer + HTMLDoc.Strings = ( + '' + '' + '' + '' + '' + 'Sample Delphi Web server application' + '' + '' + '

Customer Order Information

' + '
' + 'Click a customer name to view their orders.

' + '<#CUSTLIST>

' + '' + '' + ' ') + OnHTMLTag = CustomerListHTMLTag + Left = 118 + Top = 9 + end + object Query1: TQuery + DatabaseName = 'Phpdemo' + SessionName = 'Session1_1' + DataSource = CustSource + SQL.Strings = ( + 'SELECT *' + 'FROM ORDERS' + 'WHERE' + '(CustNo = :CustNo)') + Left = 24 + Top = 8 + ParamData = < + item + DataType = ftFloat + Name = 'CustNo' + ParamType = ptUnknown + end> + end + object Database1: TDatabase + AliasName = 'DBDEMOS' + DatabaseName = 'Phpdemo' + SessionName = 'Session1_1' + Left = 240 + Top = 200 + end + object Session1: TSession + AutoSessionName = True + Left = 164 + Top = 212 + end +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dti b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dti new file mode 100644 index 0000000..69a56ab --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1\PHPExtension1.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.pas b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.pas new file mode 100644 index 0000000..8f8f2dd --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.pas @@ -0,0 +1,244 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules, DBWeb, Db, DSProd, HTTPApp, DBTables, Graphics, JPeg, + DBBdeWeb, HTTPProd; + +type + + TPHPExtension1 = class(TPHPExtension) + Customer: TTable; + CustomerCustNo: TFloatField; + CustomerCompany: TStringField; + BioLife: TTable; + BioLifeSpeciesNo: TFloatField; + BioLifeCategory: TStringField; + BioLifeCommon_Name: TStringField; + BioLifeSpeciesName: TStringField; + BioLifeLengthcm: TFloatField; + BioLifeLength_In: TFloatField; + BioLifeNotes: TMemoField; + BioLifeGraphic: TGraphicField; + Root: TPageProducer; + BioLifeProducer: TDataSetPageProducer; + CustSource: TDataSource; + CustomerOrders: TQueryTableProducer; + CustomerList: TPageProducer; + Query1: TQuery; + Database1: TDatabase; + Session1: TSession; + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure RootHTMLTag(Sender: TObject; Tag: TTag; + const TagString: String; TagParams: TStrings; + var ReplaceText: String); + procedure CustomerListHTMLTag(Sender: TObject; Tag: TTag; + const TagString: String; TagParams: TStrings; + var ReplaceText: String); + procedure PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPExtensionCreate(Sender: TObject); + procedure BioLifeGraphicGetText(Sender: TField; var Text: String; + DisplayText: Boolean); + procedure BioLifeNotesGetText(Sender: TField; var Text: String; + DisplayText: Boolean); + procedure PHPExtensionDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + Action : string; + _redirect : PAnsiChar; + _content_type : PAnsiChar; + gl : Psapi_globals_struct; + Jpg: TJpegImage; + S: TMemoryStream; + B: TBitmap; + +begin + gl := GetSAPIGlobals; + + Action := Parameters.Values('Action'); + if Action = '' then + begin + ReturnValue := Root.Content; + Exit; + end; + + if SameText(Action, 'redirect') then + begin + _redirect := 'Location: http://www.borland.com'; + php_header_write(_redirect, strlen(_redirect) + 1, TSRMLS_DC); + gl.sapi_headers.http_response_code := 302; + Exit; + end; + + if SameText(Action, 'customerlist') then + begin + ReturnValue := CustomerList.Content; + Exit; + end; + + if SameText(Action, 'biolife') then + begin + ReturnValue := BioLifeProducer.Content; + Exit; + end; + + if SameText(Action, 'getimage') then + begin + Jpg := TJpegImage.Create; + try + B := TBitmap.Create; + try + B.Assign(BioLifeGraphic); + Jpg.Assign(B); + finally + B.Free; + end; + S := TMemoryStream.Create; + Jpg.SaveToStream(S); + S.Position := 0; + _content_type := 'Content-type: image/jpeg'; + php_header_write(_content_type, strlen(_content_type), TSRMLS_DC); + php_body_write(PAnsiChar(S.memory), S.Size, TSRMLS_DC); + S.Free; + finally + Jpg.Free; + end; + + end; + + ReturnValue := 'Unknown action: ' + Action; +end; + + + +procedure TPHPExtension1.RootHTMLTag(Sender: TObject; Tag: TTag; + const TagString: String; TagParams: TStrings; var ReplaceText: String); +var + gl : Psapi_globals_struct; +begin + if SameText(TagString, 'MODULENAME') then + begin + gl := GetSAPIGlobals; + ReplaceText := WideString(gl.request_info.request_uri); + end; +end; + +procedure TPHPExtension1.CustomerListHTMLTag(Sender: TObject; Tag: TTag; + const TagString: String; TagParams: TStrings; var ReplaceText: String); +var + Customers: String; + Scriptname : string; + gl : Psapi_globals_struct; +begin + gl := GetSAPIGlobals; + ScriptName := WideString(gl.request_info.request_uri); + + if CompareText(TagString, 'CUSTLIST') = 0 then + begin + Customers := ''; + Customer.First; + while not Customer.Eof do + begin + Customers := Customers + Format('%s
', + [ScriptName, CustomerCustNo.AsInteger, CustomerCompany.AsString]); + Customer.Next; + end; + end; + ReplaceText := Customers; +end; + +procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + CustNo : string; +begin + CustNo := Parameters.Values('CustNo'); + if Customer.Locate('CustNo', CustNo, []) then + begin + CustomerOrders.Header.Clear; + CustomerOrders.Header.Add('The following table was produced using a TDatasetTableProducer.

'); + CustomerOrders.Header.Add('Orders for: ' + CustomerCompany.AsString); + ReturnValue := CustomerOrders.Content; + end + else + ReturnValue := Format('Customer: %s not found', + [CustNo]); + +end; + +procedure TPHPExtension1.PHPExtensionCreate(Sender: TObject); +begin + Customer.Open; + BioLife.Open; +end; + +procedure TPHPExtension1.BioLifeGraphicGetText(Sender: TField; + var Text: String; DisplayText: Boolean); +var + Scriptname : string; + gl : Psapi_globals_struct; +begin + gl := GetSAPIGlobals; + ScriptName := WideString(gl.request_info.request_uri); + + Text := Format('[%s]', + [ScriptName, BiolifeCommon_Name.Text]); +end; + +procedure TPHPExtension1.BioLifeNotesGetText(Sender: TField; + var Text: String; DisplayText: Boolean); +begin + Text := Sender.AsString; +end; + +procedure TPHPExtension1.PHPExtensionDestroy(Sender: TObject); +begin + try + Database1.Connected := false; + except + end; +end; + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dpr b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dpr new file mode 100644 index 0000000..f9cbef4 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dpr @@ -0,0 +1,16 @@ +library borland_demo; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dproj b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dproj new file mode 100644 index 0000000..9fc0d0e --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dproj @@ -0,0 +1,107 @@ + + + {804C0AD1-D695-4267-96F9-74229215D71B} + borland_demo.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + borland_demo.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +

PHPExtension1
+ TPHPExtension + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + VCLApplication + + + + borland_demo.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.php b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.php new file mode 100644 index 0000000..4ea9335 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.php @@ -0,0 +1,18 @@ + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.res b/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.res new file mode 100644 index 0000000000000000000000000000000000000000..55f874204136d6cde31b105890029f4503c878e3 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~TWm~%7FH&uWyHcFg^CccPz(RS*=&<05J-d+UUf~tKNE-t+g#=E zNNH(l5wgCWy~_uF40${AX5Q>hmRkU56V3%N+_8_nsvc3Jq}FKc*DBE|gEnzRD3odT z{B9}0AJQ~9t_+D3MNzQehw#n?$2H95lfjzJMiq+xpGS}RU|YW7TGAUn=>TJR9vbuv zQKv^fLP$_BH=di&s%NpygeRq7WOL!AU~H`oJdv~Xnj7J9-%dk4aAV5-jBGG4rXS8T z#&1Awg!ePy@tV(f_@tlj=qJ`@+x_IZ=P3K1ZEocskt@zKp3bKiEbG`L>hS!nd7PP< z*YiLohG%h>ba`1aP@aA!Bu=2+E0lZZSF-?KK7q>;Epm@~@dtdZ0(&$OeF0BP;A;i7bZNA5i@Ni6 j1fWAWcYr%w;}-YC4Ibz#+kO}RH7K;(HF*{O6)AiJ<8sA5 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dpr b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dpr new file mode 100644 index 0000000..afe9e58 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dpr @@ -0,0 +1,16 @@ +library class_demo; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + dm_Class in 'dm_Class.pas' {classdemo: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(Tclassdemo, classdemo); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dproj b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dproj new file mode 100644 index 0000000..34bf411 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dproj @@ -0,0 +1,112 @@ + + + {09B38AE4-09C2-414F-8414-961ADA921FA7} + class_demo.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + C:\php\ext\ + 00400000 + false + x86 + C:\php\ext\class_demo.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + true + DEBUG;$(DCC_Define) + + + + MainSource + + +
classdemo
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + class_demo.dpr + + + False + True + False + c:\php\test_class.php + C:\php\php.exe + c:\php + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.res b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.res new file mode 100644 index 0000000000000000000000000000000000000000..55f874204136d6cde31b105890029f4503c878e3 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~TWm~%7FH&uWyHcFg^CccPz(RS*=&<05J-d+UUf~tKNE-t+g#=E zNNH(l5wgCWy~_uF40${AX5Q>hmRkU56V3%N+_8_nsvc3Jq}FKc*DBE|gEnzRD3odT z{B9}0AJQ~9t_+D3MNzQehw#n?$2H95lfjzJMiq+xpGS}RU|YW7TGAUn=>TJR9vbuv zQKv^fLP$_BH=di&s%NpygeRq7WOL!AU~H`oJdv~Xnj7J9-%dk4aAV5-jBGG4rXS8T z#&1Awg!ePy@tV(f_@tlj=qJ`@+x_IZ=P3K1ZEocskt@zKp3bKiEbG`L>hS!nd7PP< z*YiLohG%h>ba`1aP@aA!Bu=2+E0lZZSF-?KK7q>;Epm@~@dtdZ0(&$OeF0BP;A;i7bZNA5i@Ni6 j1fWAWcYr%w;}-YC4Ibz#+kO}RH7K;(HF*{O6)AiJ<8sA5 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.ddp b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dfm b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dfm new file mode 100644 index 0000000..5f4c652 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dfm @@ -0,0 +1,61 @@ +object classdemo: Tclassdemo + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'new_class' + Tag = 0 + Parameters = <> + OnExecute = classdemoFunctions0Execute + end> + ModuleName = 'class_demo' + Height = 479 + Width = 741 + object PHPDemoClass: TPHPClass + Properties = < + item + Name = 'prop' + Value = 'hello' + end> + Methods = < + item + Name = 'get_email' + Tag = 0 + Parameters = <> + OnExecute = GetEmailExecute + end + item + Name = 'get_address' + Tag = 0 + Parameters = <> + OnExecute = GetAddressExecute + end + item + Name = 'print_text' + Tag = 0 + Parameters = < + item + Name = 'AText' + ParamType = tpString + end> + OnExecute = PrintTextExecute + end + item + Name = 'add_int' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpInteger + end + item + Name = 'Y' + ParamType = tpInteger + end> + OnExecute = AddIntExecute + end> + PHPClassName = 'demo_class' + Left = 120 + Top = 48 + end +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dti b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dti new file mode 100644 index 0000000..a60ac35 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=classdemo\PHPDemoClass\PHPDemoClass.Methods + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.pas b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.pas new file mode 100644 index 0000000..28f8076 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.pas @@ -0,0 +1,102 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} + +{ $Id: dm_Class.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit dm_Class; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + phpClass, + PHPModules, PHPCommon; + +type + + Tclassdemo = class(TPHPExtension) + PHPDemoClass: TPHPClass; + procedure PrintTextExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); + procedure AddIntExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); + procedure GetAddressExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); + procedure GetEmailExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); + procedure classdemoFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + classdemo: Tclassdemo; + +implementation + +uses + Dialogs; + +{$R *.DFM} + + +procedure Tclassdemo.PrintTextExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); +begin + ReturnValue := Parameters[0].Value; +end; + +procedure Tclassdemo.AddIntExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); +begin + ReturnValue := Parameters[0].Value + Parameters[1].Value; +end; + +procedure Tclassdemo.GetAddressExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); +begin + ReturnValue := AnsiString('www.php.net'); +end; + +procedure Tclassdemo.GetEmailExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); +begin + ReturnValue := AnsiString('myaddress@hotmail.com'); +end; + +procedure Tclassdemo.classdemoFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + PHPDemoClass.ProduceInstance(ZendVar.AsZendVariable); +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/test_class.php b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/test_class.php new file mode 100644 index 0000000..604a5c0 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Class demo/test_class.php @@ -0,0 +1,15 @@ +get_email(); + +echo "\n"; + +$b = new_class(); +echo $b->prop; + +?> + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dpr b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dpr new file mode 100644 index 0000000..5b64f71 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dpr @@ -0,0 +1,16 @@ +library delphi_class; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + delphi_class_module in 'delphi_class_module.pas' {PHDelphiPExtension: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHDelphiPExtension, PHDelphiPExtension); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dproj b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dproj new file mode 100644 index 0000000..5984fad --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dproj @@ -0,0 +1,111 @@ + + + {41410412-F5C7-42D4-A798-9F9BFAB6A058} + delphi_class.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + C:\php\ext\ + 00400000 + false + x86 + C:\php\ext\delphi_class.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + true + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHDelphiPExtension
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + delphi_class.dpr + + + False + True + False + c:\php\delphi_class.php + C:\php\php.exe + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.php b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.php new file mode 100644 index 0000000..524c9da --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.php @@ -0,0 +1,15 @@ + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.res b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.res new file mode 100644 index 0000000000000000000000000000000000000000..42a5081b0f34660600159e4ef01b88cf6d6e4558 GIT binary patch literal 4396 zcmbW5y^ice5QS^C0YtD8>OhncYij4bkxI`SUKc$3L2~0G z4YcQTpML1=@$u27Qd~1m`TfHO>$~2t3H`7cZ|8G;)&Iu_jKogOT=JO4$=9oRO{KR< z9Jb;r0;xCR}WxtJm8Xnv>Vt-cbiktZ1FiOkc<%53&Y;wHhS>xp3 zTJLU$Kl$`gG1!i*9w@DrX!}{(3e(c#p-ye$v@+KZ`w94sukAENCp7^IS`8)ZxqB>wRfSnxB4fhON9C+7S;u9;r(avLTvEx&7{Sa}x z%^Y)Z;GOzA_9*NFJf#Qe1N$O=E8Ez?m#|i-dHDJC*B`-Q4i0{1i~LAz0AD@!R2NL% z;p+IKY_J`qyAbl@@ynmbJHkQZS=fm7XYT7s^_rh8Ilu|bz{YRGmmPf%CVdcNa@=?x zq&w{!f&(#v;q_14xp7c`vgSFh)!^V`oe$>8p>qHmIYj*(Q{3Ui7_OcJVR| zjg@=t1BWxbV9Q_Bw8ftsx;1`sZt_d~Q-9N#GKq{u4LO zbKC(DzxM_>$Qo&Rv&%UHd*M)GOfI$$>zu3CI4nJX00S;teU43z*L#-n$^op)hdE^LEF>pt zgpJ=bUE-}ee)k%V`XRp~Q)j=sk4pl2XC6tstNIkbCG-X{k~i)|-r?xIr1|Z)oY%kQ zUS^x9iQwvMTuNhj-258El+ZItsh?Sg73oPshvqUybnA1B?q*} z_J%yT-Q04axT#J0Nx$#axgSkFUgh%i+kk&k9y$oJR6I0&l~X06BD`mLFLFRAq_`^A2=pY2!4PxhO1 XKHL8__%}oUXWZZWzZ(1ta%2AiiCQ9h literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.ddp b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dfm b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dfm new file mode 100644 index 0000000..1be9eef --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dfm @@ -0,0 +1,89 @@ +object PHDelphiPExtension: TPHDelphiPExtension + OldCreateOrder = False + OnCreate = PHPExtensionCreate + Version = '1.0' + Functions = < + item + FunctionName = 'delphi_class_create' + Tag = 0 + Parameters = < + item + Name = 'ClassName' + ParamType = tpString + end + item + Name = 'ComponentName' + ParamType = tpString + end> + OnExecute = ClassCreateExecute + end + item + FunctionName = 'delphi_get_prop' + Tag = 0 + Parameters = < + item + Name = 'Instance' + ParamType = tpInteger + end + item + Name = 'PropName' + ParamType = tpString + end> + OnExecute = GetPropertyExecute + end + item + FunctionName = 'delphi_class_free' + Tag = 0 + Parameters = < + item + Name = 'Instance' + ParamType = tpInteger + end> + OnExecute = ClassFreeExecute + end + item + FunctionName = 'delphi_set_prop' + Tag = 0 + Parameters = < + item + Name = 'Instance' + ParamType = tpInteger + end + item + Name = 'PropName' + ParamType = tpString + end + item + Name = 'PropValue' + ParamType = tpString + end> + OnExecute = SetPropertyExecute + end + item + FunctionName = 'delphi_form_create' + Tag = 0 + Parameters = < + item + Name = 'ClassName' + ParamType = tpString + end + item + Name = 'ComponentName' + ParamType = tpString + end> + OnExecute = FormCreateExecute + end + item + FunctionName = 'delphi_message' + Tag = 0 + Parameters = < + item + Name = 'Message' + ParamType = tpString + end> + OnExecute = DelphiMessageExecute + end> + ModuleName = 'delphi_class' + Height = 479 + Width = 741 +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dti b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dti new file mode 100644 index 0000000..5187263 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHDelphiPExtension\PHDelphiPExtension.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.pas b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.pas new file mode 100644 index 0000000..16574fe --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.pas @@ -0,0 +1,344 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{ This example is suitable only for Delphi 7 or higher } +{*******************************************************} +{$I PHP.INC} + +unit delphi_class_module; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + Dialogs, + TypInfo, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + stdctrls, + phpFunctions, + PHPModules; + +type + + TPHDelphiPExtension = class(TPHPExtension) + procedure DelphiMessageExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure FormCreateExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure SetPropertyExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure ClassFreeExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure PHPExtensionCreate(Sender: TObject); + procedure GetPropertyExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure ClassCreateExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + + +{$IFDEF VERSION7} +type +{$METHODINFO ON} + TPHPButton = class(TButton) + private + FScriptText: string; + procedure SetScriptText(const Value: string); + public + function GetClassName : String; + procedure Click; override; + published + property Parent; + property ScriptText : string read FScriptText write SetScriptText; + end; + + TPHPForm = class(TCustomForm) + public + procedure Show; + function ShowModal: Integer; override; + published + property Action; + property ActiveControl; + property Align; + property AlphaBlend default False; + property AlphaBlendValue default 255; + property Anchors; + property AutoScroll; + property AutoSize; + property BiDiMode; + property BorderIcons; + property BorderStyle; + property BorderWidth; + property Caption; + property ClientHeight; + property ClientWidth; + property Color; + property TransparentColor default False; + property TransparentColorValue default 0; + property Constraints; + property Ctl3D; + property UseDockManager; + property DefaultMonitor; + property DockSite; + property DragKind; + property DragMode; + property Enabled; + property ParentFont default False; + property Font; + property FormStyle; + property Height; + property HelpFile; + property HorzScrollBar; + property Icon; + property KeyPreview; + property Menu; + property OldCreateOrder; + property ObjectMenuItem; + property ParentBiDiMode; + property PixelsPerInch; + property PopupMenu; + property Position; + property PrintScale; + property Scaled; + property ScreenSnap default False; + property ShowHint; + property SnapBuffer default 10; + property VertScrollBar; + property Visible; + property Width; + property WindowState; + property WindowMenu; + property OnActivate; + property OnCanResize; + property OnClick; + property OnClose; + property OnCloseQuery; + property OnConstrainedResize; + property OnContextPopup; + property OnCreate; + property OnDblClick; + property OnDestroy; + property OnDeactivate; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnGetSiteInfo; + property OnHide; + property OnHelp; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMouseWheel; + property OnMouseWheelDown; + property OnMouseWheelUp; + property OnPaint; + property OnResize; + property OnShortCut; + property OnShow; + property OnStartDock; + property OnUnDock; + end; +{$METHODINFO OFF} +{$ENDIF} + +var + PHDelphiPExtension: TPHDelphiPExtension; + +implementation + +{$R *.DFM} + +procedure TPHDelphiPExtension.ClassCreateExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + +var + CN : string; + DC : TComponentClass; + PC : TPersistentClass; + obj : TComponent; +begin + CN := Parameters[0].ZendVariable.AsString; + if CN = '' then + begin + ReturnValue := 0; + Exit; + end; + + PC := FindClass(CN); + if PC.InheritsFrom(TComponent) then + DC := TComponentClass(PC) + else + begin + ReturnValue := 0; + Exit; + end; + //create Delphi class instance + + if DC <> nil then + begin + obj := DC.Create(nil); + obj.Name := Parameters[1].ZendVariable.AsString; + ReturnValue := integer(Obj); + end + else + ReturnValue := 0; +end; + +procedure TPHDelphiPExtension.GetPropertyExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + Obj : TObject; + PN : String; +begin + obj := TObject(Parameters[0].ZendVariable.AsInteger); + PN := Parameters[1].ZendVariable.AsString; + ReturnValue := GetPropValue(Obj, PN, true); +end; + +procedure TPHDelphiPExtension.ClassFreeExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + TObject(Parameters[0].ZendVariable.AsInteger).Free; +end; + +procedure TPHDelphiPExtension.SetPropertyExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + Obj : TObject; + PN : String; +begin + obj := TObject(Parameters[0].ZendVariable.AsInteger); + PN := Parameters[1].ZendVariable.AsString; + SetPropValue(Obj, PN, Parameters[2].Value ); +end; + +procedure TPHDelphiPExtension.FormCreateExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + CN : string; + PC : TPersistentClass; + obj : TComponent; +begin + CN := Parameters[0].ZendVariable.AsString; + if CN = '' then + begin + ReturnValue := 0; + Exit; + end; + + PC := FindClass(CN); + if not PC.InheritsFrom(TCustomForm) then + begin + ReturnValue := 0; + Exit; + end; + //create Delphi class instance + + if PC <> nil then + begin + obj := TCustomFormClass(PC).CreateNew(nil); + obj.Name := Parameters[1].ZendVariable.AsString; + ReturnValue := integer(Obj); + end + else + ReturnValue := 0; +end; + +procedure TPHDelphiPExtension.DelphiMessageExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ShowMessage(Parameters[0].ZendVariable.AsString); +end; + +procedure TPHDelphiPExtension.PHPExtensionCreate(Sender: TObject); +begin + {$IFDEF VERSION7} + RegisterClass(TButton); + RegisterClass(TPHPButton); + RegisterClass(TPHPForm); + {$ENDIF} +end; + +{$IFDEF VERSION7} +{ TPHPButton } + +function TPHPButton.GetClassName: String; +begin + Result := ClassName; +end; + + +procedure TPHPButton.Click; +var + AnsiScriptText : AnsiString; +begin + inherited; + if FScriptText <> '' then + begin + AnsiScriptText := AnsiString(FScriptText); + zend_eval_string(PAnsiChar(AnsiScriptText), nil, 'delphi', ts_resource(0)); + end; +end; + +procedure TPHPButton.SetScriptText(const Value: string); +var + L : integer; +begin + if FScriptText <> Value then + begin + L := Length(Value); + SetLength(FScriptText, L); + Move(Value[1], FScriptText[1], L * SizeOf(Char)); + end; +end; + +{ TPHPForm } + +procedure TPHPForm.Show; +begin + inherited Show; +end; + +function TPHPForm.ShowModal: Integer; +begin + Result := inherited ShowModal; +end; + +{$ENDIF} + +end. + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/readme.txt b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/readme.txt new file mode 100644 index 0000000..118018b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/readme.txt @@ -0,0 +1 @@ +This demo can be compiled using Delphi 7 or higher \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class.php b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class.php new file mode 100644 index 0000000..e0267b4 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class.php @@ -0,0 +1,42 @@ +Caption = "Click"; +echo $b->caption; + +echo "\n"; + +echo $b->GetClassName(); + + +$f = delphi_form_create("TPHPForm", "MyForm"); +$form = register_delphi_object($f); +$form->Caption = "This is a Delphi form!"; +$form->BorderStyle = 3; +$form->Color = 333; +$form->Position = 4; +$b->Parent = $f; +$b->Left = 20; +$b->Top = 50; +$b->ScriptText = "delphi_message('Hello');"; +$form->ShowModal(); + +delphi_class_free($a); +delphi_class_free($f); + +?> + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr new file mode 100644 index 0000000..b487c8b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr @@ -0,0 +1,146 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{$I php.inc} + +library delphi_class2; + +uses + Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI, DelphiFunctions; + + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('Delphi classes support'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RegisterInternalClasses(TSRMLS_DC); + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + + + +var + moduleEntry : Tzend_module_entry; + DelphiTable : array [0..12] of zend_function_entry; + + +procedure InitDelphiFunctions; +begin + PHP_FUNCTION(DelphiTable[0], 'delphi_date', @delphi_date); + PHP_FUNCTION(DelphiTable[1], 'delphi_extract_file_dir', @delphi_extract_file_dir); + PHP_FUNCTION(DelphiTable[2], 'delphi_extract_file_drive', @delphi_extract_file_drive); + PHP_FUNCTION(DelphiTable[3], 'delphi_extract_file_name', @delphi_extract_file_name); + + DelphiTable[4].fname := 'delphi_extract_file_ext'; + DelphiTable[4].handler := @delphi_extract_file_ext; + {$IFDEF PHP4} + DelphiTable[4].func_arg_types := nil; + {$ELSE} + DelphiTable[4].arg_info := nil; + {$ENDIF} + + DelphiTable[5].fname := 'delphi_show_message'; + DelphiTable[5].handler := @delphi_show_message; + {$IFDEF PHP4} + DelphiTable[5].func_arg_types := nil; + {$ELSE} + DelphiTable[5].arg_info := nil; + {$ENDIF} + + DelphiTable[6].fname := 'register_delphi_object'; + delphitable[6].handler := @register_delphi_object; + {$IFDEF PHP4} + DelphiTable[6].func_arg_types := nil; + {$ELSE} + DelphiTable[6].arg_info := nil; + {$ENDIF} + + DelphiTable[7].fname := 'delphi_get_author'; + DelphiTable[7].handler := @delphi_get_author; + {$IFDEF PHP4} + DelphiTable[7].func_arg_types := nil; + {$ELSE} + DelphiTable[7].arg_info := nil; + {$ENDIF} + + DelphiTable[8].fname := 'delphi_str_date'; + DelphiTable[8].handler := @delphi_str_date; + {$IFDEF PHP4} + DelphiTable[8].func_arg_types := nil; + {$ELSE} + DelphiTable[8].arg_info := nil; + {$ENDIF} + + + PHP_FUNCTION(DelphiTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); + + + PHP_FUNCTION(DelphiTable[10], 'delphi_input_box', @delphi_input_box); + PHP_FUNCTION(DelphiTable[11], 'register_delphi_component', @register_delphi_component); + DelphiTable[12].fname := nil; + DelphiTable[12].handler := nil; +end; + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + InitDelphiFunctions; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'delphi_class2'; + ModuleEntry.version := '1.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @DelphiTable[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dproj b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dproj new file mode 100644 index 0000000..bc26602 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dproj @@ -0,0 +1,108 @@ + + + {44B881E6-0C8B-4432-9752-D90921566886} + delphi_class2.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + delphi_class2.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + C:\php\ext\ + C:\php\ext\delphi_class2.dll + true + DEBUG;$(DCC_Define) + + + + MainSource + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + VCLApplication + + + + delphi_class2.dpr + + + False + True + False + c:\php\delphi_class.php + C:\php\php.exe + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.php b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.php new file mode 100644 index 0000000..6c0f3a8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.php @@ -0,0 +1,26 @@ +caption = "Cancel"; +echo $b->caption; + +echo "\n"; + +delphi_class_free($a); + +?> + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/readme.txt b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/readme.txt new file mode 100644 index 0000000..118018b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/readme.txt @@ -0,0 +1 @@ +This demo can be compiled using Delphi 7 or higher \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dpr b/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dpr new file mode 100644 index 0000000..bbab1b8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dpr @@ -0,0 +1,16 @@ +library delphi_math; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + extmain in 'extmain.pas' {MathExtension: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TMathExtension, MathExtension); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dproj b/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dproj new file mode 100644 index 0000000..9cb998d --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dproj @@ -0,0 +1,107 @@ + + + {5C2F1E39-363F-499A-8BE2-AC4C4EDDCA3D} + delphi_math.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + delphi_math.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
MathExtension
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + delphi_math.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.res b/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.res new file mode 100644 index 0000000000000000000000000000000000000000..08ba56e99891bf0b2acdfefe927247478e8bf093 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tp^Zst8L_ZP5k&}CsD*#vY_>@g2qZ!Zuev7Sp9#c+ZLacn zSX!pEkgRWK@A82kL*CB3nK!$W+mh^^CJHP~UnH4;YleN+gx}lm{@BAPvk7U=0#sy6=B^AQ5y+7;98)xnKC5zgd8bTHr1WEP zg?4K!Th0+Z;sn~gK)E-5HSfUl66lp^k$cpOKj3Q>*rSQ)6L|arK37m*E{#_1z3#jn i0_YIV?c)|#xWOH9jeGjaw%>(+4GQgcO;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dfm b/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dfm new file mode 100644 index 0000000..0d81aa0 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dfm @@ -0,0 +1,50 @@ +object MathExtension: TMathExtension + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'delphi_sin' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end> + OnExecute = SinExecute + end + item + FunctionName = 'delphi_cosh' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end> + OnExecute = CoshExecute + end + item + FunctionName = 'delphi_arcsin' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end> + OnExecute = ArcsinExecute + end + item + FunctionName = 'delphi_arccosh' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end> + OnExecute = ArccoshExecute + end> + ModuleName = 'delphi_math' + Left = 619 + Top = 344 + Height = 266 + Width = 269 +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dti b/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dti new file mode 100644 index 0000000..978bf1b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=MathExtension\MathExtension.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.pas b/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.pas new file mode 100644 index 0000000..ddb3402 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.pas @@ -0,0 +1,86 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: extmain.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit extmain; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules, + math; + +type + + TMathExtension = class(TPHPExtension) + procedure SinExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure CoshExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure ArcsinExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure ArccoshExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + MathExtension: TMathExtension; + +implementation + +{$R *.DFM} + +procedure TMathExtension.SinExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue := Sin(Parameters[0].ZendVariable.AsFloat); +end; + +procedure TMathExtension.CoshExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue := Cosh(Parameters[0].Value); +end; + +procedure TMathExtension.ArcsinExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue := ArcSin(Parameters[0].value); +end; + +procedure TMathExtension.ArccoshExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue := ArcCosh(Parameters[0].ZendVariable.AsFloat); +end; + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/test_math.php b/Demos Delphi 2009 (WideString support)/Extensions/Math/test_math.php new file mode 100644 index 0000000..bbd4dfe --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Math/test_math.php @@ -0,0 +1,30 @@ +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} + +?> diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.ddp b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.dfm new file mode 100644 index 0000000..ca60b10 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.dfm @@ -0,0 +1,23 @@ +object OneWireWrapper: TOneWireWrapper + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'blah' + Tag = 0 + Parameters = < + item + Name = 'i' + ParamType = tpInteger + end + item + Name = 'a' + ParamType = tpArray + end> + OnExecute = OneWireWrapperFunctions0Execute + Description = 'Test function for passing arrays' + end> + ModuleName = 'rarp' + Height = 150 + Width = 215 +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.pas b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.pas new file mode 100644 index 0000000..ae39336 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.pas @@ -0,0 +1,68 @@ +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TOneWireWrapper = class(TPHPExtension) + procedure OneWireWrapperFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + OneWireWrapper: TOneWireWrapper; + +implementation + +{$R *.DFM} + +procedure TOneWireWrapper.OneWireWrapperFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + variable : pzval; + ar : array of AnsiString; + cnt : integer; + tmp : ^ppzval; +begin + //This function reads array parameter + variable := Parameters.ParamByName('a').ZendValue; + if variable^._type = IS_ARRAY then + begin + SetLength(ar, zend_hash_num_elements(variable^.value.ht)); + for cnt := 0 to zend_hash_num_elements(variable^.value.ht) -1 do + begin + new(tmp); + zend_hash_index_find(variable^.value.ht, cnt, tmp); + ar[cnt] := tmp^^^.value.str.val; + freemem(tmp); + end; + //Array is stored now in "ar" variable + //Lets do something with it + ReturnValue := ''; + for cnt := 0 to Length(ar) - 1 do + ReturnValue := ReturnValue + ar[cnt]; + end + else + ReturnValue := ''; +end; + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dpr b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dpr new file mode 100644 index 0000000..b4402d8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dpr @@ -0,0 +1,16 @@ +library rarp; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {OneWireWrapper: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TOneWireWrapper, OneWireWrapper); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dproj b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dproj new file mode 100644 index 0000000..190379e --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dproj @@ -0,0 +1,107 @@ + + + {1571F9BE-F9B9-4649-A8EA-05FCCB0F6615} + rarp.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + rarp.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
OneWireWrapper
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + rarp.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.res b/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.res new file mode 100644 index 0000000000000000000000000000000000000000..12285339869941018a4fabc8ac660d953d8887af GIT binary patch literal 876 zcmZuw!D`e{6g`;)45ZX42(7CQp|tKaWGUE6i{ireABr?v86*8G_oYa(EsH5tABp6QY{lccv56Ijv3zT^ z19e@C-2COG;9(9a-zxRU+>^PUYH1+j}xxlrXAFT7wca-=1dawoNZ1^kc zxi#EAaOu; + \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.ddp b/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dfm new file mode 100644 index 0000000..c011f0f --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dfm @@ -0,0 +1,25 @@ +object res_module: Tres_module + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'res_create' + Tag = 0 + Parameters = <> + OnExecute = PHPExtension1Functions0Execute + end + item + FunctionName = 'res_get' + Tag = 0 + Parameters = < + item + Name = 'Param1' + ParamType = tpInteger + end> + OnExecute = PHPExtension1Functions1Execute + end> + ModuleName = 'res_ext' + OnModuleInit = PHPExtensionModuleInit + Height = 150 + Width = 215 +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dti b/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dti new file mode 100644 index 0000000..aa0c5c1 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems= + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.pas b/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.pas new file mode 100644 index 0000000..1ed3810 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.pas @@ -0,0 +1,94 @@ +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + Tres_module = class(TPHPExtension) + procedure PHPExtensionModuleInit(Sender: TObject; TSRMLS_DC: Pointer); + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + res_module: Tres_module; + +type + PMyResource = ^TMyResource; + TMyResource = record + resource_link : integer; + resource_string : PAnsiChar; + end; + +implementation + +{$R *.DFM} + +var + le_myresource : integer; + +const + le_myresource_name = 'My type of resource'; + +procedure my_destructor_handler(rsrc : PZend_rsrc_list_entry; TSRMLS_D : pointer); cdecl; +var + my_resource : PMyResource; +begin + my_resource := rsrc^.ptr; + my_resource.resource_string := nil; +end; + +procedure Tres_module.PHPExtensionModuleInit(Sender: TObject; + TSRMLS_DC: Pointer); +begin + le_myresource := zend_register_list_destructors_ex(@my_destructor_handler, nil, PAnsiChar(le_myresource_name), Application.ModuleNumber); +end; + +procedure Tres_module.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + rc : PMyResource; + rn : integer; +begin + rc := emalloc(sizeof(TMyResource)); + rc^.resource_link := 1; + rc^.resource_string := 'Hello'; + rn := zend_register_resource(ZendVar.AsZendVariable, rc, le_myresource); + ZVAL_RESOURCE(ZendVar.AsZendVariable, rn); +end; + +procedure Tres_module.PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + rc : PMyResource; + Z : PZVAL; +begin + Z := Parameters[0].ZendValue; + rc := zend_fetch_resource(@Z, TSRMLS_DC, -1, 'my resource', nil, 1, le_myresource); + ReturnValue := String(rc^.resource_string); +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dpr b/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dpr new file mode 100644 index 0000000..cb198ea --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dpr @@ -0,0 +1,16 @@ +library res_ext; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {res_module: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(Tres_module, res_module); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dproj b/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dproj new file mode 100644 index 0000000..eb3611d --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dproj @@ -0,0 +1,107 @@ + + + {A8281194-743A-45B6-9A10-56AB7A543213} + res_ext.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + res_ext.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
res_module
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + res_ext.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.res b/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.res new file mode 100644 index 0000000000000000000000000000000000000000..12285339869941018a4fabc8ac660d953d8887af GIT binary patch literal 876 zcmZuw!D`e{6g`;)45ZX42(7CQp|tKaWGUE6i{ireABr?v86*8G_oYa(EsH5tABp6QY{lccv56Ijv3zT^ z19e@C-2COG;9(9a-zxRU+>^PUYH1+j}xxlrXAFT7wca-=1dawoNZ1^kc zxi#EAaOu; diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.ddp b/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.dfm new file mode 100644 index 0000000..708a070 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.dfm @@ -0,0 +1,20 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'get_month_names' + Tag = 0 + Parameters = <> + OnExecute = PHPExtension1Functions0Execute + end + item + FunctionName = 'get_year_info' + Tag = 0 + Parameters = <> + OnExecute = PHPExtension1Functions1Execute + end> + ModuleName = 'rarray' + Height = 500 + Width = 624 +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.pas b/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.pas new file mode 100644 index 0000000..3d7b428 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.pas @@ -0,0 +1,119 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + +var + pval : pzval; + cnt : integer; + MonthName : AnsiString; +begin + // Function get_my_array returns an array as result + // This demo shows how to use zend variable and work with complex + // PHP types + + pval := ZendVar.AsZendVariable; + if _array_init(pval, nil, 0) = FAILURE then + begin + php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); + ZVAL_FALSE(pval); + Exit; + end; + + for cnt := 1 to 12 do + begin + MonthName := AnsiString(LongMonthNames[cnt]); + add_next_index_string(pval, PAnsiChar(MonthName), 1); + end; + +end; + +procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + pval : pzval; + cnt : integer; + months : pzval; + smonths : pzval; + + MonthNameLong : AnsiString; + MonthNameShort : AnsiString; +begin + pval := ZendVar.AsZendVariable; + if _array_init(pval, nil, 0) = FAILURE then + begin + php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); + ZVAL_FALSE(pval); + Exit; + end; + + months := MAKE_STD_ZVAL; + smonths := MAKE_STD_ZVAL; + + _array_init(months, nil, 0); + _array_init(smonths, nil, 0); + + for cnt := 1 to 12 do + begin + MonthNameLong := AnsiString(LongMonthNames[cnt]); + MonthNameShort := AnsiString(ShortMonthNames[cnt]); + add_next_index_string(months, PAnsiChar(MonthNameLong), 1); + add_next_index_string(smonths, PAnsiChar(MonthNameShort), 1); + end; + + add_assoc_zval_ex(pval, 'months', strlen('months') + 1, months); + add_assoc_zval_ex(pval, 'abbrevmonths', strlen('abbrevmonths') + 1, smonths); + +end; + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dpr b/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dpr new file mode 100644 index 0000000..0590f3e --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dpr @@ -0,0 +1,16 @@ +library rarray; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dproj b/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dproj new file mode 100644 index 0000000..992b698 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dproj @@ -0,0 +1,112 @@ + + + {6FA51797-10CE-4466-AD51-C8637FC8936F} + rarray.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + C:\php\ext\ + 00400000 + false + x86 + C:\php\ext\rarray.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + C:\php\ext\ + true + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + rarray.dpr + + + False + True + False + c:\php\rarray.php + C:\php\php.exe + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.php b/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.php new file mode 100644 index 0000000..9920e28 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.php @@ -0,0 +1,31 @@ + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.res b/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.res new file mode 100644 index 0000000000000000000000000000000000000000..55f874204136d6cde31b105890029f4503c878e3 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~TWm~%7FH&uWyHcFg^CccPz(RS*=&<05J-d+UUf~tKNE-t+g#=E zNNH(l5wgCWy~_uF40${AX5Q>hmRkU56V3%N+_8_nsvc3Jq}FKc*DBE|gEnzRD3odT z{B9}0AJQ~9t_+D3MNzQehw#n?$2H95lfjzJMiq+xpGS}RU|YW7TGAUn=>TJR9vbuv zQKv^fLP$_BH=di&s%NpygeRq7WOL!AU~H`oJdv~Xnj7J9-%dk4aAV5-jBGG4rXS8T z#&1Awg!ePy@tV(f_@tlj=qJ`@+x_IZ=P3K1ZEocskt@zKp3bKiEbG`L>hS!nd7PP< z*YiLohG%h>ba`1aP@aA!Bu=2+E0lZZSF-?KK7q>;Epm@~@dtdZ0(&$OeF0BP;A;i7bZNA5i@Ni6 j1fWAWcYr%w;}-YC4Ibz#+kO}RH7K;(HF*{O6)AiJ<8sA5 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/css/CREDITS b/Demos Delphi 2009 (WideString support)/Extensions/css/CREDITS new file mode 100644 index 0000000..493ec68 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/css/CREDITS @@ -0,0 +1 @@ +css \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/css/EXPERIMENTAL b/Demos Delphi 2009 (WideString support)/Extensions/css/EXPERIMENTAL new file mode 100644 index 0000000..e69de29 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr b/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr new file mode 100644 index 0000000..209efd7 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr @@ -0,0 +1,135 @@ +(* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2002 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 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_02.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: Colin Viebrock | + +----------------------------------------------------------------------+ +*) + +{$I PHP.INC} + +library css; + +uses + Windows, SysUtils, ZendTypes, ZENDAPI, phpTypes, PHPAPI; + + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('Delphi CSS'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + + +{$IFDEF PHP510} +procedure delphi_css (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_css (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + + +procedure Puts(Str : string); +var + BodyString : AnsiString; +begin + str := StringReplace(str, '\n', #13#10, [rfReplaceAll]); + BodyString := AnsiString(str); + php_body_write(PAnsiChar(BodyString), Length(BodyString), TSRMLS_DC); +end; + +begin + PUTS('body {background-color: #ffffff; color: #000000;}\n'); + PUTS('body, td, th, h1, h2 {font-family: sans-serif;}\n'); + PUTS('pre {margin: 0px; font-family: monospace;}\n'); + PUTS('a:link {color: #000099; text-decoration: none;}\n'); + PUTS('a:hover {text-decoration: underline;}\n'); + PUTS('table {border-collapse: collapse;}\n'); + PUTS('.center {text-align: center;}\n'); + PUTS('.center table { margin-left: auto; margin-right: auto; text-align: left;}\n'); + PUTS('.center th { text-align: center; !important }\n'); + PUTS('td, th { border: 1px solid #000000; font-size: 75%; vertical-align: baseline;}\n'); + PUTS('h1 {font-size: 150%;}\n'); + PUTS('h2 {font-size: 125%;}\n'); + PUTS('.p {text-align: left;}\n'); + PUTS('.e {background-color: #ccccff; font-weight: bold;}\n'); + PUTS('.h {background-color: #9999cc; font-weight: bold;}\n'); + PUTS('.v {background-color: #cccccc;}\n'); + PUTS('i {color: #666666;}\n'); + PUTS('img {float: right; border: 0px;}\n'); + PUTS('hr {width: 600px; align: center; background-color: #cccccc; border: 0px; height: 1px;}\n'); +end; + + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..1] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'css'; + ModuleEntry.version := '0.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + module_entry_table[0].fname := 'delphi_css'; + module_entry_table[0].handler := @delphi_css; + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + result := @ModuleEntry; +end; + +exports + get_module; + + +end. + + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/css/css.dproj b/Demos Delphi 2009 (WideString support)/Extensions/css/css.dproj new file mode 100644 index 0000000..bba35cd --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/css/css.dproj @@ -0,0 +1,103 @@ + + + {B6A5D89E-2C15-4B2B-95C7-32734CC81DCD} + css.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + css.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + VCLApplication + + + + css.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr b/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr new file mode 100644 index 0000000..1fbe696 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr @@ -0,0 +1,163 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP class demo extension } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{ $Id: php_class.dpr,v 7.4 10/2009 delphi32 Exp $ } + +{$I PHP.INC} + +library php_class; + +uses + Windows, SysUtils, ZendTypes, ZENDAPI, phpTypes, PHPAPI; + +var + demo_class_functions : array[0..2] of zend_function_entry; + demo_class_entry : Tzend_class_entry; + ce : pzend_class_entry; + +{$IFDEF PHP510} +procedure demo_email (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure demo_email (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + str : AnsiString; +begin + str := 'name@mail.com'; + ZVAL_STRING(return_value, PAnsiChar(str), true); +end; + +{$IFDEF PHP510} +procedure demo_homepage (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure demo_homepage (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + str : AnsiString; +begin + str := 'http://www.demo.com'; + ZVAL_STRING(return_value, PAnsiChar(str), true); +end; + +procedure RegisterDemoClass(p : pointer); +begin + demo_class_functions[0].fname := 'demo_email'; + demo_class_functions[0].handler := @demo_email; + demo_class_functions[1].fname := 'demo_homepage'; + demo_class_functions[1].handler := @demo_homepage; + INIT_CLASS_ENTRY(demo_class_entry, 'php_demo_class', @demo_class_functions); + ce := zend_register_internal_class(@demo_class_entry, p); +end; + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('PHP Demo Class'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RegisterDemoClass(TSRMLS_DC); + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +{$IFDEF PHP510} +procedure get_demo_class (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure get_demo_class (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + properties : array[0..2] of PAnsiChar; +begin + properties[0] := 'name'; + properties[1] := 'tool'; + properties[2] := 'height'; + {$IFDEF PHP4} + _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); + {$ELSE} + object_init(return_value, ce, TSRMLS_DC ); + {$ENDIF} + + {$IFDEF PHP4} + add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); + add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1); + {$ELSE} + add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); + add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1, TSRMLS_DC); + {$ENDIF} + + {$IFDEF PHP4} + add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); + {$ELSE} + add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); + {$ENDIF} +end; + + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..1] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'php_class'; + ModuleEntry.version := '0.2'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + module_entry_table[0].fname := 'get_demo_class'; + module_entry_table[0].handler := @get_demo_class; + {$IFDEF PHP4} + module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dproj b/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dproj new file mode 100644 index 0000000..dae7bfa --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dproj @@ -0,0 +1,103 @@ + + + {BDB59203-8FFB-4B82-92D1-B1CFE020B023} + php_class.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + php_class.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + VCLApplication + + + + php_class.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/php class/test_class.php b/Demos Delphi 2009 (WideString support)/Extensions/php class/test_class.php new file mode 100644 index 0000000..f626e59 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/php class/test_class.php @@ -0,0 +1,15 @@ +demo_email(); + +echo "\n"; + +$b = get_demo_class(); +echo $b->tool; + +?> + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.ddp b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dfm new file mode 100644 index 0000000..4e99c1b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dfm @@ -0,0 +1,18 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'mygettext' + Tag = 0 + Parameters = < + item + Name = 'AText' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions0Execute + end> + ModuleName = 'some_functions' + Height = 150 + Width = 215 +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dti b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dti new file mode 100644 index 0000000..aa0c5c1 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems= + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.pas b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.pas new file mode 100644 index 0000000..3115dee --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.pas @@ -0,0 +1,59 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + +var + ReturnString : AnsiString; +begin + ReturnString := AnsiString(Parameters[0].Value + ' from DLL'); + ReturnValue := ReturnString; +end; + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dpr b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dpr new file mode 100644 index 0000000..4462aac --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dpr @@ -0,0 +1,16 @@ +library phpDLL; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dproj b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dproj new file mode 100644 index 0000000..1b2d6f8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dproj @@ -0,0 +1,107 @@ + + + {76FCDBA5-C096-496F-86A7-DD65BE290420} + phpDLL.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + phpDLL.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + phpDLL.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.res b/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.res new file mode 100644 index 0000000000000000000000000000000000000000..12285339869941018a4fabc8ac660d953d8887af GIT binary patch literal 876 zcmZuw!D`e{6g`;)45ZX42(7CQp|tKaWGUE6i{ireABr?v86*8G_oYa(EsH5tABp6QY{lccv56Ijv3zT^ z19e@C-2COG;9(9a-zxRU+>^PUYH1+j}xxlrXAFT7wca-=1dawoNZ1^kc zxi#EAaOu;"; + +$functions = get_extension_funcs($module); +echo "Functions available in the $module extension:
\n"; +foreach($functions as $func) { + echo $func."
"; +} + +$str = MyGetText("Hello!"); //This Delphi function is : ... ReturnValue:='Hello From DLL'; + +echo "Delphi ret -->$str
"; + +?> diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.ddp b/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.dfm new file mode 100644 index 0000000..928797f --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.dfm @@ -0,0 +1,24 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'helloworld' + Tag = 0 + Parameters = < + item + Name = 'Param1' + ParamType = tpString + end + item + Name = 'Param2' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions0Execute + end> + ModuleName = 'php_ref' + Left = 192 + Top = 114 + Height = 150 + Width = 215 +end diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.pas b/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.pas new file mode 100644 index 0000000..3207ba9 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.pas @@ -0,0 +1,45 @@ +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ZVAL_STRING(Parameters[0].ZendValue, 'hello', true); + ZVAL_STRING(Parameters[1].ZendValue, 'world', true); +end; + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dpr b/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dpr new file mode 100644 index 0000000..b9cf9f3 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dpr @@ -0,0 +1,16 @@ +library php_ref; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dproj b/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dproj new file mode 100644 index 0000000..4d05ff5 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dproj @@ -0,0 +1,107 @@ + + + {0773DC5D-79DB-4080-AD29-0272364C43AE} + php_ref.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + php_ref.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + php_ref.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.res b/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.res new file mode 100644 index 0000000000000000000000000000000000000000..12285339869941018a4fabc8ac660d953d8887af GIT binary patch literal 876 zcmZuw!D`e{6g`;)45ZX42(7CQp|tKaWGUE6i{ireABr?v86*8G_oYa(EsH5tABp6QY{lccv56Ijv3zT^ z19e@C-2COG;9(9a-zxRU+>^PUYH1+j}xxlrXAFT7wca-=1dawoNZ1^kc zxi#EAaOu;"; + +$functions = get_extension_funcs($module); +echo "Functions available in the $module extension:
\n"; +foreach($functions as $func) { + echo $func."
"; +} + +$a = ""; +$b = ""; + +helloworld($a, $b); + +echo $a." ".$b; + +?> diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/CREDITS b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/CREDITS new file mode 100644 index 0000000..58fc710 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/CREDITS @@ -0,0 +1 @@ +extname \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/EXPERIMENTAL b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/EXPERIMENTAL new file mode 100644 index 0000000..e69de29 diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.bdsproj b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.bdsproj new file mode 100644 index 0000000..86a7418 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + skeleton.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + C:\php\ext + + + + $(DELPHI)\Lib\Debug + vcl;rtl;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;vclx;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;php4DelphiR7;CoolTrayIcon_D6plus;psvLabelsR7;PSCControlsR7;cxLibraryVCLD7;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtItemsD7;dxBarExtDBItemsD7;dxsbD7;dxDockingD7;dxNavBarD7;dxPSCoreD7;dxPsPrVwAdvD7;dxPSLnksD7;dxPSTeeChartD7;dxPSDBTeeChartD7;cxEditorsVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxVerticalGridVCLD7;cxPageControlVCLD7;cxGridVCLD7;FreeBurner;FBTranscoder;FBAudioGrabber;SqlDir70;Vcwd7;MSICS_D7_Rtl;VirtualTreesD7;DSPack_D7;DirectX9_D7;WPTools5_D7;RemObjects_WebBroker_D7;RemObjects_Indy_D7;RemObjects_RODX_D7;RemObjects_BPDX_D7;DataAbstract_Core_D7;DataAbstract_IDE_D7;DataAbstract_DBXDriver_D7;DataAbstract_Scripting_D7;PascalScript_RO_D7;RaizeComponentsVcl + + + False + + + c:\php\skeleton.php + C:\php\php.exe + + False + c:\php + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr new file mode 100644 index 0000000..b768421 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr @@ -0,0 +1,126 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{ $Id: skeleton.dpr,v 7.4 10/2009 delphi32 Exp $ } + +{$I php.inc} + +library skeleton; + +uses + Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI; + + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('extname support'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +{$IFDEF PHP510} +procedure confirm_extname_compiled (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure confirm_extname_compiled (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +arg : PAnsiChar; +str : AnsiString; +param : pzval_array; +begin + {$IFDEF PHP510} + if return_value_ptr = nil then + begin + end; + {$ENDIF} + + if ht = 0 then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + arg := param[0]^.value.str.val; + str := Format('Congratulations! Module %.78s is now compiled into PHP.', [arg]); + ZVAL_STRING(return_value, PAnsiChar(str), true); + dispose_pzval_array(param); +end; + + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..1] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'extname'; + ModuleEntry.version := '0.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + Module_entry_table[0].fname := 'confirm_extname_compiled'; + Module_entry_table[0].handler := @confirm_extname_compiled; + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dproj b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dproj new file mode 100644 index 0000000..ebc68dd --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dproj @@ -0,0 +1,111 @@ + + + {486042C3-7869-4681-B499-D6AA42BE8981} + skeleton.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + C:\php\ext\skeleton.dll + 00400000 + vcl;rtl;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;vclx;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;php4DelphiR7;CoolTrayIcon_D6plus;psvLabelsR7;PSCControlsR7;cxLibraryVCLD7;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtItemsD7;dxBarExtDBItemsD7;dxsbD7;dxDockingD7;dxNavBarD7;dxPSCoreD7;dxPsPrVwAdvD7;dxPSLnksD7;dxPSTeeChartD7;dxPSDBTeeChartD7;cxEditorsVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxVerticalGridVCLD7;cxPageControlVCLD7;cxGridVCLD7;FreeBurner;FBTranscoder;FBAudioGrabber;SqlDir70;Vcwd7;MSICS_D7_Rtl;VirtualTreesD7;DSPack_D7;DirectX9_D7;WPTools5_D7;RemObjects_WebBroker_D7;RemObjects_Indy_D7;RemObjects_RODX_D7;RemObjects_BPDX_D7;DataAbstract_Core_D7;DataAbstract_IDE_D7;DataAbstract_DBXDriver_D7;DataAbstract_Scripting_D7;PascalScript_RO_D7;RaizeComponentsVcl + $(DELPHI)\Lib\Debug;$(DCC_UnitSearchPath) + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + x86 + C:\php\ext + true + false + true + false + 1 + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + VCLApplication + + + + skeleton.dpr + + + c:\php\test_skeleton.php + C:\php\php.exe + False + c:\php + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/skeleton.php b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/skeleton.php new file mode 100644 index 0000000..1866534 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/skeleton.php @@ -0,0 +1,19 @@ +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} +echo "
\n"; +$function = 'confirm_' . $module . '_compiled'; +if (extension_loaded($module)) { + $str = $function($module); +} else { + $str = "Module $module is not compiled into PHP"; +} +echo "$str\n"; +?> diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/test_skeleton.php b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/test_skeleton.php new file mode 100644 index 0000000..c189599 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/test_skeleton.php @@ -0,0 +1,25 @@ +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} + +?> diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dpr b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dpr new file mode 100644 index 0000000..598d21f --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dpr @@ -0,0 +1,16 @@ +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dproj b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dproj new file mode 100644 index 0000000..0f6efd5 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dproj @@ -0,0 +1,107 @@ + + + {DD722C04-1B93-46B2-9E05-D74A1003601F} + Project1.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Project1.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.res b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..08ba56e99891bf0b2acdfefe927247478e8bf093 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tp^Zst8L_ZP5k&}CsD*#vY_>@g2qZ!Zuev7Sp9#c+ZLacn zSX!pEkgRWK@A82kL*CB3nK!$W+mh^^CJHP~UnH4;YleN+gx}lm{@BAPvk7U=0#sy6=B^AQ5y+7;98)xnKC5zgd8bTHr1WEP zg?4K!Th0+Z;sn~gK)E-5HSfUl66lp^k$cpOKj3Q>*rSQ)6L|arK37m*E{#_1z3#jn i0_YIV?c)|#xWOH9jeGjaw%>(+4GQgcO;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dfm new file mode 100644 index 0000000..1f4f79b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dfm @@ -0,0 +1,9 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '0.0' + Functions = <> + Left = 512 + Top = 312 + Height = 331 + Width = 444 +end diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dti b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dti new file mode 100644 index 0000000..25ebfd4 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=267 +Top=308 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1 + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.pas b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.pas new file mode 100644 index 0000000..1fcf616 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.pas @@ -0,0 +1,45 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dpr b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dpr new file mode 100644 index 0000000..598d21f --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dpr @@ -0,0 +1,16 @@ +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dproj b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dproj new file mode 100644 index 0000000..da78540 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dproj @@ -0,0 +1,107 @@ + + + {8DF133D6-16D5-4538-B6B0-C529C2CC6A9A} + Project1.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Project1.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.res b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..08ba56e99891bf0b2acdfefe927247478e8bf093 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tp^Zst8L_ZP5k&}CsD*#vY_>@g2qZ!Zuev7Sp9#c+ZLacn zSX!pEkgRWK@A82kL*CB3nK!$W+mh^^CJHP~UnH4;YleN+gx}lm{@BAPvk7U=0#sy6=B^AQ5y+7;98)xnKC5zgd8bTHr1WEP zg?4K!Th0+Z;sn~gK)E-5HSfUl66lp^k$cpOKj3Q>*rSQ)6L|arK37m*E{#_1z3#jn i0_YIV?c)|#xWOH9jeGjaw%>(+4GQgcO;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dfm new file mode 100644 index 0000000..19fa4f3 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dfm @@ -0,0 +1,10 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '1.0' + Functions = <> + ModuleName = 'mymodule' + Left = 541 + Top = 282 + Height = 376 + Width = 406 +end diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dti b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dti new file mode 100644 index 0000000..17f5861 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=192 +Top=130 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1 + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.pas b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.pas new file mode 100644 index 0000000..1fcf616 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.pas @@ -0,0 +1,45 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dpr b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dpr new file mode 100644 index 0000000..598d21f --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dpr @@ -0,0 +1,16 @@ +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dproj b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dproj new file mode 100644 index 0000000..94687bb --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dproj @@ -0,0 +1,107 @@ + + + {C5C7A78C-9E0D-4C1C-B0D8-D4B730D6C440} + Project1.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Project1.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.res b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..08ba56e99891bf0b2acdfefe927247478e8bf093 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tp^Zst8L_ZP5k&}CsD*#vY_>@g2qZ!Zuev7Sp9#c+ZLacn zSX!pEkgRWK@A82kL*CB3nK!$W+mh^^CJHP~UnH4;YleN+gx}lm{@BAPvk7U=0#sy6=B^AQ5y+7;98)xnKC5zgd8bTHr1WEP zg?4K!Th0+Z;sn~gK)E-5HSfUl66lp^k$cpOKj3Q>*rSQ)6L|arK37m*E{#_1z3#jn i0_YIV?c)|#xWOH9jeGjaw%>(+4GQgcO;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dfm new file mode 100644 index 0000000..03f8fa1 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dfm @@ -0,0 +1,15 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'myfunction' + Tag = 0 + Parameters = <> + end> + ModuleName = 'mymodule' + Left = 499 + Top = 235 + Height = 443 + Width = 508 +end diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dti b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dti new file mode 100644 index 0000000..3af6432 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=192 +Top=130 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1\PHPExtension1.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.pas b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.pas new file mode 100644 index 0000000..00bf20a --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.pas @@ -0,0 +1,45 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dpr b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dpr new file mode 100644 index 0000000..598d21f --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dpr @@ -0,0 +1,16 @@ +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dproj b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dproj new file mode 100644 index 0000000..dc630b7 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dproj @@ -0,0 +1,107 @@ + + + {1661D7C8-971E-48ED-8A13-4E232A479ECE} + Project1.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Project1.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.res b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..08ba56e99891bf0b2acdfefe927247478e8bf093 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tp^Zst8L_ZP5k&}CsD*#vY_>@g2qZ!Zuev7Sp9#c+ZLacn zSX!pEkgRWK@A82kL*CB3nK!$W+mh^^CJHP~UnH4;YleN+gx}lm{@BAPvk7U=0#sy6=B^AQ5y+7;98)xnKC5zgd8bTHr1WEP zg?4K!Th0+Z;sn~gK)E-5HSfUl66lp^k$cpOKj3Q>*rSQ)6L|arK37m*E{#_1z3#jn i0_YIV?c)|#xWOH9jeGjaw%>(+4GQgcO;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dfm new file mode 100644 index 0000000..7f21115 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dfm @@ -0,0 +1,19 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'myfunction' + Tag = 0 + Parameters = < + item + Name = 'myparameter' + ParamType = tpString + end> + end> + ModuleName = 'mymodule' + Left = 397 + Top = 234 + Height = 497 + Width = 591 +end diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dti b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dti new file mode 100644 index 0000000..9090a91 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=192 +Top=130 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1\PHPExtension1.Functions\PHPExtension1.Functions[0]\TFunctionParams + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.pas b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.pas new file mode 100644 index 0000000..1fcf616 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.pas @@ -0,0 +1,45 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dpr b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dpr new file mode 100644 index 0000000..598d21f --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dpr @@ -0,0 +1,16 @@ +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dproj b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dproj new file mode 100644 index 0000000..f1c98da --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dproj @@ -0,0 +1,113 @@ + + + {FC81AF33-A828-4A15-A5F3-F350290FFE2B} + Project1.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Project1.dll + false + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + C:\php\ext\Project1.dll + C:\php\ext\ + true + true + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + c:\php\test_script.php + C:\php\php.exe + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.res b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..08ba56e99891bf0b2acdfefe927247478e8bf093 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tp^Zst8L_ZP5k&}CsD*#vY_>@g2qZ!Zuev7Sp9#c+ZLacn zSX!pEkgRWK@A82kL*CB3nK!$W+mh^^CJHP~UnH4;YleN+gx}lm{@BAPvk7U=0#sy6=B^AQ5y+7;98)xnKC5zgd8bTHr1WEP zg?4K!Th0+Z;sn~gK)E-5HSfUl66lp^k$cpOKj3Q>*rSQ)6L|arK37m*E{#_1z3#jn i0_YIV?c)|#xWOH9jeGjaw%>(+4GQgcO;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dfm b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dfm new file mode 100644 index 0000000..8e8c523 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dfm @@ -0,0 +1,20 @@ +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'myfunction' + Tag = 0 + Parameters = < + item + Name = 'myparameter' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions0Execute + end> + ModuleName = 'mymodule' + Left = 414 + Top = 262 + Height = 359 + Width = 478 +end diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dti b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dti new file mode 100644 index 0000000..9090a91 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=192 +Top=130 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1\PHPExtension1.Functions\PHPExtension1.Functions[0]\TFunctionParams + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.pas b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.pas new file mode 100644 index 0000000..292a871 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.pas @@ -0,0 +1,57 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + +begin + //just returns the received value back + ReturnValue := Parameters[0].Value; +end; + +end. \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.06/test_script.php b/Demos Delphi 2009 (WideString support)/Tutorial/Step.06/test_script.php new file mode 100644 index 0000000..e4c40cb --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/Tutorial/Step.06/test_script.php @@ -0,0 +1,22 @@ +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} + +?> diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/App.ico b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/App.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a5525fd794f7a7c5c8e6187f470ea3af38cd2b6 GIT binary patch literal 1078 zcmeHHJr05}7=1t!Hp3A*8IHkVf+j?-!eHY14Gtcw1Eb*_9>Bq^zETJ@GKj{_2j4$w zo9}xCh!8{T3=X##Skq>ikMjsvB|y%crWBM2iW(4pI}c%z6%lW!=~4v77#3{z!dmB1 z__&l)-{KUYR+|8|;wB^R|9ET$J@(@=#rd^=)qs85?vAy(PSF5CyNkus435LVkZ$rj zNw|JG-P7^hF<(;#o*Vk}5R#e|^13tBbQkeF?djULtvqyxd3<{9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.cs b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.cs new file mode 100644 index 0000000..5e71f07 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.cs @@ -0,0 +1,223 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Text; +using System.Data; +using System.Runtime.InteropServices; + + + +namespace PHP4DelphiDemo +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private Panel panel1; + private Button btnExecuteScript; + private Button btnExecuteCode; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.panel1 = new System.Windows.Forms.Panel(); + this.btnExecuteScript = new System.Windows.Forms.Button(); + this.btnExecuteCode = new System.Windows.Forms.Button(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox1.Location = new System.Drawing.Point(0, 0); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBox1.Size = new System.Drawing.Size(326, 197); + this.textBox1.TabIndex = 0; + // + // openFileDialog1 + // + this.openFileDialog1.Filter = "PHP files|*.php"; + // + // panel1 + // + this.panel1.Controls.Add(this.btnExecuteCode); + this.panel1.Controls.Add(this.btnExecuteScript); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Location = new System.Drawing.Point(0, 197); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(326, 49); + this.panel1.TabIndex = 2; + // + // btnExecuteScript + // + this.btnExecuteScript.Location = new System.Drawing.Point(12, 12); + this.btnExecuteScript.Name = "btnExecuteScript"; + this.btnExecuteScript.Size = new System.Drawing.Size(94, 23); + this.btnExecuteScript.TabIndex = 2; + this.btnExecuteScript.Text = "Execute Script"; + // + // btnExecuteCode + // + this.btnExecuteCode.Location = new System.Drawing.Point(112, 12); + this.btnExecuteCode.Name = "btnExecuteCode"; + this.btnExecuteCode.Size = new System.Drawing.Size(96, 23); + this.btnExecuteCode.TabIndex = 3; + this.btnExecuteCode.Text = "Execute Code"; + this.btnExecuteCode.UseVisualStyleBackColor = true; + this.btnExecuteCode.Click += new System.EventHandler(this.btnExecuteCode_Click); + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(326, 246); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.panel1); + this.Name = "Form1"; + this.Text = "PHP"; + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.Run(new Form1()); + } + + private void button1_Click(object sender, System.EventArgs e) + { + int l = 0; + int RequestID = 0; + StringBuilder builder = new StringBuilder(); + + if(openFileDialog1.ShowDialog() == DialogResult.OK) + { + RequestID = InitRequest(); + string fn = openFileDialog1.FileName; + ExecutePHP(RequestID, fn); + l = GetResultBufferSize(RequestID); + builder.Capacity = l; + l = GetResultText(RequestID, builder, builder.Capacity + 1); + textBox1.Text = builder.ToString(); + DoneRequest(RequestID); + } + + + } + + + [DllImport("PHP4App.dll")] + public static extern int InitRequest(); + + /// + /// Execute PHP script + /// + [DllImport("PHP4App.dll")] + public static extern int ExecutePHP(int RequestID, string FileName); + + [DllImport("PHP4App.dll", SetLastError=true)] + public static extern void DoneRequest(int RequestID); + + [DllImport("PHP4App.dll", SetLastError=true)] + public static extern int GetResultText(int RequestID, StringBuilder Buf, int BufLen); + + [DllImport("PHP4App.dll")] + public static extern void RegisterVariable(int RequestID, string AName, string AValue); + + [DllImport("PHP4App.dll")] + public static extern int ExecuteCode(int RequestID, string ACode); + + [DllImport("PHP4App.dll")] + public static extern int GetVariable(int RequestID, string AName, StringBuilder Buffer, int BufLen); + + [DllImport("PHP4App.dll")] + public static extern int SaveToFile(int RequestID, string AFileName); + + [DllImport("PHP4App.dll")] + public static extern int GetVariableSize(int RequestID, string AName); + + [DllImport("PHP4App.dll")] + public static extern int GetResultBufferSize(int RequestID); + + private void btnExecuteCode_Click(object sender, EventArgs e) + { + int l = 0; + int RequestID = 0; + StringBuilder builder = new StringBuilder(); + StringBuilder varbuilder = new StringBuilder(); + + RequestID = InitRequest(); + RegisterVariable(RequestID, "x","2"); + RegisterVariable(RequestID, "y","3"); + RegisterVariable(RequestID, "z","0"); + ExecuteCode(RequestID, "$z = $x + $y; echo \"Result \"; echo $z;"); + l = GetResultBufferSize(RequestID); + if (l > 0) + { + builder.Capacity = l; + GetResultText(RequestID, builder, builder.Capacity + 1); + textBox1.Text = builder.ToString(); + } + + l = GetVariableSize(RequestID, "z"); + if (l > 0) + { + varbuilder.Capacity = l; + GetVariable(RequestID, "z", varbuilder, varbuilder.Capacity + 1); + MessageBox.Show(String.Concat("After execution z=", varbuilder.ToString())); + } + DoneRequest(RequestID); + } + + } +} diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.resx b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.resx new file mode 100644 index 0000000..6e58fa8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj new file mode 100644 index 0000000..05de69b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj @@ -0,0 +1,112 @@ + + + Local + 8.0.50727 + 2.0 + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA} + Debug + AnyCPU + App.ico + + + PHP4DelphiDemo + + + JScript + Grid + IE50 + false + WinExe + PHP4DelphiDemo + OnBuildSuccess + + + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + + + Code + + + Form + + + Form1.cs + + + + + + + + + + \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user new file mode 100644 index 0000000..5414047 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user @@ -0,0 +1,58 @@ + + + 7.10.3077 + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln new file mode 100644 index 0000000..9758dfe --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PHP4DelphiDemo", "PHP4DelphiDemo.csproj", "{0DA732DE-42B5-436C-8BD0-9036B7D79EAA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/app.config b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/app.config new file mode 100644 index 0000000..b7d8d1d --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/app.config @@ -0,0 +1,4 @@ + + + + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/test.php b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/test.php new file mode 100644 index 0000000..d3fccb8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/test.php @@ -0,0 +1,4 @@ + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.cpp b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.cpp new file mode 100644 index 0000000..976384e --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// cdemo.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.h b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.h new file mode 100644 index 0000000..1b40500 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.h @@ -0,0 +1,19 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) +#define AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.cpp b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.cpp new file mode 100644 index 0000000..02f788a --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.cpp @@ -0,0 +1,101 @@ +// cdemo.cpp : Defines the entry point for the console application. +// + + +# include "stdafx.h" +# include +# include +# include +# include + + +typedef int (WINAPI * ExecutePHP)(int request_id, char * filename); +typedef int (WINAPI * ExecuteCode)(int request_id, char * acode); +typedef void (WINAPI * RegisterVariable)(int request_id, char * aname, char * avalue); +typedef int (WINAPI * InitRequest)(void); +typedef void (WINAPI * DoneRequest)(int request_id); +typedef int (WINAPI * GetResultText)(int request_id, char *buf, int buflen); +typedef int (WINAPI * GetVariableSize)(int request_id, char *aname); +typedef int (WINAPI * GetVariable)(int request_id, char *aname, char *buf, int buflen); +typedef void (WINAPI * SaveToFile)(int request_id, char *filename); +typedef int (WINAPI * GetResultBufferSize)(int request_id); + +int main(int argc, char* argv[]) +{ + ExecutePHP lpfnExecutePHP; + RegisterVariable lpfnRegisterVariable; + ExecuteCode lpfnExecuteCode; + InitRequest lpfnInitRequest; + DoneRequest lpfnDoneRequest; + GetResultText lpfnGetResultText; + GetVariableSize lpfnGetVariableSize; + GetVariable lpfnGetVariable; + SaveToFile lpfnSaveToFile; + GetResultBufferSize lpfnGetResultBufferSize; + + HMODULE handle; + char *array; + int request_id; + int len; + + handle = LoadLibrary("php4app.dll"); + if( handle == NULL ) + return FALSE ; + + lpfnRegisterVariable = (RegisterVariable) GetProcAddress(handle, "RegisterVariable"); + lpfnExecutePHP = (ExecutePHP) GetProcAddress(handle, "ExecutePHP"); + lpfnExecuteCode = (ExecuteCode)GetProcAddress(handle, "ExecuteCode"); + lpfnInitRequest = (InitRequest)GetProcAddress(handle, "InitRequest"); + lpfnDoneRequest = (DoneRequest)GetProcAddress(handle, "DoneRequest"); + lpfnGetResultText = (GetResultText)GetProcAddress(handle, "GetResultText"); + lpfnGetVariableSize = (GetVariableSize)GetProcAddress(handle, "GetVariableSize"); + lpfnGetVariable = (GetVariable)GetProcAddress(handle, "GetVariable"); + lpfnSaveToFile = (SaveToFile)GetProcAddress(handle, "SaveToFile"); + lpfnGetResultBufferSize = (GetResultBufferSize)GetProcAddress(handle, "GetResultBufferSize"); + + if(lpfnRegisterVariable == NULL || + lpfnExecutePHP == NULL || + lpfnExecuteCode == NULL ) + { + FreeLibrary( handle ) ; + return FALSE ; + } + + request_id = lpfnInitRequest(); + lpfnRegisterVariable(request_id, "x", "2"); + lpfnRegisterVariable(request_id, "y", "3"); + lpfnRegisterVariable(request_id, "z", "0"); + + lpfnExecutePHP(request_id, "test.php"); + + len = lpfnGetResultText(request_id, NULL, 0); + array = (char *)malloc(len); + lpfnGetResultText(request_id, array, len); + printf("\n"); + printf("%s\n",array); + free(array); + + //get variable value after execution + len = lpfnGetVariableSize(request_id, "z"); + if (len > 0) { + array = (char *)malloc(len); + lpfnGetVariable(request_id, "z", array, len); + printf("after execution variable z = %s\n", array); + free(array); + } + lpfnDoneRequest(request_id); + + request_id = lpfnInitRequest(); + lpfnExecuteCode(request_id, "echo \"embedded script demo\\n\";"); + len = lpfnGetResultText(request_id, NULL, 0); + array = (char *)malloc(len); + lpfnGetResultText(request_id, array, len); + printf("\n"); + printf("%s\n",array); + free(array); + lpfnDoneRequest(request_id); + + FreeLibrary(handle); + + return 0; +} diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsp b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsp new file mode 100644 index 0000000..a6c53b0 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsp @@ -0,0 +1,113 @@ +# Microsoft Developer Studio Project File - Name="cdemo" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=cdemo - 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 "cdemo.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 "cdemo.mak" CFG="cdemo - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "cdemo - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "cdemo - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "cdemo - Win32 Release" +# Name "cdemo - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\cdemo.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsw b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsw new file mode 100644 index 0000000..883b7e0 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "cdemo"=.\cdemo.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.sln b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.sln new file mode 100644 index 0000000..7d26c36 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cdemo", "cdemo.vcproj", "{30D7BBD6-5766-4A88-818A-47AC1520B484}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {30D7BBD6-5766-4A88-818A-47AC1520B484}.Debug|Win32.ActiveCfg = Debug|Win32 + {30D7BBD6-5766-4A88-818A-47AC1520B484}.Debug|Win32.Build.0 = Debug|Win32 + {30D7BBD6-5766-4A88-818A-47AC1520B484}.Release|Win32.ActiveCfg = Release|Win32 + {30D7BBD6-5766-4A88-818A-47AC1520B484}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.vcproj b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.vcproj new file mode 100644 index 0000000..f5d0004 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.vcproj @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/test.php b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/test.php new file mode 100644 index 0000000..54b255b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/test.php @@ -0,0 +1,5 @@ + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.cpp b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.cpp new file mode 100644 index 0000000..976384e --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// cdemo.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.h b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.h new file mode 100644 index 0000000..1b40500 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.h @@ -0,0 +1,19 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) +#define AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.cpp b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.cpp new file mode 100644 index 0000000..02f788a --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.cpp @@ -0,0 +1,101 @@ +// cdemo.cpp : Defines the entry point for the console application. +// + + +# include "stdafx.h" +# include +# include +# include +# include + + +typedef int (WINAPI * ExecutePHP)(int request_id, char * filename); +typedef int (WINAPI * ExecuteCode)(int request_id, char * acode); +typedef void (WINAPI * RegisterVariable)(int request_id, char * aname, char * avalue); +typedef int (WINAPI * InitRequest)(void); +typedef void (WINAPI * DoneRequest)(int request_id); +typedef int (WINAPI * GetResultText)(int request_id, char *buf, int buflen); +typedef int (WINAPI * GetVariableSize)(int request_id, char *aname); +typedef int (WINAPI * GetVariable)(int request_id, char *aname, char *buf, int buflen); +typedef void (WINAPI * SaveToFile)(int request_id, char *filename); +typedef int (WINAPI * GetResultBufferSize)(int request_id); + +int main(int argc, char* argv[]) +{ + ExecutePHP lpfnExecutePHP; + RegisterVariable lpfnRegisterVariable; + ExecuteCode lpfnExecuteCode; + InitRequest lpfnInitRequest; + DoneRequest lpfnDoneRequest; + GetResultText lpfnGetResultText; + GetVariableSize lpfnGetVariableSize; + GetVariable lpfnGetVariable; + SaveToFile lpfnSaveToFile; + GetResultBufferSize lpfnGetResultBufferSize; + + HMODULE handle; + char *array; + int request_id; + int len; + + handle = LoadLibrary("php4app.dll"); + if( handle == NULL ) + return FALSE ; + + lpfnRegisterVariable = (RegisterVariable) GetProcAddress(handle, "RegisterVariable"); + lpfnExecutePHP = (ExecutePHP) GetProcAddress(handle, "ExecutePHP"); + lpfnExecuteCode = (ExecuteCode)GetProcAddress(handle, "ExecuteCode"); + lpfnInitRequest = (InitRequest)GetProcAddress(handle, "InitRequest"); + lpfnDoneRequest = (DoneRequest)GetProcAddress(handle, "DoneRequest"); + lpfnGetResultText = (GetResultText)GetProcAddress(handle, "GetResultText"); + lpfnGetVariableSize = (GetVariableSize)GetProcAddress(handle, "GetVariableSize"); + lpfnGetVariable = (GetVariable)GetProcAddress(handle, "GetVariable"); + lpfnSaveToFile = (SaveToFile)GetProcAddress(handle, "SaveToFile"); + lpfnGetResultBufferSize = (GetResultBufferSize)GetProcAddress(handle, "GetResultBufferSize"); + + if(lpfnRegisterVariable == NULL || + lpfnExecutePHP == NULL || + lpfnExecuteCode == NULL ) + { + FreeLibrary( handle ) ; + return FALSE ; + } + + request_id = lpfnInitRequest(); + lpfnRegisterVariable(request_id, "x", "2"); + lpfnRegisterVariable(request_id, "y", "3"); + lpfnRegisterVariable(request_id, "z", "0"); + + lpfnExecutePHP(request_id, "test.php"); + + len = lpfnGetResultText(request_id, NULL, 0); + array = (char *)malloc(len); + lpfnGetResultText(request_id, array, len); + printf("\n"); + printf("%s\n",array); + free(array); + + //get variable value after execution + len = lpfnGetVariableSize(request_id, "z"); + if (len > 0) { + array = (char *)malloc(len); + lpfnGetVariable(request_id, "z", array, len); + printf("after execution variable z = %s\n", array); + free(array); + } + lpfnDoneRequest(request_id); + + request_id = lpfnInitRequest(); + lpfnExecuteCode(request_id, "echo \"embedded script demo\\n\";"); + len = lpfnGetResultText(request_id, NULL, 0); + array = (char *)malloc(len); + lpfnGetResultText(request_id, array, len); + printf("\n"); + printf("%s\n",array); + free(array); + lpfnDoneRequest(request_id); + + FreeLibrary(handle); + + return 0; +} diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsp b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsp new file mode 100644 index 0000000..a6c53b0 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsp @@ -0,0 +1,113 @@ +# Microsoft Developer Studio Project File - Name="cdemo" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=cdemo - 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 "cdemo.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 "cdemo.mak" CFG="cdemo - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "cdemo - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "cdemo - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "cdemo - Win32 Release" +# Name "cdemo - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\cdemo.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsw b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsw new file mode 100644 index 0000000..883b7e0 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "cdemo"=.\cdemo.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/test.php b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/test.php new file mode 100644 index 0000000..54b255b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/test.php @@ -0,0 +1,5 @@ + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.pas b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.pas new file mode 100644 index 0000000..d503729 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.pas @@ -0,0 +1,142 @@ +unit php4Delphi.MainForm; + +interface + +uses + System.Drawing, System.Collections, System.ComponentModel, + System.Windows.Forms, System.Data, System.Text, System.Runtime.InteropServices; + +type + TWinForm = class(System.Windows.Forms.Form) + {$REGION 'Designer Managed Code'} + strict private + /// + /// Required designer variable. + /// + Components: System.ComponentModel.Container; + TextBox1: System.Windows.Forms.TextBox; + Button1: System.Windows.Forms.Button; + OpenFileDialog1: System.Windows.Forms.OpenFileDialog; + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + procedure InitializeComponent; + procedure Button1_Click(sender: System.Object; e: System.EventArgs); + {$ENDREGION} + strict protected + /// + /// Clean up any resources being used. + /// + procedure Dispose(Disposing: Boolean); override; + private + { Private Declarations } + public + constructor Create; + end; + + [assembly: RuntimeRequiredAttribute(TypeOf(TWinForm))] + +implementation + +uses php4Delphi.Standard; + +{$AUTOBOX ON} + +{$REGION 'Windows Form Designer generated code'} +/// +/// Required method for Designer support -- do not modify +/// the contents of this method with the code editor. +/// +procedure TWinForm.InitializeComponent; +begin + Self.TextBox1 := System.Windows.Forms.TextBox.Create; + Self.Button1 := System.Windows.Forms.Button.Create; + Self.OpenFileDialog1 := System.Windows.Forms.OpenFileDialog.Create; + Self.SuspendLayout; + // + // TextBox1 + // + Self.TextBox1.Location := System.Drawing.Point.Create(8, 16); + Self.TextBox1.Multiline := True; + Self.TextBox1.Name := 'TextBox1'; + Self.TextBox1.ScrollBars := System.Windows.Forms.ScrollBars.Both; + Self.TextBox1.Size := System.Drawing.Size.Create(272, 180); + Self.TextBox1.TabIndex := 0; + Self.TextBox1.Text := ''; + // + // Button1 + // + Self.Button1.Location := System.Drawing.Point.Create(12, 224); + Self.Button1.Name := 'Button1'; + Self.Button1.TabIndex := 1; + Self.Button1.Text := 'Execute'; + Include(Self.Button1.Click, Self.Button1_Click); + // + // OpenFileDialog1 + // + Self.OpenFileDialog1.Filter := 'PHP files|*.php'; + // + // TWinForm + // + Self.AutoScaleBaseSize := System.Drawing.Size.Create(5, 13); + Self.ClientSize := System.Drawing.Size.Create(292, 266); + Self.Controls.Add(Self.Button1); + Self.Controls.Add(Self.TextBox1); + Self.FormBorderStyle := System.Windows.Forms.FormBorderStyle.FixedDialog; + Self.MaximizeBox := False; + Self.MinimizeBox := False; + Self.Name := 'TWinForm'; + Self.StartPosition := System.Windows.Forms.FormStartPosition.CenterScreen; + Self.Text := 'php4delphi'; + Self.ResumeLayout(False); +end; +{$ENDREGION} + +procedure TWinForm.Dispose(Disposing: Boolean); +begin + if Disposing then + begin + if Components <> nil then + Components.Dispose(); + end; + inherited Dispose(Disposing); +end; + +constructor TWinForm.Create; +begin + inherited Create; + // + // Required for Windows Form Designer support + // + InitializeComponent; + // + // TODO: Add any constructor code after InitializeComponent call + // +end; + +procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs); +var + RequestID : integer; + L : integer; + builder : StringBuilder; +begin + if OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK then + begin + RequestID := InitRequest; + ExecutePHP(RequestID, OpenFileDialog1.FileName); + L := GetResultBufferSize(RequestID); + if L > 0 then + begin + builder := StringBuilder.Create; + builder.Capacity := L; + GetResultText(RequestID, builder, L +1); + TextBox1.Text := builder.ToString; + DoneRequest(RequestID); + builder.Free; + end; + end; + +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.resx b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.resx new file mode 100644 index 0000000..acc72bf --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.resx @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + Private + + + False + + + Private + + + Private + + + 17, 17 + + + False + + + (Default) + + + False + + + False + + + 4, 4 + + + True + + + 80 + + + True + + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.Standard.pas b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.Standard.pas new file mode 100644 index 0000000..207997d --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.Standard.pas @@ -0,0 +1,52 @@ +unit php4Delphi.Standard; + +interface +uses + Types, System.Text, System.Runtime.InteropServices; + +function InitRequest : integer; +procedure DoneRequest(RequestID : integer); +procedure RegisterVariable(RequestID : integer; AName : string; AValue : string); +function ExecutePHP(RequestID : integer; FileName : string) : integer; +function ExecuteCode(RequestID : integer; ACode : string) : integer; +function GetResultText(RequestID : integer; Buffer : StringBuilder; BufLen : integer) : integer; +function GetVariable(RequestID : integer; AName : string; Buffer : StringBuilder; BufLen : integer) : integer; +procedure SaveToFile(RequestID : integer; AFileName : string); +function GetVariableSize(RequestID : integer; AName : string) : integer; +function GetResultBufferSize(RequestID : integer) : integer; + +implementation +uses + System.Security; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function InitRequest; external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +procedure DoneRequest; external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +procedure RegisterVariable;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function ExecutePHP;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function ExecuteCode;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function GetResultText;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function GetVariable;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +procedure SaveToFile;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function GetVariableSize;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function GetResultBufferSize;external; + +end. diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources new file mode 100644 index 0000000000000000000000000000000000000000..f476cd20675301e2f14894e1bd1e1032fc6bdfad GIT binary patch literal 4101 zcmd57%Q6rQb}^g6Hq+AAm}NMo!mPd4HAd^qOeHl-F-(=$tX@k;x4Fjr zPs_}1Tc?sQFw^3OK0lStq-QdjOgfWF<{Z^_Og67G$2O^&N|v0O%9ZC>t72Sd`h0C} zj?O4Evr|{HPqWPBE68#Xstold;eXLER7UlqcEtsJ-lSVxZ=}n7hozF;%0o^nlU<)# zpIe`rs?TI-mNo_Gl4{hb%6F&@VM>e86!dlDsHgU#a9Ggo?DSECYXUrH)LGup(ko1> zF>}GTO;Sr9@14{nMw=t?KfVZ{IvMiZ_3;6-P`^1 z>)bb=f4g?^nVUZ**LEj9E{E^z+=)N7_SN7!6CaNM5W4roAFtfVzI%4o`V4mK2e5VT zf~-Xe%Ip2Du3GEY#D`z76tkkT?6FKS^w|K{&BUn&gQ|DA^)QAUUanS-`*_ zD8uj$VPrOFungbpq(K~z4KVl>49<1BSSAK=qC|BOD5*h7$K9rCcRi+fFU8UNytA?P+|#VV^HjVaWSGQ zqE$Dk>M$Zn3909+{$pTLc@Sr&51pUvMs{yf^w_t>>-L7c!FXfCCL|g~Wmwe2u^yW4 zky_@Djahm>P8nUD($uFW9y1_V<+&#N)RhR^(NvQVe4s3*is0Ks+8s#eL`Eeg)|< zJH4DMdV=Z}&k44kDyCE2YmNB~VQ+Gs+byB? zxpu3^#SDWUN4sY36C4m)4{{KCD_m8X*X=lEC%a;i=M8RKqy8L(D^EM_YfB=oC2HHu z)c5p75n`bq^^gPFF~KVU;;RGJBf`3iNW6XYd+&%*xHNekj#G)67F)22?$#L(X#Ew5 zL?Tjmf$i2V(T;*Z z9)d=wNQ?4uXhi)LmWQDiyX1Fc2o*yhc?5o>^YSQ&(C@E(iAM-eFjl{~mzn6G9kQW*2JS8zQb*$M}1cR E0!;FGc>n+a literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj new file mode 100644 index 0000000..12c9a32 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + php4DelphiDemo.dpr + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + + + + + c:\windows\microsoft.net\framework\v1.1.4322 + c:\windows\microsoft.net\framework\v1.1.4322\System.XML.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Data.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.dll + + + True + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2067 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.dpr b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.dpr new file mode 100644 index 0000000..d37c1ac --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.dpr @@ -0,0 +1,100 @@ +program php4DelphiDemo; + +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Data.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Drawing.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.XML.dll'} +{$R 'php4Delphi.TWinForm.resources' 'php4Delphi.MainForm.resx'} + +uses + System.Reflection, + System.Runtime.CompilerServices, + System.Runtime.InteropServices, + System.Windows.Forms, + php4Delphi.MainForm in 'php4Delphi.MainForm.pas' {php4Delphi.MainForm.TWinForm: System.Windows.Forms.Form}, + php4Delphi.Standard in 'php4Delphi.Standard.pas'; + +{$R *.res} + +{$REGION 'Program/Assembly Information'} +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] +{$ENDREGION} + +[STAThread] +begin + Application.Run(TWinForm.Create); +end. diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.res b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..1a2a5351351f74623445cfa337f0921616711e7c GIT binary patch literal 4396 zcmcJTJ&q(r5QTHJNQ1?W1b&Z+#^MIO2nz$S%C4hSagttRg-~6h+eTxKi8OnJH8GHq z_r1ud%ITdSEi5U;WLEyfdoLogYSg8aaxJShOv4B5_p4lgr9Bs3ySn=N%iQ#>2G_DT zvI~zi(3$_Ey?gt%%yRsg8E-d~vX`Cp!#H{Qzy86`G7Y8fZ^|N^MLlEqxM^-UEVgpE z+s2yz9BmkdJxzr;fcpSD0l)%#T1vUE;&2x+$@Lfdd7jI;Er-c-#+N=gFc)!9EXqxI zMgJ7KjeQh0wtHFsfKS;lDXwGd^$eFqT26nSO6nhkQ^kY%iDAS}oKDBX-l^6|X> z)M{*SbtdNmJ2=$a+X61@=Av;u5Qj4k#2nK)%^cd;6WyQ00h@7R`;2fR9&Jr~sx*P^ z{NGC-9GJ&;8n;?Z><;Rq;fj687)NbKjkh_i5ohBaBL{HcEIhbt=Djz9N@5XP@Ya}Uyv7?$JyX}NGqA_5 zCMWq-9>B%2CK5m59XT}*aD-hOK01tlylWg<{%hbE8_avDYGTMbYnoR7QN?j+ijJLZCK?2kPfkCWFpN6UMQZ}ul{#(qhy;+I%i z6Yj;m_kkZjYu-7K&*aYgiv0G?d#hr*>Zj(UU;Niz`j=dnKIe1l>O*_c%pFYazBj~N zI++6p{*3#^Tm>H!*G=2T!8sH@K8WMWOB}p^ANc6RzrVv;>+dt)g{qpZXe{p~#99(}>pA6U#=o5qoYo2Z4x#cPMYenLOkaO$ncH=gP?@$(+g6C1F7m$j$YKY%OC zdcY5s+#EAuTf2S4`=Q5X3@>wNHJCg+=Uga$I?uED?BN40_~bx#j6066%!&Icw8uL$ za&V5%GrIhK?Kw#Q8gJpTZVpr2Ve-SXc?zHV<+@K!@De`x_q&g=YV@gQKab#tCe@$# z5F77PF6blYnWKz{dhtzcpBD#u?5UP|GXC_w3(`SO9rImaJjlKB;Aidg_mzGM-TAG4 z2|GFYE;gOXgR|&?dDI&mGXIGkbE(^B4yqgFsK5V-^HjgaK)FtQ$3gkUXXICyj)Qvf zG8Z(<*yCCoWL$ z_~SQ!@BWSMa}GQci_FQR@gOELuSs{_2hM%YmOL`v#2-w!t#calj{lTa>pX}3da9=~ z>%YhHcPU@|Rm$rRviBOx%Bk6`zS%4FPuZo`E>E)eVfH0|JNezq|5VFGt*6WSO)2F& nS*>4{pUU^;$MUo6hw_X1Z2j*V{F + + {B674DAD8-5C53-4B84-BE6D-7CD1D1C5ACDB} + Project1.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Project1.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
Form1
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.res b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..55f874204136d6cde31b105890029f4503c878e3 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~TWm~%7FH&uWyHcFg^CccPz(RS*=&<05J-d+UUf~tKNE-t+g#=E zNNH(l5wgCWy~_uF40${AX5Q>hmRkU56V3%N+_8_nsvc3Jq}FKc*DBE|gEnzRD3odT z{B9}0AJQ~9t_+D3MNzQehw#n?$2H95lfjzJMiq+xpGS}RU|YW7TGAUn=>TJR9vbuv zQKv^fLP$_BH=di&s%NpygeRq7WOL!AU~H`oJdv~Xnj7J9-%dk4aAV5-jBGG4rXS8T z#&1Awg!ePy@tV(f_@tlj=qJ`@+x_IZ=P3K1ZEocskt@zKp3bKiEbG`L>hS!nd7PP< z*YiLohG%h>ba`1aP@aA!Bu=2+E0lZZSF-?KK7q>;Epm@~@dtdZ0(&$OeF0BP;A;i7bZNA5i@Ni6 j1fWAWcYr%w;}-YC4Ibz#+kO}RH7K;(HF*{O6)AiJ<8sA5 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.ddp b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.dfm b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.dfm new file mode 100644 index 0000000..b1b2df7 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.dfm @@ -0,0 +1,62 @@ +object Form1: TForm1 + Left = 259 + Top = 321 + BorderStyle = bsDialog + Caption = 'Form1' + ClientHeight = 296 + ClientWidth = 609 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Memo1: TMemo + Left = 16 + Top = 12 + Width = 581 + Height = 241 + Lines.Strings = ( + '$z = $x + $y; echo "Result "; echo $z;') + TabOrder = 0 + end + object btnExecuteScript: TButton + Left = 16 + Top = 264 + Width = 101 + Height = 25 + Caption = 'Execute script' + TabOrder = 1 + OnClick = btnExecuteScriptClick + end + object btnExecuteCode: TButton + Left = 124 + Top = 264 + Width = 109 + Height = 25 + Caption = 'Execute Code' + TabOrder = 2 + OnClick = btnExecuteCodeClick + end + object btnClose: TButton + Left = 524 + Top = 264 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 3 + OnClick = btnCloseClick + end + object btnExecuteAndSave: TButton + Left = 240 + Top = 264 + Width = 145 + Height = 25 + Caption = 'Execute and Save' + TabOrder = 4 + OnClick = btnExecuteAndSaveClick + end +end diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas new file mode 100644 index 0000000..10d384c --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas @@ -0,0 +1,120 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, PHP4AppIntf; + +type + TForm1 = class(TForm) + Memo1: TMemo; + btnExecuteScript: TButton; + btnExecuteCode: TButton; + btnClose: TButton; + btnExecuteAndSave: TButton; + procedure btnExecuteScriptClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure btnExecuteCodeClick(Sender: TObject); + procedure btnExecuteAndSaveClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + RequestID : integer; + end; + +var + Form1: TForm1; + + +implementation + +{$R *.DFM} + +procedure TForm1.btnExecuteScriptClick(Sender: TObject); +var + S : AnsiString; + L : integer; +begin + Memo1.Lines.Clear; + RequestID := InitRequest; + RegisterVariable(RequestID, 'x','2'); + RegisterVariable(RequestID, 'y','3'); + RegisterVariable(RequestID, 'z','0'); + ExecutePHP(RequestID, 'test.php'); + L := GetResultText(RequestID, nil, 0); + if L > 0 then + begin + SetLength(S, L); + GetResultText(RequestID, PAnsiChar(S), L); + end; + memo1.Lines.Text := WideString(S); + L := GetVariableSize(RequestID, 'z'); + if L > 0 then + begin + SetLength(S, L); + GetVariable(RequestID, 'z', PAnsiChar(S), L); + ShowMessage('After execution z = ' + WideString(S)); + end; + DoneRequest(RequestID); +end; + +procedure TForm1.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TForm1.btnExecuteCodeClick(Sender: TObject); +var + S : AnsiString; + L : integer; +begin + Memo1.Lines.Clear; + RequestID := InitRequest; + RegisterVariable(RequestID, 'x','2'); + RegisterVariable(RequestID, 'y','3'); + RegisterVariable(RequestID, 'z','0'); + ExecuteCode(RequestID, '$z = $x + $y; echo "Result "; echo $z;'); + L := GetResultBufferSize(RequestID); + if L > 0 then + begin + SetLength(S, L); + GetResultText(RequestID, PAnsiChar(S), L); + end; + memo1.Lines.Text := WideString(S); + L := GetVariableSize(RequestID, 'z'); + if L > 0 then + begin + SetLength(S, L); + GetVariable(RequestID, 'z', PAnsiChar(S), L); + ShowMessage('After execution z = ' + WideString(S)); + end; + DoneRequest(RequestID); +end; + +procedure TForm1.btnExecuteAndSaveClick(Sender: TObject); +begin + Memo1.Lines.Clear; + RequestID := InitRequest; + RegisterVariable(RequestID, 'x','2'); + RegisterVariable(RequestID, 'y','3'); + RegisterVariable(RequestID, 'z','0'); + ExecuteCode(RequestID, '$z = $x + $y; echo "Result "; echo $z;'); + SaveToFile(RequestID, 'result.txt'); + memo1.Lines.LoadFromFile('result.txt'); + DoneRequest(RequestID); +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/result.txt b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/result.txt new file mode 100644 index 0000000..0f9b03d --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/result.txt @@ -0,0 +1 @@ +Result 5 \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/test.php b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/test.php new file mode 100644 index 0000000..54b255b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/test.php @@ -0,0 +1,5 @@ + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/Doc1.doc b/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/Doc1.doc new file mode 100644 index 0000000000000000000000000000000000000000..8ec8081cbc3970bea13ad295888f7791e88daaac GIT binary patch literal 33280 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 ZmuyaS=Ud_V#Yg|rB4Ui1|KB9=e*m*y8^r(s literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/test.php b/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/test.php new file mode 100644 index 0000000..d3fccb8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/test.php @@ -0,0 +1,4 @@ + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi.sln b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi.sln new file mode 100644 index 0000000..5eb86b4 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "php4delphi", "php4delphi\php4delphi.vbproj", "{98A25626-5C96-46EB-8A80-2D2C7236D025}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {98A25626-5C96-46EB-8A80-2D2C7236D025}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98A25626-5C96-46EB-8A80-2D2C7236D025}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98A25626-5C96-46EB-8A80-2D2C7236D025}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98A25626-5C96-46EB-8A80-2D2C7236D025}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb new file mode 100644 index 0000000..3dc6448 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb @@ -0,0 +1,15 @@ +Namespace My + + ' The following events are availble for MyApplication: + ' + ' Startup: Raised when the application starts, before the startup form is created. + ' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally. + ' UnhandledException: Raised if the application encounters an unhandled exception. + ' StartupNextInstance: Raised when launching a single-instance application and the application is already active. + ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected. + Partial Friend Class MyApplication + + End Class + +End Namespace + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb new file mode 100644 index 0000000..3adb089 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb @@ -0,0 +1,71 @@ + _ +Partial Class Form1 + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + MyBase.Dispose(disposing) + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.TextBox1 = New System.Windows.Forms.TextBox + Me.Button1 = New System.Windows.Forms.Button + Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog + Me.SuspendLayout() + ' + 'TextBox1 + ' + Me.TextBox1.Location = New System.Drawing.Point(10, 16) + Me.TextBox1.Multiline = True + Me.TextBox1.Name = "TextBox1" + Me.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both + Me.TextBox1.Size = New System.Drawing.Size(588, 177) + Me.TextBox1.TabIndex = 0 + ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(13, 223) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(75, 23) + Me.Button1.TabIndex = 1 + Me.Button1.Text = "Execute" + Me.Button1.UseVisualStyleBackColor = True + ' + 'OpenFileDialog1 + ' + Me.OpenFileDialog1.Filter = "PHP files|*.php" + Me.OpenFileDialog1.Title = "Select script to execute" + ' + 'Form1 + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(610, 266) + Me.Controls.Add(Me.Button1) + Me.Controls.Add(Me.TextBox1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "Form1" + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen + Me.Text = "php4delphi" + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents TextBox1 As System.Windows.Forms.TextBox + Friend WithEvents Button1 As System.Windows.Forms.Button + Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog + +End Class diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx new file mode 100644 index 0000000..710a648 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb new file mode 100644 index 0000000..06fe6d4 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb @@ -0,0 +1,32 @@ +Imports System.Runtime.InteropServices + +Public Class Form1 + + Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click + Dim L As Integer + Dim builder As StringBuilder = New StringBuilder + Dim RequestID As Integer + Dim fn As String + If OpenFileDialog1.ShowDialog Then + RequestID = InitRequest() + fn = OpenFileDialog1.FileName + ExecutePHP(RequestID, fn) + L = GetResultText(RequestID, builder, 0) + builder.Capacity = L + L = GetResultText(RequestID, builder, builder.Capacity + 1) + TextBox1.Text = builder.ToString() + DoneRequest(RequestID) + End If + End Sub + Public Declare Ansi Function ExecutePHP Lib "php4app.dll" (ByVal RequestID As Integer, ByVal FileName As String) As Integer + Public Declare Ansi Function InitRequest Lib "php4app.dll" () As Integer + Public Declare Ansi Sub DoneRequest Lib "php4app.dll" (ByVal RequestID As Integer) + Public Declare Ansi Function GetResultText Lib "php4app.dll" (ByVal RequestID As Integer, ByVal Buf As StringBuilder, ByVal Buflen As Integer) As Integer + Public Declare Ansi Sub RegisterVariable Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String, ByVal AValue As String) + Public Declare Ansi Function ExecuteCode Lib "php4app.dll" (ByVal RequestID As Integer, ByVal ACode As String) As Integer + Public Declare Ansi Function GetVariable Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String, ByVal Buffer As StringBuilder, ByVal BufLen As Integer) As Integer + Public Declare Ansi Sub SaveToFile Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AFileName As String) + Public Declare Ansi Function GetVariableSize Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String) As Integer + Public Declare Ansi Function GetResultBufferSize Lib "php4app.dll" (ByVal RequestID As Integer) As Integer + +End Class diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb new file mode 100644 index 0000000..83b31ad --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:2.0.50727.42 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'NOTE: This file is auto-generated; do not modify it directly. To make changes, + ' or if you encounter build errors in this file, go to the Project Designer + ' (go to Project Properties or double-click the My Project node in + ' Solution Explorer), and make changes on the Application tab. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.php4delphi.Form1 + End Sub + End Class +End Namespace diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp new file mode 100644 index 0000000..c0f7fef --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + true + Form1 + false + 0 + true + 0 + true + \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj new file mode 100644 index 0000000..c09f7d4 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj @@ -0,0 +1,88 @@ + + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {98A25626-5C96-46EB-8A80-2D2C7236D025} + WinExe + php4delphi.My.MyApplication + php4delphi + php4delphi + WindowsForms + + + true + full + true + true + bin\Debug\ + php4delphi.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\Release\ + php4delphi.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + + + + + + + + + + + + + + + + + + + + + + Form + + + Form1.vb + Form + + + True + Application.myapp + + + + + Designer + Form1.vb + + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + + + \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user new file mode 100644 index 0000000..c8dfea1 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user @@ -0,0 +1,16 @@ + + + publish\ + + + + + + + + + 0 + en-US + false + + \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/Form1.frm b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/Form1.frm new file mode 100644 index 0000000..c42d183 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/Form1.frm @@ -0,0 +1,50 @@ +VERSION 5.00 +Begin VB.Form Form1 + Caption = "Form1" + ClientHeight = 6870 + ClientLeft = 60 + ClientTop = 345 + ClientWidth = 8790 + LinkTopic = "Form1" + ScaleHeight = 6870 + ScaleWidth = 8790 + StartUpPosition = 3 'Windows Default + Begin VB.CommandButton ButtonExecute + Caption = "Execute" + Height = 375 + Left = 7560 + TabIndex = 1 + Top = 360 + Width = 1095 + End + Begin VB.TextBox Text1 + Height = 6495 + Left = 240 + MultiLine = -1 'True + TabIndex = 0 + Top = 240 + Width = 7215 + End +End +Attribute VB_Name = "Form1" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Private Sub ButtonExecute_Click() +Dim code As Long +Dim RequestID As Long +Dim L As Long +Dim Res As String + + Res = "" + RequestID = InitRequest() + code = ExecutePHP(RequestID, "c:\php5\test.php") + L = GetResultText(RequestID, Res, 0) + Res = Space(L + 1) + + L = GetResultText(RequestID, Res, L) + DoneRequest (RequestID) + Text1.Text = Res + +End Sub diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/MSSCCPRJ.SCC b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/MSSCCPRJ.SCC new file mode 100644 index 0000000..57528cb --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/MSSCCPRJ.SCC @@ -0,0 +1,5 @@ +[SCC] +SCC=This is a source code control file +[php_VB.vbp] +SCC_Project_Name=this project is not under source code control +SCC_Aux_Path= diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbp b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbp new file mode 100644 index 0000000..99d5b15 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbp @@ -0,0 +1,32 @@ +Type=Exe +Form=Form1.frm +Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\StdOle2.Tlb#OLE Automation +Module=php_module; php_module.bas +IconForm="Form1" +Startup="Form1" +ExeName32="php_VB.exe" +Command32="" +Name="php_VB" +HelpContextID="0" +CompatibleMode="0" +MajorVer=1 +MinorVer=0 +RevisionVer=0 +AutoIncrementVer=0 +ServerSupportFiles=0 +VersionCompanyName="Fedpol" +CompilationType=0 +OptimizationType=0 +FavorPentiumPro(tm)=0 +CodeViewDebugInfo=0 +NoAliasing=0 +BoundsCheck=0 +OverflowCheck=0 +FlPointCheck=0 +FDIVCheck=0 +UnroundedFP=0 +StartMode=0 +Unattended=0 +Retained=0 +ThreadPerObject=0 +MaxNumberOfThreads=1 diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbw b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbw new file mode 100644 index 0000000..0c44b62 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbw @@ -0,0 +1,2 @@ +Form1 = 66, 66, 702, 613, , 22, 22, 658, 569, C +php_module = 44, 44, 680, 591, diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_module.bas b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_module.bas new file mode 100644 index 0000000..ff67043 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_module.bas @@ -0,0 +1,14 @@ +Attribute VB_Name = "php_module" +Option Explicit + +Public Declare Function ExecutePHP Lib "php4app.dll" (ByVal RequestID As Long, ByVal FileName As String) As Long +Public Declare Function InitRequest Lib "php4app.dll" () As Long +Public Declare Sub DoneRequest Lib "php4app.dll" (ByVal RequestID As Long) +Public Declare Function GetResultText Lib "php4app.dll" (ByVal RequestID As Long, ByVal Buf As String, ByVal Buflen As Long) As Long +Public Declare Sub RegisterVariable Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String, ByVal AValue As String) +Public Declare Function ExecuteCode Lib "php4app.dll" (ByVal RequestID As Long, ByVal ACode As String) As Long +Public Declare Function GetVariable Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String, ByVal Buffer As String, ByVal BufLen As Long) As Long +Public Declare Sub SaveToFile Lib "php4app.dll" (ByVal RequestID As Long, ByVal AFileName As String) +Public Declare Function GetVariableSize Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String) As Long +Public Declare Function GetResultBufferSize Lib "php4app.dll" (ByVal RequestID As Long) As Long + diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/test.php b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/test.php new file mode 100644 index 0000000..d3fccb8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/test.php @@ -0,0 +1,4 @@ + diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dpr new file mode 100644 index 0000000..0e34a1e --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dpr @@ -0,0 +1,14 @@ +program ComponentsDemo; + +uses + Forms, + Unit1 in 'Unit1.pas' {frmTest}; + +{$R *.RES} + +begin + Application.Initialize; + Application.Title := 'Components Demo'; + Application.CreateForm(TfrmTest, frmTest); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dproj new file mode 100644 index 0000000..1352cc9 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dproj @@ -0,0 +1,105 @@ + + + {7CFB4CFF-6CCB-4B1C-8CBB-047C7C66BD18} + ComponentsDemo.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + ComponentsDemo.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
frmTest
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + ComponentsDemo.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.res b/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.ddp b/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.dfm new file mode 100644 index 0000000..b51da76 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.dfm @@ -0,0 +1,60 @@ +object frmTest: TfrmTest + Left = 399 + Top = 356 + BorderStyle = bsDialog + Caption = 'Components demo' + ClientHeight = 252 + ClientWidth = 472 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 0 + Top = 226 + Width = 472 + Height = 26 + Align = alBottom + Caption = + 'This demo project shows how to access published property'#13#10'of Del' + + 'phi components from PHP script' + Color = clInfoBk + ParentColor = False + WordWrap = True + end + object memScript: TMemo + Left = 8 + Top = 8 + Width = 369 + Height = 213 + TabOrder = 0 + end + object btnExecute: TButton + Left = 384 + Top = 12 + Width = 75 + Height = 25 + Caption = '&Execute' + TabOrder = 1 + OnClick = btnExecuteClick + end + object PHP: TpsvPHP + Variables = <> + Left = 400 + Top = 136 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 408 + Top = 88 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas new file mode 100644 index 0000000..d0afb70 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas @@ -0,0 +1,134 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +//This demo project shows how to access published property +//of Delphi components from PHP script + +{$I PHP.INC} + +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, php4delphi, PHPCommon; + +type + + TMyButton = class(TButton) + private + function GetFontSize: integer; + procedure SetFontSize(const Value: integer); + published + property FontSize : integer read GetFontSize write SetFontSize; + end; + + TfrmTest = class(TForm) + memScript: TMemo; + btnExecute: TButton; + PHP: TpsvPHP; + Label1: TLabel; + PHPEngine: TPHPEngine; + procedure btnExecuteClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + btnClose : TMyButton; + end; + +var + frmTest: TfrmTest; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TfrmTest.btnExecuteClick(Sender: TObject); +begin + PHP.RunCode(memScript.Lines.Text); +end; + +procedure TfrmTest.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmTest.FormCreate(Sender: TObject); +begin + btnClose := TMyButton.Create(Self); + with btnClose do + begin + Name := 'btnClose'; + Parent := Self; + Left := 384; + Top := 42; + Width := 75; + Height := 25; + Caption := '&Close'; + TabOrder := 2; + OnClick := btnCloseClick; + end; + + memScript.Lines.Clear; + with memScript.Lines do + begin + {$IFDEF PHP4} + Add('$btnClose = register_delphi_component("btnClose");'); + Add('$frmTest = register_delphi_component("frmTest");'); + Add('$btnClose->Caption = "&Exit";'); + Add('$frmTest->Caption = "PHP4Delphi demo";'); + Add('$btnClose->Top = 150;'); + Add('$btnClose->Font->Size = 10;'); + Add('$btnClose->Cursor = -21;'); + Add('$frmTest->Color = clGreen;'); + Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); + Add('delphi_show_message($st);'); + {$ELSE} + Add('$btnClose = register_delphi_component("btnClose");'); + Add('$frmTest = register_delphi_component("frmTest");'); + Add('$btnClose->Caption = "&Exit";'); + Add('$frmTest->Caption = "PHP4Delphi demo";'); + Add('$btnClose->Top = 150;'); + Add('$btnClose->FontSize = 10;'); + Add('$btnClose->Cursor = -21;'); + Add('$frmTest->Color = clGreen;'); + Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); + Add('delphi_show_message($st);'); + {$ENDIF} + end; + PHPEngine.StartupEngine; +end; + +procedure TfrmTest.FormDestroy(Sender: TObject); +begin + btnClose.Free; + PHPEngine.ShutdownEngine; +end; + +{ TMyButton } + +function TMyButton.GetFontSize: integer; +begin + Result := Font.Size; +end; + +procedure TMyButton.SetFontSize(const Value: integer); +begin + Font.Size := Value; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/Components/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ + Left = 24 + Top = 20 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 24 + Top = 72 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.pas new file mode 100644 index 0000000..018bb49 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.pas @@ -0,0 +1,49 @@ +unit DemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + phpShellLibrary, StdCtrls, php4delphi, PHPCommon; + +type + TForm1 = class(TForm) + psvPHP: TpsvPHP; + PHPEngine: TPHPEngine; + Button1: TButton; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + Lib : TphpShellLibrary; + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TForm1.FormCreate(Sender: TObject); +begin + Lib := TphpShellLibrary.Create(Self); + PHPEngine.StartupEngine; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + Lib.Free; + PHPEngine.ShutdownEngine; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + psvPHP.RunCode('shellexecute(0, "open", "calc.exe", "", "", 0);'); +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dpr new file mode 100644 index 0000000..e2d6586 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dpr @@ -0,0 +1,13 @@ +program ExtDemo; + +uses + Forms, + DemoMain in 'DemoMain.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dproj new file mode 100644 index 0000000..c1e5a51 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dproj @@ -0,0 +1,105 @@ + + + {27187867-4284-46FA-A57E-1EB08287FB00} + ExtDemo.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + ExtDemo.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
Form1
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + ExtDemo.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.res b/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ + + {F8C7576D-0982-4AF6-A5A1-5125A03FD478} + dynamic_array.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + dynamic_array.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + VCLApplication + + + + dynamic_array.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dpr new file mode 100644 index 0000000..200b019 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dpr @@ -0,0 +1,14 @@ +program EncDemo; + +uses + Forms, + uMain in 'uMain.pas' {frmMain}; + +{$R *.res} + +begin + Application.Initialize; + Application.Title := 'Encryption Demo'; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dproj new file mode 100644 index 0000000..f77a012 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dproj @@ -0,0 +1,105 @@ + + + {B7CB4E60-B659-41B1-A05E-202CF09C7BFE} + EncDemo.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + EncDemo.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
frmMain
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + EncDemo.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.res b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ +// Distributed under the GNU General Public Licence +// ***************************************************************************** + +class Encryption { + + var $scramble1; // 1st string of ASCII characters + var $scramble2; // 2nd string of ASCII characters + var $errors; // array of error messages + var $adj; // 1st adjustment value (optional) + var $mod; // 2nd adjustment value (optional) + + // **************************************************************************** + // class constructor + // **************************************************************************** + function encryption () + { + //DebugBreak(); + $this->errors = array(); + + // Each of these two strings must contain the same characters, but in a different order. + // Use only printable characters from the ASCII table. + // Each character can only appear once in each string EXCEPT for the first character + // which must be duplicated at the end (this gets round a bijou problemette when the + // first character of the password is also the first character in $scramble1) + $this->scramble1 = '! "#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!'; + $this->scramble2 = 'f^jAE]okI\OzU[2&q1{3`h5w_794p@6s8?BgP>dFV=m Dscramble1) <> strlen($this->scramble2)) { + $this->errors[] = '** SCRAMBLE1 is not same length as SCRAMBLE2 **'; + } // if + + $this->adj = 1.75; // this value is added to the rolling fudgefactors + $this->mod = 3; // if divisible by this the adjustment is made negative + + } // constructor + + // **************************************************************************** + function decrypt ($key, $source) + // decrypt string into its original form + { + //DebugBreak(); + // convert $key into a sequence of numbers + $fudgefactor = $this->_convertKey($key); + if ($this->errors) return; + + if (empty($source)) { + $this->errors[] = 'No value has been supplied for decryption'; + return; + } // if + + $target = null; + $factor2 = 0; + + for ($i = 0; $i < strlen($source); $i++) { + // extract a character from $source + $char2 = substr($source, $i, 1); + + // identify its position in $scramble2 + $num2 = strpos($this->scramble2, $char2); + if ($num2 === false) { + $this->errors[] = "Source string contains an invalid character ($char)"; + return; + } // if + + // get an adjustment value using $fudgefactor + $adj = $this->_applyFudgeFactor($fudgefactor); + $factor1 = $factor2 + $adj; // accumulate in $factor1 + $num1 = round($factor1 * -1) + ($num2); // generate offset for $scramble1 + $num1 = $this->_checkRange($num1); // check range + $factor2 = $factor1 + $num2; // accumulate in $factor2 + + // extract character from $scramble1 + $char1 = substr($this->scramble1, $num1, 1); + + // append to $target string + $target .= $char1; + + //echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2
\n"; + + } // for + + return rtrim($target); + + } // decrypt + + // **************************************************************************** + function encrypt ($key, $source, $sourcelen = 0) + // encrypt string into a garbled form + { + //DebugBreak(); + // convert $key into a sequence of numbers + $fudgefactor = $this->_convertKey($key); + if ($this->errors) return; + + if (empty($source)) { + $this->errors[] = 'No value has been supplied for encryption'; + return; + } // if + + // pad $source with spaces up to $sourcelen + while (strlen($source) < $sourcelen) { + $source .= ' '; + } // while + + $target = null; + $factor2 = 0; + + for ($i = 0; $i < strlen($source); $i++) { + // extract a character from $source + $char1 = substr($source, $i, 1); + + // identify its position in $scramble1 + $num1 = strpos($this->scramble1, $char1); + if ($num1 === false) { + $this->errors[] = "Source string contains an invalid character ($char)"; + return; + } // if + + // get an adjustment value using $fudgefactor + $adj = $this->_applyFudgeFactor($fudgefactor); + $factor1 = $factor2 + $adj; // accumulate in $factor1 + $num2 = round($factor1) + ($num1); // generate offset for $scramble2 + $num2 = $this->_checkRange($num2); // check range + $factor2 = $factor1 + $num2; // accumulate in $factor2 + + // extract character from $scramble2 + $char2 = substr($this->scramble2, $num2, 1); + + // append to $target string + $target .= $char2; + + //echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2
\n"; + + } // for + + return $target; + + } // encrypt + + // **************************************************************************** + function getAdjustment () + // return the adjustment value + { + return $this->adj; + + } // setAdjustment + + // **************************************************************************** + function getModulus () + // return the modulus value + { + return $this->mod; + + } // setModulus + + // **************************************************************************** + function setAdjustment ($adj) + // set the adjustment value + { + $this->adj = (float)$adj; + + } // setAdjustment + + // **************************************************************************** + function setModulus ($mod) + // set the modulus value + { + $this->mod = (int)abs($mod); // must be a positive whole number + + } // setModulus + + // **************************************************************************** + // private methods + // **************************************************************************** + function _applyFudgeFactor (&$fudgefactor) + // return an adjustment value based on the contents of $fudgefactor + // NOTE: $fudgefactor is passed by reference so that it can be modified + { + $fudge = array_shift($fudgefactor); // extract 1st number from array + $fudge = $fudge + $this->adj; // add in adjustment value + $fudgefactor[] = $fudge; // put it back at end of array + + if (!empty($this->mod)) { // if modifier has been supplied + if ($fudge % $this->mod == 0) { // if it is divisible by modifier + $fudge = $fudge * -1; // make it negative + } // if + } // if + + return $fudge; + + } // _applyFudgeFactor + + // **************************************************************************** + function _checkRange ($num) + // check that $num points to an entry in $this->scramble1 + { + $num = round($num); // round up to nearest whole number + + // indexing starts at 0, not 1, so subtract 1 from string length + $limit = strlen($this->scramble1)-1; + + while ($num > $limit) { + $num = $num - $limit; // value too high, so reduce it + } // while + while ($num < 0) { + $num = $num + $limit; // value too low, so increase it + } // while + + return $num; + + } // _checkRange + + // **************************************************************************** + function _convertKey ($key) + // convert $key into an array of numbers + { + if (empty($key)) { + $this->errors[] = 'No value has been supplied for the encryption key'; + return; + } // if + + $array[] = strlen($key); // first entry in array is length of $key + + $tot = 0; + for ($i = 0; $i < strlen($key); $i++) { + // extract a character from $key + $char = substr($key, $i, 1); + + // identify its position in $scramble1 + $num = strpos($this->scramble1, $char); + if ($num === false) { + $this->errors[] = "Key contains an invalid character ($char)"; + return; + } // if + + $array[] = $num; // store in output array + $tot = $tot + $num; // accumulate total for later + } // for + + $array[] = $tot; // insert total as last entry in array + + return $array; + + } // _convertKey + +// **************************************************************************** +} // end Encryption +// **************************************************************************** + +?> \ No newline at end of file diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.ddp b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.dfm new file mode 100644 index 0000000..9389e02 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.dfm @@ -0,0 +1,235 @@ +object frmMain: TfrmMain + Left = 331 + Top = 235 + BorderStyle = bsDialog + Caption = 'Encryption/Decryption' + ClientHeight = 345 + ClientWidth = 555 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object lblCaption: TLabel + Left = 0 + Top = 0 + Width = 555 + Height = 29 + Align = alTop + Alignment = taCenter + Caption = 'Test Encryption/Decryption routines' + Font.Charset = RUSSIAN_CHARSET + Font.Color = clWindowText + Font.Height = -24 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + Layout = tlCenter + end + object Label2: TLabel + Left = 16 + Top = 52 + Width = 46 + Height = 13 + Caption = 'Enter Key' + end + object Label3: TLabel + Left = 16 + Top = 77 + Width = 74 + Height = 13 + Caption = 'Enter Password' + end + object Label4: TLabel + Left = 16 + Top = 102 + Width = 110 + Height = 13 + Caption = 'Enter Password Length' + end + object Label5: TLabel + Left = 16 + Top = 128 + Width = 80 + Height = 13 + Caption = 'Enter Adjustment' + end + object Label6: TLabel + Left = 16 + Top = 153 + Width = 68 + Height = 13 + Caption = 'Enter Modulus' + end + object lblEncrypt: TLabel + Left = 152 + Top = 180 + Width = 3 + Height = 13 + end + object lblDecrypt: TLabel + Left = 152 + Top = 200 + Width = 3 + Height = 13 + end + object Label9: TLabel + Left = 236 + Top = 104 + Width = 83 + Height = 13 + Caption = '( positive integer )' + end + object Label10: TLabel + Left = 236 + Top = 128 + Width = 49 + Height = 13 + Caption = '( numeric )' + end + object Label11: TLabel + Left = 236 + Top = 152 + Width = 83 + Height = 13 + Caption = '( positive integer )' + end + object Label1: TLabel + Left = 148 + Top = 232 + Width = 27 + Height = 13 + Caption = 'Errors' + end + object btnEncrypt: TButton + Left = 16 + Top = 178 + Width = 75 + Height = 25 + Caption = 'Encrypt' + TabOrder = 0 + OnClick = btnEncryptClick + end + object btnDecrypt: TButton + Left = 16 + Top = 208 + Width = 75 + Height = 25 + Caption = 'Decrypt' + TabOrder = 1 + OnClick = btnDecryptClick + end + object edtKey: TEdit + Left = 152 + Top = 48 + Width = 245 + Height = 21 + TabOrder = 2 + Text = 'Fred' + end + object edtPassword: TEdit + Left = 152 + Top = 73 + Width = 249 + Height = 21 + TabOrder = 3 + Text = 'passWORD' + end + object edtPassLen: TEdit + Left = 152 + Top = 98 + Width = 70 + Height = 21 + TabOrder = 4 + Text = '16' + end + object edtAjustment: TEdit + Left = 152 + Top = 124 + Width = 70 + Height = 21 + TabOrder = 5 + Text = '1.75' + end + object edtModulus: TEdit + Left = 152 + Top = 149 + Width = 70 + Height = 21 + TabOrder = 6 + Text = '3' + end + object btnClose: TButton + Left = 476 + Top = 312 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 7 + OnClick = btnCloseClick + end + object Errors: TMemo + Left = 148 + Top = 248 + Width = 305 + Height = 89 + Lines.Strings = ( + '') + TabOrder = 8 + end + object psvPHP: TpsvPHP + Variables = < + item + Name = 'key' + end + item + Name = 'password' + end + item + Name = 'pswdlen' + end + item + Name = 'adj' + end + item + Name = 'mod' + end + item + Name = 'encrypt_result' + end + item + Name = 'decrypt_result' + end> + Left = 356 + Top = 116 + end + object PHPLibrary1: TPHPLibrary + LibraryName = 'ErrorsLib' + Functions = < + item + FunctionName = 'printerror' + Tag = 0 + Parameters = < + item + Name = 'line' + ParamType = tpString + end> + OnExecute = PHPLibrary1Functions0Execute + end> + Left = 360 + Top = 168 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 424 + Top = 124 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.pas new file mode 100644 index 0000000..0c97302 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.pas @@ -0,0 +1,143 @@ +{$I PHP.INC} + +unit uMain; + +interface + +uses + Windows, Messages, SysUtils, + {$IFDEF VERSION6}Variants, {$ENDIF} + Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, php4delphi, PHPCustomLibrary, phpLibrary, phpFunctions, + ZendTypes, PHPCommon; + +type + TfrmMain = class(TForm) + lblCaption: TLabel; + Label2: TLabel; + Label3: TLabel; + Label4: TLabel; + Label5: TLabel; + Label6: TLabel; + btnEncrypt: TButton; + btnDecrypt: TButton; + edtKey: TEdit; + edtPassword: TEdit; + edtPassLen: TEdit; + edtAjustment: TEdit; + edtModulus: TEdit; + btnClose: TButton; + lblEncrypt: TLabel; + lblDecrypt: TLabel; + Label9: TLabel; + Label10: TLabel; + Label11: TLabel; + psvPHP: TpsvPHP; + Errors: TMemo; + Label1: TLabel; + PHPLibrary1: TPHPLibrary; + PHPEngine: TPHPEngine; + procedure btnEncryptClick(Sender: TObject); + procedure btnDecryptClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure Execute(Encrypt : boolean); + end; + +var + frmMain: TfrmMain; + +implementation + +{$R *.dfm} +{$R WindowsXP.res} + +{ TfrmMain } + +procedure TfrmMain.Execute(Encrypt: boolean); +var + Script : TStringList; +begin + psvPHP.VariableByName('key').Value := edtKey.Text; + psvPHP.VariableByName('password').Value := edtPassword.Text; + psvPHP.VariableByName('pswdlen').Value := edtPassLen.Text; + psvPHP.VariableByName('adj').Value := edtAjustment.Text; + psvPHP.VariableByName('mod').Value := edtModulus.Text; + psvPHP.Variables[5].Value := lblEncrypt.Caption; + psvPHP.Variables[6].Value := lblDecrypt.Caption; + + Script := TStringList.Create; + With Script do + begin + Add('require ''std.encryption.class.inc'';'); + Add('$crypt = new Encryption;'); + Add('ini_set(''session.bug_compat_warn'', 0);'); + Add('$crypt->setAdjustment($adj);'); + Add('$crypt->setModulus($mod);'); + Add('$adj = $crypt->getAdjustment();'); + Add('$mod = $crypt->getModulus();'); + Add('$errors = array();'); + + if Encrypt then + begin + Add('$encrypt_result = $crypt->encrypt($key, $password, $pswdlen);'); + Add('$errors = $crypt->errors;'); + end + else + begin + Add('$decrypt_result = $crypt->decrypt($key, $encrypt_result);'); + Add('$errors = $crypt->errors;'); + end; + Add('foreach ($errors as $error) {'); + Add('printerror($error);'); + Add('echo $error;'); + Add('} // foreach'); + + end; + psvPHP.RunCode(Script.Text); + lblEncrypt.Caption := psvPHP.Variables[5].Value; + lblDecrypt.Caption := psvPHP.Variables[6].Value; + Script.Free; +end; + +procedure TfrmMain.btnEncryptClick(Sender: TObject); +begin + Execute(true); +end; + +procedure TfrmMain.btnDecryptClick(Sender: TObject); +begin + Execute(false); +end; + +procedure TfrmMain.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + Errors.Lines.Add(Parameters[0].Value); +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownEngine; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dpr new file mode 100644 index 0000000..dfa3f13 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dpr @@ -0,0 +1,13 @@ +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dproj new file mode 100644 index 0000000..0c76f65 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dproj @@ -0,0 +1,105 @@ + + + {4AF32029-1A67-47E6-9BAB-2D46E1FDD3BD} + Project1.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Project1.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
Form1
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.res b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..55f874204136d6cde31b105890029f4503c878e3 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~TWm~%7FH&uWyHcFg^CccPz(RS*=&<05J-d+UUf~tKNE-t+g#=E zNNH(l5wgCWy~_uF40${AX5Q>hmRkU56V3%N+_8_nsvc3Jq}FKc*DBE|gEnzRD3odT z{B9}0AJQ~9t_+D3MNzQehw#n?$2H95lfjzJMiq+xpGS}RU|YW7TGAUn=>TJR9vbuv zQKv^fLP$_BH=di&s%NpygeRq7WOL!AU~H`oJdv~Xnj7J9-%dk4aAV5-jBGG4rXS8T z#&1Awg!ePy@tV(f_@tlj=qJ`@+x_IZ=P3K1ZEocskt@zKp3bKiEbG`L>hS!nd7PP< z*YiLohG%h>ba`1aP@aA!Bu=2+E0lZZSF-?KK7q>;Epm@~@dtdZ0(&$OeF0BP;A;i7bZNA5i@Ni6 j1fWAWcYr%w;}-YC4Ibz#+kO}RH7K;(HF*{O6)AiJ<8sA5 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.ddp b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.dfm new file mode 100644 index 0000000..ba5f4fd --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.dfm @@ -0,0 +1,120 @@ +object Form1: TForm1 + Left = 404 + Top = 217 + BorderStyle = bsDialog + Caption = 'PHP Graph demo' + ClientHeight = 531 + ClientWidth = 630 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object PaintBox: TPaintBox + Left = 4 + Top = 9 + Width = 512 + Height = 512 + OnPaint = PaintBoxPaint + end + object btnExecute: TButton + Left = 524 + Top = 4 + Width = 97 + Height = 25 + Caption = '&Execute' + TabOrder = 0 + OnClick = btnExecuteClick + end + object Button1: TButton + Left = 524 + Top = 32 + Width = 97 + Height = 25 + Caption = 'Use Library' + TabOrder = 1 + OnClick = Button1Click + end + object psvPHP: TpsvPHP + Variables = < + item + Name = 'X' + Value = '0' + end + item + Name = 'Y' + Value = '0' + end + item + Name = 'T' + Value = '0' + end> + Left = 236 + Top = 36 + end + object PHPEngine: TPHPEngine + HandleErrors = False + Constants = < + item + Name = 'MinT' + Value = '0' + end + item + Name = 'MaxT' + Value = '82' + end + item + Name = 'Steps' + Value = '2000' + end> + ReportDLLError = False + Left = 172 + Top = 212 + end + object PHPLibrary: TPHPLibrary + Functions = < + item + FunctionName = 'gr_prepare' + Tag = 0 + Parameters = <> + OnExecute = PHPLibrary1Functions0Execute + end + item + FunctionName = 'gr_paint' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end + item + Name = 'Y' + ParamType = tpFloat + end> + OnExecute = PHPLibraryFunctions1Execute + end + item + FunctionName = 'gr_move' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end + item + Name = 'Y' + ParamType = tpFloat + end> + OnExecute = PHPLibraryFunctions2Execute + end> + Left = 288 + Top = 196 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.pas new file mode 100644 index 0000000..fa4da5b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.pas @@ -0,0 +1,210 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.4 10/2009 delphi32 Exp $ } + +{$I PHP.INC} + +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, php4delphi, StdCtrls, PHPCommon, PHPCustomLibrary, phpLibrary, + PHPFunctions, ZendTypes, PHPTypes, ZendAPI, PHPAPI; + +type + TForm1 = class(TForm) + PaintBox: TPaintBox; + psvPHP: TpsvPHP; + btnExecute: TButton; + PHPEngine: TPHPEngine; + PHPLibrary: TPHPLibrary; + Button1: TButton; + procedure btnExecuteClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure PaintBoxPaint(Sender: TObject); + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPLibraryFunctions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure Button1Click(Sender: TObject); + procedure PHPLibraryFunctions2Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + Busy : boolean; + procedure PaintBoxImage; + public + { Public declarations } + B : TBitmap; + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TForm1.btnExecuteClick(Sender: TObject); +var + Script : TStringList; + Steps, X, Y: integer; + MinT, MaxT, DeltaT, T: double; +begin + psvPHP.UseDelimiters := true; + B.Canvas.Brush.Color := clWhite; + B.Canvas.FillRect(B.Canvas.ClipRect); + B.Canvas.Pen.Color := clSilver; + B.Canvas.MoveTo(0, 256); + B.Canvas.LineTo(512, 256); + B.Canvas.MoveTo(256, 0); + B.Canvas.LineTo(256, 512); + B.Canvas.Pen.Color := clBlack; + + Script := TStringList.Create; + Script.Add('$R1 = 90.0;'); + Script.Add('$R2 = 26.0;'); + Script.Add('$O = 70.0;'); + Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); + + MinT := StrToFloat(PHPEngine.Constants.Items[0].Value); + MaxT := StrToFloat(PHPEngine.Constants.Items[1].Value); + Steps := StrToInt(PHPEngine.Constants.Items[2].Value); + DeltaT := (MaxT - MinT) / Steps; + T := MinT; + + psvPHP.VariableByName('T').AsFloat := T; + psvPHP.RunCode(Script); + X := psvPHP.VariableByName('X').AsInteger; + Y := psvPHP.VariableByName('Y').AsInteger; + B.Canvas.MoveTo(X, Y); + + repeat + T := T + DeltaT; + psvPHP.VariableByName('T').AsFloat := T; + psvPHP.RunCode(Script); + X := psvPHP.VariableByName('X').AsInteger; + Y := psvPHP.VariableByName('Y').AsInteger; + B.Canvas.LineTo(X, Y); + PaintBoxImage; + Application.ProcessMessages; + until T >= MaxT; + Script.Free; +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; + B := TBitmap.Create; + B.Width := Paintbox.Width; + B.Height := PaintBox.Height; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownEngine; + B.Free; + B := nil; +end; + +procedure TForm1.PaintBoxImage; +begin + if Busy then + Exit; + Busy := true; + try + bitBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.Width, PaintBox.Height, + B.Canvas.Handle, 0, 0, SRCCOPY); + finally + Busy := false; + end; +end; + +procedure TForm1.PaintBoxPaint(Sender: TObject); +begin + PaintBoxImage; +end; + +procedure TForm1.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + B.Canvas.Brush.Color := clWhite; + B.Canvas.FillRect(B.Canvas.ClipRect); + B.Canvas.Pen.Color := clSilver; + B.Canvas.MoveTo(0, 256); + B.Canvas.LineTo(512, 256); + B.Canvas.MoveTo(256, 0); + B.Canvas.LineTo(256, 512); + B.Canvas.Pen.Color := clBlack; +end; + +procedure TForm1.PHPLibraryFunctions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + X, Y : integer; +begin + X := Parameters.ParamByName('X').ZendVariable.AsInteger; + Y := Parameters.ParamByName('Y').ZendVariable.AsInteger; + B.Canvas.LineTo(X, Y); + PaintBoxImage; + Application.ProcessMessages; +end; + +procedure TForm1.Button1Click(Sender: TObject); +var + Script : TStringList; +begin + Script := TStringList.Create; + try + Script.Add('gr_prepare();'); + Script.Add('$R1 = 90.0;'); + Script.Add('$R2 = 26.0;'); + Script.Add('$O = 70.0;'); + Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$DeltaT = (MaxT - MinT) / Steps;'); + Script.Add('$T = MinT;'); + Script.Add('gr_move($X, $Y);'); + Script.Add('gr_paint($X, $Y);'); + Script.Add('do {'); + Script.Add('$T = $T + $DeltaT;'); + Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('gr_paint($X, $Y);'); + Script.Add('} while ($T <= MaxT);'); + psvPHP.RunCode(Script); + finally + Script.Free; + end; +end; + +procedure TForm1.PHPLibraryFunctions2Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + X, Y : integer; +begin + X := Parameters.ParamByName('X').ZendVariable.AsInteger; + Y := Parameters.ParamByName('Y').ZendVariable.AsInteger; + B.Canvas.MoveTo(X, Y); +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/Graph/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.dfm new file mode 100644 index 0000000..cd57b69 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.dfm @@ -0,0 +1,30 @@ +object EngineModule: TEngineModule + OldCreateOrder = False + OnCreate = DataModuleCreate + OnDestroy = DataModuleDestroy + Left = 562 + Top = 381 + Height = 150 + Width = 215 + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 72 + Top = 24 + end + object PHPLibrary: TPHPLibrary + Functions = < + item + FunctionName = 'nb_test' + Tag = 0 + Parameters = < + item + Name = 'nb_pointer' + ParamType = tpString + end> + OnExecute = PHPLibraryFunctions0Execute + end> + Left = 120 + Top = 32 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.pas b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.pas new file mode 100644 index 0000000..2ece809 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.pas @@ -0,0 +1,56 @@ +unit dmEngine; + +interface + +uses + SysUtils, Classes, PHPCommon, php4delphi, PHPCustomLibrary, phpLibrary, + PHPFunctions; + +type + TEngineModule = class(TDataModule) + PHPEngine: TPHPEngine; + PHPLibrary: TPHPLibrary; + procedure DataModuleCreate(Sender: TObject); + procedure DataModuleDestroy(Sender: TObject); + procedure PHPLibraryFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + EngineModule: TEngineModule; + +implementation + +uses dmMain; + +{$R *.dfm} + +procedure TEngineModule.DataModuleCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TEngineModule.DataModuleDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +procedure TEngineModule.PHPLibraryFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); +var + DM : TMainModule; +begin + DM := TMainModule(Parameters.ParamByName('nb_pointer').ZendVariable.AsInteger); + if DM <> nil then + ZendVar.AsString := DM.EventString + else + ZendVar.AsString := 'Result is not defined'; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.ddp b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.dfm new file mode 100644 index 0000000..e77350a --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.dfm @@ -0,0 +1,23 @@ +object MainModule: TMainModule + OldCreateOrder = False + OnCreate = WebModuleCreate + Actions = < + item + Default = True + Name = 'WebActionItem1' + PathInfo = '/' + OnAction = MainModuleWebActionItem1Action + end> + Left = 513 + Top = 319 + Height = 254 + Width = 333 + object psvPHP: TpsvPHP + Variables = < + item + Name = 'nb' + end> + Left = 64 + Top = 56 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.pas b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.pas new file mode 100644 index 0000000..f702c6d --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.pas @@ -0,0 +1,51 @@ +unit dmMain; + +interface + +uses + SysUtils, Classes, HTTPApp, PHPCommon, php4delphi; + +type + TMainModule = class(TWebModule) + psvPHP: TpsvPHP; + procedure WebModuleCreate(Sender: TObject); + procedure MainModuleWebActionItem1Action(Sender: TObject; + Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); + private + { Private declarations } + FEvent : TDateTime; + public + { Public declarations } + function EventString : string; + end; + +var + MainModule: TMainModule; + +implementation + +{$R *.dfm} + +{ TMainModule } + +function TMainModule.EventString: string; +begin + Result := DateTimeToStr(FEvent); +end; + +procedure TMainModule.WebModuleCreate(Sender: TObject); +begin + FEvent := Now; +end; + +procedure TMainModule.MainModuleWebActionItem1Action(Sender: TObject; + Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); +var + S : string; +begin + psvPHP.VariableByName('nb').AsInteger := integer(Self); + S := psvPHP.RunCode(''); + Response.Content := S; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpISAPITest.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpISAPITest.dpr new file mode 100644 index 0000000..bddf2a7 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpISAPITest.dpr @@ -0,0 +1,54 @@ +library phpisapitest; + +uses + Windows, + ActiveX, + ComObj, + WebBroker, + ISAPIApp, + ISAPIThreadPool, + ZendTypes, + PHPTypes, + ZendAPI, + PHPAPI, + php4Delphi, + dmMain in 'dmMain.pas' {MainModule: TWebModule}, + dmEngine in 'dmEngine.pas' {EngineModule: TDataModule}; + +{$R *.res} + +exports + GetExtensionVersion, + HttpExtensionProc, + TerminateExtension; + +var + OrgDLLProc : TDLLProc; + EngineModule : TEngineModule; + +procedure HandlerExitProc(reason : integer); +begin + case Reason of + DLL_THREAD_DETACH: + begin + ts_free_thread; + end; + DLL_PROCESS_DETACH: + begin + EngineModule.Free; + end; + end; + + if Assigned(OrgDLLProc) then + OrgDLLProc(reason); +end; + +begin + CoInitFlags := COINIT_MULTITHREADED; + EngineModule := TEngineModule.Create(nil); + Application.Initialize; + OrgDLLProc := DLLProc; + DLLProc := HandlerExitProc; + Application.CreateForm(TMainModule, MainModule); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.bdsproj b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.bdsproj new file mode 100644 index 0000000..587b308 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.bdsproj @@ -0,0 +1,177 @@ + + + + + + + + + + + + phpISAPITest.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + vcl;rtl;vclx;dbrtl;vcldb;adortl;dbxcds;dbexpress;vclib;ibxpress;xmlrtl;vclactnband;inet;IntrawebDB_80_100;Intraweb_80_100;vclie;inetdbbde;inetdbxpress;IndyCore;IndySystem;dclOfficeXP;VclSmp;soaprtl;dsnap;IndyProtocols;bdertl;teeui;teedb;tee;vcldbx;dsnapcon;websnap;webdsnap;B304_r100;OERT100;cxLibraryD10;dxBarD10;dxComnD10;dxBarDBNavD10;dxBarExtDBItemsD10;dxBarExtItemsD10;dxDockingD10;dxsbD10;cxEditorsD10;dxThemeD10;cxDataD10;cxExtEditorsD10;cxVerticalGridD10;dxNavBarD10;dxPSCoreD10;dxPSTeeChartD10;dxPsPrVwAdvD10;dxPSLnksD10;vclshlctrls;dxPSDBTeeChartD10;dxPScxCommonD10;dxPScxExtCommonD10;dxPScxVGridLnkD10;SimpleObjectsR10;TortoisePlugIn100;DBLibR10;PSCControlsR10;FCLRD10;FCLR10;ZLibExR10;gtFiltersBDS2006;gtCompressionBDS2006;gtRtlBDS2006;gtCryptBDS2006;gtFontBDS2006;FreeImageR100;PSCSystemR100;PSCControlsDBR10 + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.dproj new file mode 100644 index 0000000..8ab744b --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.dproj @@ -0,0 +1,114 @@ + + + {CCA83CB5-84D7-4C78-854E-622B6A1DCFDE} + phpISAPITest.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + vcl;rtl;vclx;dbrtl;vcldb;adortl;dbxcds;dbexpress;vclib;ibxpress;xmlrtl;vclactnband;inet;IntrawebDB_80_100;Intraweb_80_100;vclie;inetdbbde;inetdbxpress;IndyCore;IndySystem;dclOfficeXP;VclSmp;soaprtl;dsnap;IndyProtocols;bdertl;teeui;teedb;tee;vcldbx;dsnapcon;websnap;webdsnap;B304_r100;OERT100;cxLibraryD10;dxBarD10;dxComnD10;dxBarDBNavD10;dxBarExtDBItemsD10;dxBarExtItemsD10;dxDockingD10;dxsbD10;cxEditorsD10;dxThemeD10;cxDataD10;cxExtEditorsD10;cxVerticalGridD10;dxNavBarD10;dxPSCoreD10;dxPSTeeChartD10;dxPsPrVwAdvD10;dxPSLnksD10;vclshlctrls;dxPSDBTeeChartD10;dxPScxCommonD10;dxPScxExtCommonD10;dxPScxVGridLnkD10;SimpleObjectsR10;TortoisePlugIn100;DBLibR10;PSCControlsR10;FCLRD10;FCLR10;ZLibExR10;gtFiltersBDS2006;gtCompressionBDS2006;gtRtlBDS2006;gtCryptBDS2006;gtFontBDS2006;FreeImageR100;PSCSystemR100;PSCControlsDBR10 + 1 + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + x86 + phpisapitest.dll + true + false + true + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
MainModule
+ TWebModule +
+ +
EngineModule
+ TDataModule +
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + + + + + phpISAPITest.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.res b/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.res new file mode 100644 index 0000000000000000000000000000000000000000..28e53612c3faeb93e0d6d9663c9a76f621e30286 GIT binary patch literal 4396 zcmbW5y^ice5QS^CNQeYBAfFAiE(S{o$&3%L$5+F6_ ztLm~nvz}%5S}Ik$ySmP)pYE~7%ek+?BU%R{e>Weh`PJ?^N50V=n zX`nry`}9L^kB^TwmExLl%I_aOSl{)AP3VWscsrl#tNuSeU?g^G=90%WPQG5nYbw1> z;;0z_S%yeee;W-|6Mu2+D*J8h)9~Q75&N@ZSKP!8hf!MoE+70OV3Xq|&l)EO z*Lrt5{K=2!-}jLJhlK|*dX1EWNw#os9;cV_lT&& z}Zn$UI;=sGs5}#P{jdmV$iyfbu>xYQj zZRVJR1Mk$|u}5Ja;3+*wAJ`Z1TiM1AzJ#?x&BM>9zy1ggb8zr8TjWP#1NiE(r@CPB z4p+w?WrOV?-Gz`Jk6->g-VqKO&%#EuKXYGCs@ME%$pKDa1~z^hzU=6GFzJIBljFwo zAl+%-5FCgR46lFU&W(fmlQqw2tp*1l>wGXz4xIzo$RX+(Pqy zZLHjDA2^)h1zY~2rY-*D(5>;4bCX}23R8kd7O%a_-@#h*3uI+17DfZp*=E25?k9Y9d@A>Y;PXd<^^`E$L zp5qRP_`Ns4As<7l(TI)mUx>AF&^Yl!@5k@?moLX0sBMTTe%A8N@f>L_`d(Vt89%)r z_0eANC19qo&Y1IemitzR=sWH&IEF9$5x>`8W8(EZ4e~EL*4^hESiY{kc{j3_=Yg@m zmwo)`Y2t3R!@uHBeD~e(13T8I()w3^Bmd&2xx_;Ajet(U=VcDO24lP5h@s&}{`Icf znsG)mH*waM`oOJ|o%VWtq`e=9b|%Fkf7{t}iSO^a>-@JPF%Ikf=l!R5a)Q8*`wL&h zMeNQ^v6I7$HSdM^hFbHmi?3dYdyV)Nk8toGF-HFoAKyTnbD!5c_tesx;)M+y zXWq|rN8Ay6o?Xrv*b9deV{);5Sm#{5#$oCC0~m1G>T_&zyxy~nR}NrZKFlF|XCXOJ zBW(Ph=@M_%@w?Y>)DQU`nL7L3eOwaIJM&25UDc=fEulAvk-Tvy@(xGuCCzWY<-Gna z2RqQq)WU%tqu1UdvUN=LB;OART>N|3b>sx!Z+Vi#YyI$o7kn2UPwh;?;eFW2FFBw+ zwm0O#?dFyX#Z7I}Px^hY&i!ce@hX?6Ctt@d_q`YIntl3vtG?#va=sqTswV%H{3H1! z`6xLyd6Y)p`#kDz2jpmWi+nWuQog?t#z9z}Fl#;D)^E-1dr7Td+b{N`{cOKVezM=B X^V$Bd!M_>$KjZ%1|JC4MkQ@6CnmZz1 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dpr new file mode 100644 index 0000000..8afed48 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dpr @@ -0,0 +1,18 @@ +program LibraryDemo; + +uses + Forms, + Unit1 in 'Unit1.pas' {frmLibDemo}, + dm_Main in 'dm_Main.pas' {dmMain: TDataModule}, + frm_dialog in 'frm_dialog.pas' {Form2}; + +{$R *.RES} + +begin + Application.Initialize; + Application.Title := 'Library Demo'; + Application.CreateForm(TfrmLibDemo, frmLibDemo); + Application.CreateForm(TdmMain, dmMain); + Application.CreateForm(TForm2, Form2); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dproj new file mode 100644 index 0000000..3450d9a --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dproj @@ -0,0 +1,112 @@ + + + {54CCA877-66B1-4454-9C2D-B2101E6EE4C1} + LibraryDemo.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + LibraryDemo.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
frmLibDemo
+
+ +
dmMain
+ TDataModule +
+ +
Form2
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + LibraryDemo.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.res b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.ddp b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.dfm new file mode 100644 index 0000000..2e6cf63 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.dfm @@ -0,0 +1,80 @@ +object frmLibDemo: TfrmLibDemo + Left = 395 + Top = 303 + BorderStyle = bsDialog + Caption = 'PHP Demo' + ClientHeight = 209 + ClientWidth = 377 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Memo1: TMemo + Left = 8 + Top = 8 + Width = 185 + Height = 189 + Lines.Strings = ( + 'formcaption("Hello from PHP");' + 'buttonclick();' + 'my_createcontrol();') + TabOrder = 0 + end + object Button1: TButton + Left = 292 + Top = 172 + Width = 75 + Height = 25 + Caption = 'Click' + TabOrder = 1 + OnClick = Button1Click + end + object btnExecute: TButton + Left = 292 + Top = 12 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 2 + OnClick = btnExecuteClick + end + object psvPHP1: TpsvPHP + Variables = <> + Left = 32 + Top = 28 + end + object PHPLibrary1: TPHPLibrary + LibraryName = 'SimpleLib' + Functions = < + item + FunctionName = 'formcaption' + Tag = 0 + Parameters = < + item + Name = 'Param1' + ParamType = tpString + end> + OnExecute = PHPLibrary1Functions0Execute + end + item + FunctionName = 'buttonclick' + Tag = 0 + Parameters = <> + OnExecute = PHPLibrary1Functions1Execute + end> + Left = 88 + Top = 108 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 212 + Top = 64 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.pas new file mode 100644 index 0000000..a734e5a --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.pas @@ -0,0 +1,77 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, PHPCustomLibrary, phpLibrary, php4delphi, PHPAPI, ZENDAPI, + PHPFunctions, ZendTypes, phpTypes, PHPCommon; + +type + TfrmLibDemo = class(TForm) + psvPHP1: TpsvPHP; + PHPLibrary1: TPHPLibrary; + Memo1: TMemo; + Button1: TButton; + btnExecute: TButton; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + procedure btnExecuteClick(Sender: TObject); + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPLibrary1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmLibDemo: TfrmLibDemo; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TfrmLibDemo.Button1Click(Sender: TObject); +begin + ShowMessage('Click'); +end; + +procedure TfrmLibDemo.btnExecuteClick(Sender: TObject); +begin + PHPEngine.StartupEngine; + psvPhp1.RunCode(memo1.Lines.text); + PHPEngine.ShutdownAndWaitFor; +end; + +procedure TfrmLibDemo.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + frmLibDemo.Caption := Parameters[0].Value; +end; + +procedure TfrmLibDemo.PHPLibrary1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + Button1.Click; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ + OnExecute = PHPLibrary1Functions0Execute + end> + Left = 44 + Top = 44 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dti b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dti new file mode 100644 index 0000000..862f513 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=332 +Top=246 +Width=730 +Height=508 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=dmMain\PHPLibrary1\PHPLibrary1.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.pas new file mode 100644 index 0000000..59bc840 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.pas @@ -0,0 +1,39 @@ +unit dm_Main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + PHPCommon, PHPCustomLibrary, phpLibrary, PHPFunctions, ZendTypes; + +type + TdmMain = class(TDataModule) + PHPLibrary1: TPHPLibrary; + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ThisPtr: pzval; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + dmMain: TdmMain; + +implementation + +uses frm_dialog; + +{$R *.DFM} + +procedure TdmMain.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + TSRMLS_DC: Pointer); +begin + Form2 := TForm2.Create(Application); + Form2.ShowModal; + Form2.Free; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.dfm new file mode 100644 index 0000000..a9a3ded --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.dfm @@ -0,0 +1,34 @@ +object Form2: TForm2 + Left = 434 + Top = 330 + BorderStyle = bsDialog + Caption = 'Dialog' + ClientHeight = 231 + ClientWidth = 396 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 16 + Top = 52 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 0 + OnClick = Button1Click + end + object Edit1: TEdit + Left = 16 + Top = 20 + Width = 121 + Height = 21 + TabOrder = 1 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.pas new file mode 100644 index 0000000..266a6e9 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.pas @@ -0,0 +1,32 @@ +unit frm_dialog; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TForm2 = class(TForm) + Button1: TButton; + Edit1: TEdit; + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form2: TForm2; + +implementation + +{$R *.DFM} + +procedure TForm2.Button1Click(Sender: TObject); +begin + Close; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dpr new file mode 100644 index 0000000..7dedaa4 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dpr @@ -0,0 +1,13 @@ +program LogoDemo; + +uses + Forms, + uMain in 'uMain.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dproj new file mode 100644 index 0000000..4b6b0d8 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dproj @@ -0,0 +1,105 @@ + + + {F0C6D9FD-A1AA-4B17-A453-5FBCD2432A41} + LogoDemo.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + LogoDemo.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
Form1
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + LogoDemo.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.res b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 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 F{{hk8NK^m- literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.dfm new file mode 100644 index 0000000..63d1244 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.dfm @@ -0,0 +1,36 @@ +object Form1: TForm1 + Left = 520 + Top = 365 + BorderStyle = bsDialog + Caption = 'Logo demo' + ClientHeight = 52 + ClientWidth = 178 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 11 + Top = 14 + Width = 75 + Height = 25 + Caption = 'PHP egg' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 91 + Top = 14 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 1 + OnClick = Button2Click + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.pas new file mode 100644 index 0000000..2371130 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.pas @@ -0,0 +1,46 @@ +unit uMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ShellAPI; + +type + TForm1 = class(TForm) + Button1: TButton; + Button2: TButton; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation +uses + logos; + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TForm1.Button1Click(Sender: TObject); +var + FS : TFileStream; +begin + FS := TFileStream.Create('egg.gif', fmCreate); + FS.Write(php_egg_logo, 7538); + FS.Free; + ShellExecute(0, 'open', 'egg.gif', nil, nil, SW_SHOWNORMAL); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + Close; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dpr new file mode 100644 index 0000000..2a38013 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dpr @@ -0,0 +1,14 @@ +program MultithreadSample; + +uses + Forms, + frm_main in 'frm_main.pas' {frmMain}, + php_thread in 'php_thread.pas'; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj new file mode 100644 index 0000000..4d406d5 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj @@ -0,0 +1,106 @@ + + + {94D8351C-D7FA-4AB4-B4FA-8A463EB52A65} + MultithreadSample.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + MultithreadSample.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
frmMain
+
+ + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + MultithreadSample.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.dfm new file mode 100644 index 0000000..e29e9c3 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.dfm @@ -0,0 +1,44 @@ +object frmMain: TfrmMain + Left = 513 + Top = 399 + BorderStyle = bsDialog + Caption = 'PHP Multithread sample' + ClientHeight = 81 + ClientWidth = 306 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object btnRun: TButton + Left = 136 + Top = 48 + Width = 75 + Height = 25 + Caption = 'Run' + TabOrder = 0 + OnClick = btnRunClick + end + object btnClose: TButton + Left = 220 + Top = 48 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 1 + OnClick = btnCloseClick + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 12 + Top = 12 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.pas new file mode 100644 index 0000000..8ba9a62 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.pas @@ -0,0 +1,62 @@ +unit frm_main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + PHPCommon, php4delphi, StdCtrls; + +type + TfrmMain = class(TForm) + PHPEngine: TPHPEngine; + btnRun: TButton; + btnClose: TButton; + procedure btnRunClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmMain: TfrmMain; + +implementation + +uses php_thread; + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TfrmMain.btnRunClick(Sender: TObject); +var + cnt : integer; + T : TPHPThread; +begin + for cnt := 0 to 99 do + begin + T := TPHPThread.Create(true); + T.FreeOnTerminate := true; + T.Resume; + end; +end; + +procedure TfrmMain.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/php_thread.pas b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/php_thread.pas new file mode 100644 index 0000000..76f207c --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/php_thread.pas @@ -0,0 +1,45 @@ +unit php_thread; + +interface + +uses + Windows, Classes, Forms, PHPCommon, php4Delphi, PHPTypes, ZendTypes, ZENDAPI, PHPAPI; + +type + TPHPThread = class(TThread) + private + { Private declarations } + PHP : TpsvPHP; + protected + procedure Execute; override; + procedure ComeBack; + end; + +implementation + + +{ TPHPThread } + +procedure TPHPThread.ComeBack; +begin + Application.ProcessMessages; +end; + +procedure TPHPThread.Execute; +begin + PHP := TpsvPHP.Create(nil); + PHP.RunCode('echo "Threaded";'); + PHP.Free; + Synchronize(ComeBack); + sleep(250); //for zend_timeout to kill timer + Synchronize(ComeBack); + try + //This will release thread allocated resources + //The better way is to reuse existsing threads + //to save time and memory + ts_free_thread; + except + end; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dpr new file mode 100644 index 0000000..dfa3f13 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dpr @@ -0,0 +1,13 @@ +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dproj new file mode 100644 index 0000000..c370b49 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dproj @@ -0,0 +1,105 @@ + + + {0F421CA1-6A27-4406-B069-E1B488D1AE88} + Project1.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Project1.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
Form1
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.res b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.ddp b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.dfm new file mode 100644 index 0000000..bcac6ee --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.dfm @@ -0,0 +1,60 @@ +object Form1: TForm1 + Left = 490 + Top = 294 + BorderStyle = bsDialog + Caption = 'Array demo' + ClientHeight = 160 + ClientWidth = 256 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 16 + Top = 64 + Width = 75 + Height = 25 + Caption = 'Button1' + TabOrder = 0 + OnClick = Button1Click + end + object ListBox1: TListBox + Left = 108 + Top = 4 + Width = 121 + Height = 97 + ItemHeight = 13 + TabOrder = 1 + end + object psvPHP1: TpsvPHP + Variables = <> + Left = 20 + Top = 16 + end + object PHPLibrary1: TPHPLibrary + LibraryName = 'ArrayLib' + Functions = < + item + FunctionName = 'get_php_array' + Tag = 0 + Parameters = <> + OnExecute = ExecuteGetArray + end> + Left = 52 + Top = 16 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 44 + Top = 112 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.pas b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.pas new file mode 100644 index 0000000..51ee04e --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.pas @@ -0,0 +1,108 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +//This sample shows how to return an array as a result of PHP function +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + PHPCustomLibrary, phpLibrary, php4delphi, phpFunctions, ZendAPI, PHPAPI, + StdCtrls, ZendTypes, phpTypes, PHPCommon; + +type + TForm1 = class(TForm) + psvPHP1: TpsvPHP; + PHPLibrary1: TPHPLibrary; + Button1: TButton; + ListBox1: TListBox; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure ExecuteGetArray(Sender: TObject; Parameters: TFunctionParams; + var ReturnValue: Variant; ZendVar: TZendVariable; + TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + ar : array of string; + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + + +procedure TForm1.Button1Click(Sender: TObject); +var + cnt : integer; +begin + //Clear array + SetLength(ar,0); + //Execute code + psvPHP1.RunCode('$z=0; $y=0; $ar=array("la","hu"); $x=45; $z = $x + $y; $count=count($ar); get_php_array();'); + //Display new value of the array + ListBox1.Items.Clear; + for cnt := 0 to Length(ar) - 1 do + ListBox1.Items.Add(ar[cnt]); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownEngine; +end; + +procedure TForm1.ExecuteGetArray(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); +var + ht : PHashTable; + data: ^ppzval; + cnt : integer; + variable : pzval; + tmp : ^ppzval; +begin + ht := GetSymbolsTable; + if Assigned(ht) then + begin + new(data); + if zend_hash_find(ht, 'ar', 3, data) = SUCCESS then + begin + variable := data^^; + if variable^._type = IS_ARRAY then + begin + SetLength(ar, zend_hash_num_elements(variable^.value.ht)); + for cnt := 0 to zend_hash_num_elements(variable^.value.ht) -1 do + begin + new(tmp); + zend_hash_index_find(variable^.value.ht, cnt, tmp); + ar[cnt] := tmp^^^.value.str.val; + freemem(tmp); + end; + end; + end; + freemem(data); + end; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/array demo/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ 1 then + begin + writeln(Format('Usage: %s ', [ParamStr(0)])); + Halt(1); + end; + Engine := TPHPEngine.Create(nil); + Engine.StartupEngine; + php := TpsvPHP.Create(nil); + php.FileName := AnsiString(ParamStr(1)); + write(php.Execute); + php.Free; + Engine.ShutdownEngine; + Engine.Free; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dproj new file mode 100644 index 0000000..8fbe681 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dproj @@ -0,0 +1,102 @@ + + + {CDD13A49-7E43-43C4-B155-14EA1434D06A} + phpcon.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + phpcon.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + VCLApplication + + + + phpcon.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/console/test.php b/Demos Delphi 2009 (WideString support)/psvPHP/console/test.php new file mode 100644 index 0000000..f4f3614 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/console/test.php @@ -0,0 +1,4 @@ + + diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dpr new file mode 100644 index 0000000..35dbf7c --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dpr @@ -0,0 +1,16 @@ +program Sample1; + +uses + Forms, + frm_phpDemo in 'frm_phpDemo.pas' {frmPHPDemo}, + zendAPI, + php4delphi, + phpAPI; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmPHPDemo, frmPHPDemo); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dproj new file mode 100644 index 0000000..eadb198 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dproj @@ -0,0 +1,110 @@ + + + {918ad693-3b86-4b4f-9d15-809746772557} + Sample1.dpr + Debug + AnyCPU + DCC32 + Sample1.exe + 12.0 + Debug + + + true + + + true + Base + true + + + true + Base + true + + + true + vcl;rtl;vclx;vclactnband;dbrtl;vcldb;vcldbx;bdertl;dsnap;dsnapcon;TeeUI;TeeDB;Tee;adortl;vclib;ibxpress;IndyCore;IndySystem;IndyProtocols;xmlrtl;inet;intrawebdb_100_120;Intraweb_100_120;VclSmp;vclie;websnap;webdsnap;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DataSnapServer;DbxClientDriver;DBXInterBaseDriver;DBXMySQLDriver;dbxcds;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;php4DelphiR2009 + Sample1.exe + true + + + 7.0 + False + False + 0 + RELEASE;$(DCC_Define) + + + 7.0 + DEBUG;$(DCC_Define) + + + + MainSource + + +
frmPHPDemo
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + False + True + False + + + True + False + 1 + 0 + 0 + 1 + False + False + False + False + False + 2067 + 1252 + + + Serhiy Perevoznyk + + 1.0.0.1 + + + + + + 1.0.0.0 + + + + Sample1.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.res b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.res new file mode 100644 index 0000000000000000000000000000000000000000..55bac8dc55fe0e38bb18c03f2c7ebb63198ab0bd GIT binary patch literal 3436 zcmbuBO=uNY6o5}Oh1Xz9tRSVhm=2|=ke}zo)JRf^iIz}PgFopqJl~reAHFw}&dkeC z>Ef+4%R)t%or|{6MK^-WLRMYWp-bJ=l?6cx#;$}yZ@+uz{UuctoV@#U&OP^>@0@$z zyoiW6G_CW-bjNeJuf4t(8w8%g!M6)-qr*m~IkZ0Mrx$73KJUz$Y5CL47n@CMV|u2v zrfh9(VPYW6p!0z~=hCva>)E`4g05*sy5{EEjdi-FY!-00+1xBJGT%MQrW9CT-&`-; zSl?vxdLeghg?##g9;!EbuD;b<$3529%j?)GZ(i;^u9i!BQr3JwK_fRtBnfX4@+Y%Bd|3kLr zHPwNN*eO=F)Wl9pRvLk0tGXxPJ`VbCyW z7;sHP4}*q5!=M4s#LsZ1*{Cs6_)y3S4sCrK8zmpg53;nhWZqeF{rYveb?cVgyLV6S z+_@tU9z2kT4;l8t|sxp{u+fBJ9!lJCR6dGhg;os0Ba zO-pDEe_O+gl1L;~31nH$GS#$Yf+v+^DhX0WNtij=V5 zpb8}<-+I5u7|B)qZHOZaR`O*P`>(C-HLQ+W#&*nEY+@-}mKB()*ap^@=|-tpUx#ne z`ipyPiZYB%-ip|}*0;$cv9l$7A2{$ zug)0BHMrYPZhOAv!&KG8ZRcpDc7@uE3)qHuYmj@gi%_Vw$$O{G?(BPWH}~@cn^%4| zCYq^1n{d{GE?Vw3Rrj<-KC(9@&oE$D4a?rMI8gYr|H5A3OwFBrzvs?&|F4@owO+3| zt9}$$!(hrS4v)HyAC$vNHCUc{i;+K;~gu|omNX}95SNs5m@`jZmYip9}R=%x;mqNc7 z+-P(7`F3rFzpMt8a4jC53G4MR7@7%#BnoSBD;2Y&lg>EV@Yl1n(zsHqmOuA5E``^8 zPHz18#PKWRW5uzta#ife3YHtCWt(SS2IKn`r69kN7w6v9x2iOmM2$F^3sm@; zcfoVp)s6jfBjUWfMUDKg8r%`TvJh2Qt2KYwk2{Mnb(YVpvo+z;p7U4zS~o4nsTswT zTZ-p`RcaIURKjr@)#;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.dfm new file mode 100644 index 0000000..c174976 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.dfm @@ -0,0 +1,192 @@ +object frmPHPDemo: TfrmPHPDemo + Left = 299 + Top = 239 + Caption = 'psvPHP demo' + ClientHeight = 506 + ClientWidth = 775 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 484 + Top = 0 + Width = 4 + Height = 465 + Align = alRight + end + object pnlButtons: TPanel + Left = 0 + Top = 465 + Width = 775 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 590 + Top = 0 + Width = 185 + Height = 41 + Align = alRight + BevelOuter = bvNone + TabOrder = 0 + object btnExecuteCode: TButton + Left = 88 + Top = 8 + Width = 87 + Height = 25 + Caption = 'Execute Code' + TabOrder = 0 + OnClick = btnExecuteCodeClick + end + object btnExecuteFile: TButton + Left = 8 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Execute File' + TabOrder = 1 + OnClick = btnExecuteFileClick + end + end + end + object WebBrowser1: TWebBrowser + Left = 0 + Top = 0 + Width = 484 + Height = 465 + Align = alClient + TabOrder = 1 + ControlData = { + 4C000000063200000F3000000000000000000000000000000000000000000000 + 000000004C000000000000000000000001000000E0D057007335CF11AE690800 + 2B2E126208000000000000004C0000000114020000000000C000000000000046 + 8000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000100000000000000000000000000000000000000} + end + object Panel3: TPanel + Left = 488 + Top = 0 + Width = 287 + Height = 465 + Align = alRight + Caption = 'Panel3' + TabOrder = 2 + object Label1: TLabel + Left = 1 + Top = 1 + Width = 285 + Height = 13 + Align = alTop + Caption = ' PHP code' + ExplicitWidth = 55 + end + object Label2: TLabel + Left = 1 + Top = 295 + Width = 285 + Height = 13 + Align = alBottom + Caption = ' Result values' + ExplicitWidth = 70 + end + object memPHPCode: TMemo + Left = 1 + Top = 14 + Width = 285 + Height = 281 + Align = alClient + Lines.Strings = ( + 'echo "Before function declaration...
\n";' + '' + 'function print_something_multiple_times($something,$times)' + '{' + + ' echo "----
\nIn function, printing the string \"$something\' + + '" $times times
\n";' + ' for ($i=0; $i<$times; $i++) {' + ' echo "$i) $something
\n";' + ' }' + ' echo "Done with function...
\n-----
\n";' + '}' + '' + 'function some_other_function()' + '{' + + ' echo "This is some other function, to ensure more than just on' + + 'e function works fine...
\n";' + '}' + '' + '' + 'echo "After function declaration...
\n";' + '' + 'echo "Calling function for the first time...
\n";' + 'print_something_multiple_times($test,10);' + 'echo "Returned from function call...
\n";' + '' + 'echo "Calling the function for the second time...
\n";' + + 'print_something_multiple_times("This like, really works and stuf' + + 'f...",3);' + 'echo "Returned from function call...
\n";' + '' + 'some_other_function();' + '' + '$test = "I don'#39't believe";' + '$tool = "PHP";') + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + object lbVariables: TListBox + Left = 1 + Top = 308 + Width = 285 + Height = 156 + Align = alBottom + ItemHeight = 13 + TabOrder = 1 + end + end + object psvPHP: TpsvPHP + Variables = < + item + Name = 'test' + Value = 'This works!' + end + item + Name = 'tool' + Value = 'Delphi' + end> + OnReadPost = psvPHPReadPost + RequestType = prtPost + Left = 116 + Top = 28 + end + object OpenDialog1: TOpenDialog + DefaultExt = '.php' + Filter = 'PHP script (*.php)|*.php|Any File (*.*)|*.*' + Left = 196 + Top = 132 + end + object PHPEngine: TPHPEngine + OnLogMessage = PHPEngineLogMessage + Constants = <> + ReportDLLError = False + Left = 72 + Top = 124 + end + object PHPSystemLibrary1: TPHPSystemLibrary + Left = 200 + Top = 280 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas new file mode 100644 index 0000000..6cff647 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas @@ -0,0 +1,179 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{$I PHP.INC} + +unit frm_phpDemo; + +{ $Id: frm_phpDemo.pas,v 7.4 10/2009 delphi32 Exp $ } + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + OleCtrls, SHDocVw, StdCtrls, ExtCtrls, ActiveX, php4delphi, PHPCommon, + PHPCustomLibrary, phpLibrary; + +type + TfrmPHPDemo = class(TForm) + pnlButtons: TPanel; + Panel2: TPanel; + btnExecuteCode: TButton; + WebBrowser1: TWebBrowser; + psvPHP: TpsvPHP; + btnExecuteFile: TButton; + OpenDialog1: TOpenDialog; + Panel3: TPanel; + memPHPCode: TMemo; + lbVariables: TListBox; + Splitter1: TSplitter; + Label1: TLabel; + Label2: TLabel; + PHPEngine: TPHPEngine; + PHPSystemLibrary1: TPHPSystemLibrary; + procedure FormCreate(Sender: TObject); + procedure btnExecuteFileClick(Sender: TObject); + procedure btnExecuteCodeClick(Sender: TObject); + procedure psvPHPReadPost(Sender: TObject; Stream: TStream); + procedure FormDestroy(Sender: TObject); + procedure PHPEngineLogMessage(Sender: TObject; AText: AnsiString); + private + { Private declarations } + public + { Public declarations } + procedure DisplayResultInBrowser(AStr : AnsiString); + procedure DisplayVariables; + end; + +var + frmPHPDemo: TfrmPHPDemo; + +implementation + + + +{$R *.DFM} +{$R internal.res} + +function StringToOleStream(const AString: AnsiString): IStream; +var + MemHandle: THandle; + Len : integer; +begin + Len := strlen(PAnsiChar(AString)); + MemHandle := GlobalAlloc(GPTR, len + 1); + if MemHandle <> 0 then begin + Move(AString[1], PChar(MemHandle)^, strlen(PAnsiChar(AString)) + 1); + CreateStreamOnHGlobal(MemHandle, True, Result); + end else + Result := nil; +end; + +procedure TfrmPHPDemo.FormCreate(Sender: TObject); +var + Url : OleVariant; + Doc : AnsiString; +begin + PHPEngine.StartupEngine; + Url := 'about:blank'; + Webbrowser1.Navigate2(Url); + Doc := psvPHP.RunCode('phpinfo();'); + DisplayResultInBrowser(Doc); + DisplayVariables; +end; + + + +procedure TfrmPHPDemo.btnExecuteFileClick(Sender: TObject); +var + doc : string; +begin + if OpenDialog1.Execute then + begin + doc := ''; + MemPHPCode.Lines.Clear; + MemPHPCode.Lines.LoadFromFile(OpenDialog1.FileName); + doc := psvPHP.Execute(OpenDialog1.FileName); + DisplayResultInBrowser(doc); + DisplayVariables; + end; +end; + +procedure TfrmPHPDemo.DisplayResultInBrowser(AStr: AnsiString); +var + Stream: IStream; + StreamInit: IPersistStreamInit; +begin + if AStr = '' then + begin + WebBrowser1.Navigate('about:The script returns no result'); + Exit; + end; + AStr := StringReplace(AStr, 'src="?=PHPE9568F34-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ParamStr(0)+'/php"', [rfReplaceAll, rfIgnoreCase]); + + {$IFDEF PHP4} + AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ ParamStr(0) + '/zend1"', [rfReplaceAll, rfIgnoreCase]); + {$ELSE} + AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ ParamStr(0) + '/zend2"', [rfReplaceAll, rfIgnoreCase]); + {$ENDIF} + + Stream := StringToOleStream(AStr); + StreamInit := Webbrowser1.Document as IPersistStreamInit; + StreamInit.InitNew; + StreamInit.Load(Stream); +end; + +procedure TfrmPHPDemo.DisplayVariables; +var + i : integer; +begin + lbVariables.Items.Clear; + for i := 0 to psvPHP.Variables.Count - 1 do + begin + lbVariables.Items.Add(psvphp.Variables[i].Name + '=' + psvPHP.Variables[i].Value); + end; + lbVariables.Items.Add(''); + lbVariables.Items.Add('Headers:'); + lbVariables.Items.Add(''); + for i := 0 to psvPHP.Headers.Count - 1 do + lbVariables.Items.Add(psvPHP.Headers[i].Header); +end; + +procedure TfrmPHPDemo.btnExecuteCodeClick(Sender: TObject); +var + doc : string; +begin + doc := ''; + doc := psvPHP.RunCode(memPHPCode.Text); + DisplayResultInBrowser(doc); + DisplayVariables; +end; + +procedure TfrmPHPDemo.psvPHPReadPost(Sender: TObject; Stream: TStream); +var + PostData : string; +begin + PostData :='postname=postvalue'#0; + Stream.Write(PostData[1], length(PostData)); +end; + +procedure TfrmPHPDemo.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +procedure TfrmPHPDemo.PHPEngineLogMessage(Sender: TObject; AText: AnsiString); +begin + ShowMessage('Trapped ' + AText); +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.RES b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.RES new file mode 100644 index 0000000000000000000000000000000000000000..3488df09c59cb6f8a357a75ff13a718fa5c309b9 GIT binary patch literal 10608 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 C>{7!3 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.rc b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.rc new file mode 100644 index 0000000..7af5bd7 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.rc @@ -0,0 +1,3 @@ +php 23 DISCARDABLE php.gif +zend2 23 DISCARDABLE zend2.gif +zend1 23 DISCARDABLE zend1.gif diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/php.gif b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/php.gif new file mode 100644 index 0000000000000000000000000000000000000000..7beda43fd41748a8b52319b2cd27baeec85d61e8 GIT binary patch literal 3872 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 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/test.php b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/test.php new file mode 100644 index 0000000..f4f3614 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/test.php @@ -0,0 +1,4 @@ + + diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend1.gif b/Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend1.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2b4379c6a238eb50c4894e21e3444f7044def0c GIT binary patch literal 4440 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 YhIquTjV_O;V1pOkc*scBN)P}5J6I=s5dZ)H literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dpr new file mode 100644 index 0000000..c6f5c16 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dpr @@ -0,0 +1,14 @@ +program Sample2; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}, + PHP4Delphi; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dproj new file mode 100644 index 0000000..e4d9403 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dproj @@ -0,0 +1,105 @@ + + + {16E51842-8708-49A4-B246-6A7FA41BEA1B} + Sample2.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Sample2.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
Form1
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Sample2.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.res b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.ddp b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.dfm new file mode 100644 index 0000000..11b602d --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.dfm @@ -0,0 +1,84 @@ +object Form1: TForm1 + Left = 414 + Top = 391 + BorderStyle = bsDialog + Caption = 'Calculator' + ClientHeight = 120 + ClientWidth = 336 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 40 + Top = 36 + Width = 6 + Height = 13 + Caption = '+' + end + object Label2: TLabel + Left = 140 + Top = 36 + Width = 6 + Height = 13 + Caption = '=' + end + object Label3: TLabel + Left = 156 + Top = 36 + Width = 3 + Height = 13 + end + object Edit1: TEdit + Left = 8 + Top = 8 + Width = 121 + Height = 21 + TabOrder = 0 + Text = '2' + end + object Edit2: TEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + TabOrder = 1 + Text = '2' + end + object Button1: TButton + Left = 244 + Top = 88 + Width = 75 + Height = 25 + Caption = 'Calculate' + TabOrder = 2 + OnClick = Button1Click + end + object psvPHP1: TpsvPHP + Variables = < + item + Name = 'x' + end + item + Name = 'y' + end + item + Name = 'z' + Value = '0' + end> + Left = 20 + Top = 80 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 76 + Top = 84 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.pas b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.pas new file mode 100644 index 0000000..6e95849 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.pas @@ -0,0 +1,54 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, php4delphi, PHPCommon; + +type + TForm1 = class(TForm) + psvPHP1: TpsvPHP; + Edit1: TEdit; + Edit2: TEdit; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + Button1: TButton; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TForm1.Button1Click(Sender: TObject); +begin + PHPEngine.StartupEngine; + psvPHP1.Variables.Items[0].Value := AnsiString(Edit1.text); + psvPHP1.Variables.Items[1].Value := AnsiString(Edit2.text); + psvPHP1.RunCode('$z = $x + $y;'); + Label3.Caption := string(psvPHP1.VariableByName('z').Value); + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/sample2/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ + + {F3DB80DF-A660-4692-938A-40B8E527E182} + Sample3.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + Sample3.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
Form1
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Sample3.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.res b/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.ddp b/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.dfm new file mode 100644 index 0000000..e6deda2 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.dfm @@ -0,0 +1,91 @@ +object Form1: TForm1 + Left = 309 + Top = 184 + BorderStyle = bsDialog + Caption = 'Built-in functions and class sample' + ClientHeight = 331 + ClientWidth = 460 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Memo1: TMemo + Left = 8 + Top = 8 + Width = 329 + Height = 89 + Lines.Strings = ( + 'delphi_Show_Message("Hello, Delphi!");') + TabOrder = 0 + end + object Memo2: TMemo + Left = 8 + Top = 108 + Width = 329 + Height = 89 + Lines.Strings = ( + '$a = new php4delphi_author();' + '$a->send_email();') + TabOrder = 1 + end + object Memo3: TMemo + Left = 8 + Top = 212 + Width = 329 + Height = 89 + Lines.Strings = ( + 'echo delphi_get_system_directory();') + TabOrder = 2 + end + object Button1: TButton + Left = 364 + Top = 60 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 3 + OnClick = Button1Click + end + object Button2: TButton + Left = 364 + Top = 160 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 4 + OnClick = Button2Click + end + object Button3: TButton + Left = 372 + Top = 268 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 5 + OnClick = Button3Click + end + object psvPHP1: TpsvPHP + Variables = < + item + Name = 'test' + Value = 'test' + end> + Left = 112 + Top = 140 + end + object PHPEngine: TPHPEngine + HandleErrors = False + Constants = <> + ReportDLLError = False + Left = 116 + Top = 252 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.pas b/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.pas new file mode 100644 index 0000000..a71263f --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.pas @@ -0,0 +1,77 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{$I PHP.INC} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, Messages, SysUtils, + {$IFDEF VERSION6} Variants, {$ENDIF} Classes, Graphics, Controls, Forms, + Dialogs, php4delphi, StdCtrls, PHPCommon; + +type + TForm1 = class(TForm) + Memo1: TMemo; + Memo2: TMemo; + Memo3: TMemo; + Button1: TButton; + Button2: TButton; + Button3: TButton; + psvPHP1: TpsvPHP; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} +{$R WindowsXP.res} + +procedure TForm1.Button1Click(Sender: TObject); +begin + psvPHP1.RunCode(Memo1.Lines.text); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + psvPHP1.RunCode(Memo2.Lines.text); +end; + +procedure TForm1.Button3Click(Sender: TObject); +begin + ShowMessage(psvPHP1.RunCode(Memo3.Lines.text)); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/WindowsXP.res b/Demos Delphi 2009 (WideString support)/psvPHP/sample3/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.dfm b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.dfm new file mode 100644 index 0000000..c7ba0a4 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.dfm @@ -0,0 +1,103 @@ +object frmPHPTest: TfrmPHPTest + Left = 422 + Top = 286 + Width = 590 + Height = 435 + Caption = 'psvPHP test' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 241 + Top = 0 + Width = 3 + Height = 360 + Cursor = crHSplit + end + object Panel1: TPanel + Left = 0 + Top = 360 + Width = 582 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 397 + Top = 0 + Width = 185 + Height = 41 + Align = alRight + BevelOuter = bvNone + TabOrder = 0 + object Button1: TButton + Left = 100 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 0 + OnClick = Button1Click + end + end + end + object Panel3: TPanel + Left = 0 + Top = 0 + Width = 241 + Height = 360 + Align = alLeft + BevelOuter = bvNone + Caption = 'Panel3' + TabOrder = 1 + object memoScript: TMemo + Left = 0 + Top = 0 + Width = 241 + Height = 360 + Align = alClient + Lines.Strings = ( + 'phpinfo();') + ScrollBars = ssBoth + TabOrder = 0 + end + end + object Panel4: TPanel + Left = 244 + Top = 0 + Width = 338 + Height = 360 + Align = alClient + BevelOuter = bvNone + Caption = 'Panel4' + TabOrder = 2 + object MemoResult: TMemo + Left = 0 + Top = 0 + Width = 338 + Height = 360 + Align = alClient + ScrollBars = ssBoth + TabOrder = 0 + end + end + object psvPHP: TpsvPHP + Variables = <> + Left = 84 + Top = 148 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 80 + Top = 248 + end +end diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.pas b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.pas new file mode 100644 index 0000000..6227652 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.pas @@ -0,0 +1,53 @@ +unit frm_PHPTest; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + php4delphi, StdCtrls, ExtCtrls, PHPCommon; + +type + TfrmPHPTest = class(TForm) + Panel1: TPanel; + Panel2: TPanel; + Button1: TButton; + Panel3: TPanel; + Splitter1: TSplitter; + Panel4: TPanel; + memoScript: TMemo; + MemoResult: TMemo; + psvPHP: TpsvPHP; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmPHPTest: TfrmPHPTest; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TfrmPHPTest.Button1Click(Sender: TObject); +begin + MemoResult.Text := psvPHP.RunCode(memoScript.Text); +end; + +procedure TfrmPHPTest.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TfrmPHPTest.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dpr b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dpr new file mode 100644 index 0000000..b15444a --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dpr @@ -0,0 +1,13 @@ +program psvPHP_test; + +uses + Forms, + frm_PHPTest in 'frm_PHPTest.pas' {frmPHPTest}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmPHPTest, frmPHPTest); + Application.Run; +end. diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dproj b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dproj new file mode 100644 index 0000000..f733c63 --- /dev/null +++ b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dproj @@ -0,0 +1,105 @@ + + + {94D56EFB-C720-4470-B405-9E63F8B63477} + psvPHP_test.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + x86 + psvPHP_test.exe + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
frmPHPTest
+
+ + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + psvPHP_test.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.res b/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos/Bonus/JpegConverter/php_jpeg.bdsproj b/Demos/Bonus/JpegConverter/php_jpeg.bdsproj new file mode 100644 index 0000000..57df14a --- /dev/null +++ b/Demos/Bonus/JpegConverter/php_jpeg.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + php_jpeg.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Bonus/JpegConverter/php_jpeg.dpr b/Demos/Bonus/JpegConverter/php_jpeg.dpr index 9e02784..876e836 100644 --- a/Demos/Bonus/JpegConverter/php_jpeg.dpr +++ b/Demos/Bonus/JpegConverter/php_jpeg.dpr @@ -4,10 +4,11 @@ { Author: } { Serhiy Perevoznyk } { serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } +{ http://users.telenet.be/ws36637 } {*******************************************************} -{ $Id: php_jpeg.dpr,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: php_jpeg.dpr,v 7.4 10/2009 delphi32 Exp $ } + {$I PHP.INC} library php_jpeg; @@ -41,7 +42,7 @@ end; procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; begin php_info_print_table_start(); - php_info_print_table_row(2, PChar('JPEG support'), PChar('enabled')); + php_info_print_table_row(2, PAnsiChar('JPEG support'), PAnsiChar('enabled')); php_info_print_table_end(); end; @@ -63,8 +64,8 @@ procedure convert_bmp_jpeg (ht : integer; return_value : pzval; this_ptr : pzval return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} var - bmpName : PChar; - JpgName : PChar; + bmpName : PAnsiChar; + JpgName : PAnsiChar; param : pzval_array; Bitmap : TBitmap; Jpg : TJPEGImage; @@ -112,12 +113,12 @@ procedure show_bmp_jpeg (ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} var - bmpName : PChar; + bmpName : PAnsiChar; param : pzval_array; Bitmap : TBitmap; Jpg : TJPEGImage; MS : TMemoryStream; - _content_type : PChar; + _content_type : PAnsiChar; begin if ht <> 1 then begin @@ -165,20 +166,20 @@ procedure sign_jpeg (ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} var - JpgName : PChar; - FontName : PChar; + JpgName : PAnsiChar; + FontName : PAnsiChar; Color : TColor; Size : integer; X : integer; Y : integer; - Sign : PChar; + Sign : PAnsiChar; param : pzval_array; Jpg : TJPEGImage; Bmp : TBitmap; MS : TMemoryStream; - _content_type : PChar; + _content_type : PAnsiChar; begin if ht <> 7 then @@ -244,6 +245,7 @@ function get_module : Pzend_module_entry; cdecl; begin if not PHPLoaded then LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); ModuleEntry.zend_api := ZEND_MODULE_API_NO; ModuleEntry.zts := USING_ZTS; @@ -264,8 +266,20 @@ begin Module_entry_table[2].fname := 'sign_jpeg'; Module_entry_table[2].handler := @sign_jpeg; + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; + + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; end; diff --git a/Demos/Bonus/PHPEncoder/phpencoder.bdsproj b/Demos/Bonus/PHPEncoder/phpencoder.bdsproj new file mode 100644 index 0000000..26ef967 --- /dev/null +++ b/Demos/Bonus/PHPEncoder/phpencoder.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + phpencoder.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Bonus/PHPEncoder/phpencoder.dpr b/Demos/Bonus/PHPEncoder/phpencoder.dpr index 21c37f5..a8fcfff 100644 --- a/Demos/Bonus/PHPEncoder/phpencoder.dpr +++ b/Demos/Bonus/PHPEncoder/phpencoder.dpr @@ -19,7 +19,7 @@ end; procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; begin php_info_print_table_start(); - php_info_print_table_row(2, PChar('php encryption'), PChar('enabled')); + php_info_print_table_row(2, PAnsiChar('php encryption'), PAnsiChar('enabled')); php_info_print_table_end(); end; @@ -41,7 +41,7 @@ procedure ex_dec(ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} var - FileName : PChar; + FileName : PAnsiChar; S : TFileStream; st : string; i : integer; @@ -59,7 +59,7 @@ begin for i := 1 to length(st) do if (st[i] <> #10) and (st[i] <> #13) then st[i] := chr ( ord(st[i]) xor 8); - zend_eval_string(PChar(st), nil, 'decoded', TSRMLS_DC); + zend_eval_string(PAnsiChar(st), nil, 'decoded', TSRMLS_DC); end; @@ -84,8 +84,20 @@ begin ModuleEntry.info_func := @php_info_module; Module_entry_table[0].fname := 'ex_dec'; Module_entry_table[0].handler := @ex_dec; + + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; end; diff --git a/Demos/Bonus/phpRegistry/php_registry.dproj b/Demos/Bonus/phpRegistry/php_registry.dproj new file mode 100644 index 0000000..908d12e --- /dev/null +++ b/Demos/Bonus/phpRegistry/php_registry.dproj @@ -0,0 +1,97 @@ + + + {BD821E37-7741-4995-A5BC-DF199938D093} + php_registry.dpr + True + Debug + 1 + Library + None + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + false + 00400000 + false + true + php_registry + System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + 1058 + false + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + Debug + + + RELEASE;$(DCC_Define) + 0 + false + 0 + + + true + false + DEBUG;$(DCC_Define) + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + + + + + php_registry.dpr + + + + False + True + False + + + 12 + + + + diff --git a/Demos/Bonus/phpRegistry/php_registry.dproj.local b/Demos/Bonus/phpRegistry/php_registry.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/Demos/Bonus/phpRegistry/php_registry.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/Demos/Bonus/phpRegistry/php_registry.identcache b/Demos/Bonus/phpRegistry/php_registry.identcache new file mode 100644 index 0000000000000000000000000000000000000000..b93c9d3c7dfd47bf89cbd594238b57d33c6ac9af GIT binary patch literal 84 zcmZQ%U|?`|wu(tfEsH5mO)JXJ$uEm3$S5#LNzEz9$c%AG&CM^4amvptEd~h(rKV>V VmlRck*zrYBj$TSZ5zrVo007wu8yf%s literal 0 HcmV?d00001 diff --git a/Demos/Bonus/phpRegistry/php_registry.stat b/Demos/Bonus/phpRegistry/php_registry.stat new file mode 100644 index 0000000..9501bb7 --- /dev/null +++ b/Demos/Bonus/phpRegistry/php_registry.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=72 +DesignerSecs=3 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=5 +StartTime=16.02.2019 19:24:32 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/Demos/Bonus/wincon/test_wincon.php b/Demos/Bonus/wincon/test_wincon.php new file mode 100644 index 0000000..3967338 --- /dev/null +++ b/Demos/Bonus/wincon/test_wincon.php @@ -0,0 +1,13 @@ + diff --git a/Demos/Delphi4PHP/DesignIDE/d4pide.dpr b/Demos/Delphi4PHP/DesignIDE/d4pide.dpr new file mode 100644 index 0000000..f8afdd2 --- /dev/null +++ b/Demos/Delphi4PHP/DesignIDE/d4pide.dpr @@ -0,0 +1,166 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{$I php.inc} + +library d4pide; + +uses + Windows, SysUtils, Classes, zendTypes, ZENDAPI, phpTypes, PHPAPI, jclRegistry, + jclSysInfo; + + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PChar('Delphi for PHP support'), PChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +procedure d4p_getversion (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +var + str : string; +begin + str := '1.0'; + ZVAL_STRING(return_value, PChar(str), true); +end; + +procedure d4p_getroot (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +var + str : string; +begin + str := RegReadStringDef(HKEY_CURRENT_USER, 'Software\CodeGear\Delphi for PHP\1.0', 'App', ''); + ZVAL_STRING(return_value, PChar(str), true); +end; + +procedure d4p_getpackages (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +var + L : TStringList; + cnt : integer; +begin + if _array_init(return_value, nil, 0) = FAILURE then + begin + php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); + ZVAL_FALSE(return_value); + Exit; + end; + + L := TStringList.Create; + try + RegGetValueNames (HKEY_CURRENT_USER, 'Software\CodeGear\Delphi for PHP\1.0\Packages', L); + except + L.Clear; + end; + for cnt := 0 to L.Count - 1 do + + add_next_index_string(return_value, PChar(RegReadString(HKEY_CURRENT_USER, 'Software\CodeGear\Delphi for PHP\1.0\Packages', L[cnt])), 1); + + L.Free; +end; + +procedure d4p_getphpdir (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +var + str : string; +begin + str := RegReadStringDef(HKEY_CURRENT_USER, 'Software\CodeGear\Delphi for PHP\1.0\Internal webserver', 'PHP Directory', ''); + ZVAL_STRING(return_value, PChar(str), true); +end; + +procedure d4p_getport (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +var + str : string; +begin + str := RegReadStringDef(HKEY_CURRENT_USER, 'Software\CodeGear\Delphi for PHP\1.0\Internal webserver', 'Port', ''); + ZVAL_STRING(return_value, PChar(str), true); +end; + +procedure d4p_isrunning (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +var + H : DWORD; +begin + H := GetPidFromProcessName('delphiforphp.exe'); + if H = INVALID_HANDLE_VALUE then + ZVAL_FALSE(return_value) + else + ZVAL_TRUE(return_value); +end; + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..6] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'd4pide'; + ModuleEntry.version := '1.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + + Module_entry_table[0].fname := 'd4p_getversion'; + Module_entry_table[0].handler := @d4p_getversion; + Module_entry_table[1].fname := 'd4p_getroot'; + Module_entry_table[1].handler := @d4p_getroot; + Module_entry_table[2].fname := 'd4p_getpackages'; + Module_entry_table[2].handler := @d4p_getpackages; + Module_entry_table[3].fname := 'd4p_getphpdir'; + Module_entry_table[3].handler := @d4p_getphpdir; + Module_entry_table[4].fname := 'd4p_getport'; + Module_entry_table[4].handler := @d4p_getport; + Module_entry_table[5].fname := 'd4p_isrunning'; + Module_entry_table[5].handler := @d4p_isrunning; + Module_entry_table[6].fname := nil; + Module_entry_table[6].handler := nil; + + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos/Delphi4PHP/DesignIDE/readme.txt b/Demos/Delphi4PHP/DesignIDE/readme.txt new file mode 100644 index 0000000..f51cd9a --- /dev/null +++ b/Demos/Delphi4PHP/DesignIDE/readme.txt @@ -0,0 +1,59 @@ +PHP Extension for "Delphi for PHP" + +d4pide.dll is PHP Extension designed for Delphi for PHP. +This extensions implements additional PHP functions that can be used in PHP scripts. + +Functions: + +1. d4p_getversion +This function returns the version of Delphi for PHP +Example: echo d4p_getversion(); + +2. d4p_getroot +This functions returns the root folder of Delphi for PHP +Example: echo d4p_getroot(); + +3. d4p_getpackages +This function returns the list of the installed packages +Example: + + function Button3Click($sender, $params) + { + $array = d4p_getpackages(); + $count = count($array); + for ($i = 0; $i < $count; $i++) { + $this->Memo1->AddLine($array[$i]) ; + } + } + +4. d4p_getphpdir +This function returns the PHP root folder +Example: echo d4p_getphpdir(); + +5. d4p_getport +This function returns the port number of the internal web server +Example: echo d4p_getport(); + +6. d4p_isrunning +This function can be used to determine if Delphi for PHP is currently running +Example: + if (d4p_isrunning()) + { + $this->Memo1->AddLine("running"); + } + + +Installation: + +1. Close Delphi for PHP +2. Copy d4pide.dll to Delphi for PHP \php\ext folder +3. Add following line to php.ini.template file: + extension=d4pide.dll +4. Launch Delphi for PHP + + + +Author: +Serhiy Perevoznyk +Belgium +http://users.chello.be/ws36637/ diff --git a/Demos/Extensions/Borland Demo/Unit1.ddp b/Demos/Extensions/Borland Demo/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos/Extensions/Borland Demo/Unit1.dfm b/Demos/Extensions/Borland Demo/Unit1.dfm index d037d11..c542afd 100644 --- a/Demos/Extensions/Borland Demo/Unit1.dfm +++ b/Demos/Extensions/Borland Demo/Unit1.dfm @@ -25,64 +25,8 @@ object PHPExtension1: TPHPExtension1 OnExecute = PHPExtension1Functions1Execute end> ModuleName = 'borland_demo' - Left = 192 - Top = 168 Height = 640 Width = 870 - object Customer: TTable - DatabaseName = 'Phpdemo' - SessionName = 'Session1_2' - IndexFieldNames = 'Company' - TableName = 'CUSTOMER.DB' - Left = 26 - Top = 64 - object CustomerCustNo: TFloatField - FieldName = 'CustNo' - end - object CustomerCompany: TStringField - FieldName = 'Company' - Size = 30 - end - end - object BioLife: TTable - DatabaseName = 'Phpdemo' - SessionName = 'Session1_2' - TableName = 'biolife.db' - Left = 25 - Top = 126 - object BioLifeSpeciesNo: TFloatField - FieldName = 'Species No' - end - object BioLifeCategory: TStringField - FieldName = 'Category' - Size = 15 - end - object BioLifeCommon_Name: TStringField - FieldName = 'Common_Name' - Size = 30 - end - object BioLifeSpeciesName: TStringField - FieldName = 'Species Name' - Size = 40 - end - object BioLifeLengthcm: TFloatField - FieldName = 'Length (cm)' - end - object BioLifeLength_In: TFloatField - FieldName = 'Length_In' - end - object BioLifeNotes: TMemoField - FieldName = 'Notes' - OnGetText = BioLifeNotesGetText - BlobType = ftMemo - Size = 50 - end - object BioLifeGraphic: TGraphicField - FieldName = 'Graphic' - OnGetText = BioLifeGraphicGetText - BlobType = ftGraphic - end - end object Root: TPageProducer HTMLDoc.Strings = ( '' @@ -164,36 +108,13 @@ object PHPExtension1: TPHPExtension1 '' '' '') - DataSet = BioLife Left = 110 Top = 126 end object CustSource: TDataSource - DataSet = Customer Left = 90 Top = 65 end - object CustomerOrders: TQueryTableProducer - Caption = 'Customer Orders' - Columns = < - item - FieldName = 'OrderNo' - end - item - FieldName = 'SaleDate' - Title.Align = haCenter - end - item - FieldName = 'ShipDate' - end> - Query = Query1 - TableAttributes.Border = 1 - TableAttributes.CellSpacing = 1 - TableAttributes.CellPadding = 1 - TableAttributes.Width = 50 - Left = 170 - Top = 64 - end object CustomerList: TPageProducer HTMLDoc.Strings = ( '' @@ -215,34 +136,4 @@ object PHPExtension1: TPHPExtension1 Left = 118 Top = 9 end - object Query1: TQuery - DatabaseName = 'Phpdemo' - SessionName = 'Session1_2' - DataSource = CustSource - SQL.Strings = ( - 'SELECT *' - 'FROM ORDERS' - 'WHERE' - '(CustNo = :CustNo)') - Left = 24 - Top = 8 - ParamData = < - item - DataType = ftFloat - Name = 'CustNo' - ParamType = ptUnknown - end> - end - object Database1: TDatabase - AliasName = 'DBDEMOS' - DatabaseName = 'Phpdemo' - SessionName = 'Session1_2' - Left = 240 - Top = 200 - end - object Session1: TSession - AutoSessionName = True - Left = 164 - Top = 212 - end end diff --git a/Demos/Extensions/Borland Demo/Unit1.pas b/Demos/Extensions/Borland Demo/Unit1.pas index 13d8348..fce4133 100644 --- a/Demos/Extensions/Borland Demo/Unit1.pas +++ b/Demos/Extensions/Borland Demo/Unit1.pas @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } unit Unit1; @@ -24,34 +24,19 @@ interface phpTypes, phpAPI, phpFunctions, - PHPModules, DBWeb, Db, DSProd, HTTPApp, DBTables, Graphics, JPeg; + PHPModules, DBWeb, Db, DSProd, HTTPApp, DBTables, Graphics, JPeg, + DBBdeWeb, HTTPProd; type TPHPExtension1 = class(TPHPExtension) - Customer: TTable; - CustomerCustNo: TFloatField; - CustomerCompany: TStringField; - BioLife: TTable; - BioLifeSpeciesNo: TFloatField; - BioLifeCategory: TStringField; - BioLifeCommon_Name: TStringField; - BioLifeSpeciesName: TStringField; - BioLifeLengthcm: TFloatField; - BioLifeLength_In: TFloatField; - BioLifeNotes: TMemoField; - BioLifeGraphic: TGraphicField; Root: TPageProducer; BioLifeProducer: TDataSetPageProducer; CustSource: TDataSource; - CustomerOrders: TQueryTableProducer; CustomerList: TPageProducer; - Query1: TQuery; - Database1: TDatabase; - Session1: TSession; procedure PHPExtension1Functions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure RootHTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); @@ -60,7 +45,7 @@ TPHPExtension1 = class(TPHPExtension) var ReplaceText: String); procedure PHPExtension1Functions1Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure PHPExtensionCreate(Sender: TObject); procedure BioLifeGraphicGetText(Sender: TField; var Text: String; DisplayText: Boolean); @@ -81,7 +66,7 @@ implementation {$R *.DFM} procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var Action : string; @@ -95,7 +80,7 @@ procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; begin ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(ts); + gl := GetSAPIGlobals; Action := Parameters.Values('Action'); if Action = '' then @@ -163,7 +148,7 @@ procedure TPHPExtension1.RootHTMLTag(Sender: TObject; Tag: TTag; if SameText(TagString, 'MODULENAME') then begin ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(ts); + gl := GetSAPIGlobals; ReplaceText := gl.request_info.request_uri; end; end; @@ -177,7 +162,7 @@ procedure TPHPExtension1.CustomerListHTMLTag(Sender: TObject; Tag: TTag; ts : pointer; begin ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(ts); + gl := GetSAPIGlobals; ScriptName := gl.request_info.request_uri; if CompareText(TagString, 'CUSTLIST') = 0 then @@ -195,7 +180,7 @@ procedure TPHPExtension1.CustomerListHTMLTag(Sender: TObject; Tag: TTag; end; procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var CustNo : string; @@ -229,7 +214,7 @@ procedure TPHPExtension1.BioLifeGraphicGetText(Sender: TField; begin ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(ts); + gl := GetSAPIGlobals; ScriptName := gl.request_info.request_uri; Text := Format('[%s]', diff --git a/Demos/Extensions/Borland Demo/borland_demo.dproj b/Demos/Extensions/Borland Demo/borland_demo.dproj new file mode 100644 index 0000000..d32853c --- /dev/null +++ b/Demos/Extensions/Borland Demo/borland_demo.dproj @@ -0,0 +1,503 @@ + + + {05F350A9-D317-4A71-AB3B-294D6EB85877} + borland_demo.dpr + True + Debug + 1 + Library + None + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + false + borland_demo + false + false + 1058 + false + true + false + System;Xml;Data;Datasnap;Web;Soap;Winapi;Vcl.Imaging;$(DCC_Namespace) + 00400000 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + + + Debug + 1033 + borland_demo_Icon.ico + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + borland_demo_Icon.ico + + + 0 + RELEASE;$(DCC_Define) + false + 0 + + + DEBUG;$(DCC_Define) + false + true + + + + + ..\..\..\php4Applications\PHP 5.3.0\php4App.dll + ..\..\..\php4Applications\PHP 5.3.0\php4App.dll + + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + + + + + borland_demo.dpr + + + + False + True + False + + + + + true + + + + + true + + + + + true + + + + + true + + + + + borland_demo.dll + true + + + + + 0 + .dll;.bpl + + + 1 + .dylib + + + + + Contents\Resources + 1 + + + + + classes + 1 + + + + + Contents\MacOS + 0 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + library\lib\mips + 1 + + + + + 1 + + + 1 + + + 0 + + + 1 + + + 1 + + + library\lib\armeabi-v7a + 1 + + + 1 + + + + + 0 + + + 1 + .framework + + + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + 1 + + + + + + library\lib\armeabi + 1 + + + + + 0 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-large + 1 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + res\drawable-hdpi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + + + Assets + 1 + + + Assets + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\values + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + res\drawable + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 0 + .bpl + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\drawable-ldpi + 1 + + + + + + + + + + + + + + 12 + + + + +
diff --git a/Demos/Extensions/Borland Demo/borland_demo.dproj.local b/Demos/Extensions/Borland Demo/borland_demo.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/Demos/Extensions/Borland Demo/borland_demo.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/Demos/Extensions/Borland Demo/borland_demo.identcache b/Demos/Extensions/Borland Demo/borland_demo.identcache new file mode 100644 index 0000000000000000000000000000000000000000..a4de94c63cb0f686a5bf57ec82a0a826b035ee15 GIT binary patch literal 153 zcmZQ#U|?``wu(t9E>4Xp$S5#LNzEz9$c%AG&CM^4ajhsx%`48#&nu2`$}h@E%u7)K lNyH>UIPob!j$TSZ5zr7gup-&C(7enNL%o8;Vz?PV1^_b!FU0@= literal 0 HcmV?d00001 diff --git a/Demos/Extensions/Borland Demo/borland_demo.res b/Demos/Extensions/Borland Demo/borland_demo.res index 55f874204136d6cde31b105890029f4503c878e3..ba6a3629d6121997d3f25b835b6156cad74f8d5c 100644 GIT binary patch delta 630 zcmaiyO-chn5QX0)gBV576PQJo5+Y=yh#E+(uIQQU<@C_YL7bya>!@Ez=eJsZg*%FOc7eLymB4FmuyDDOo zZh~>7S6EE|dW3LF4LSf0{v|8Rxc>UK<0Z;v!b5HSIt`&Usz6mo)+2~9!C5|CG!fx+ zTz(c_(b<@#N8?PJ)@oi`sZem8X*uYS+^tZH<;(f+{!4x*>y@7C+3jPdMF;F8StFHm aRn&4L&`=$z!g!o9BrSS6TZ^M)?f(WZQ&<-O delta 17 YcmX@Z{f2FV!e$319cD&>$+@iZ05uN;(*OVf diff --git a/Demos/Extensions/Borland Demo/borland_demo.stat b/Demos/Extensions/Borland Demo/borland_demo.stat new file mode 100644 index 0000000..09e68d2 --- /dev/null +++ b/Demos/Extensions/Borland Demo/borland_demo.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=17 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1253 +OtherSecs=30 +StartTime=21.09.2018 15:39:40 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/Demos/Extensions/Borland Demo/borland_demo_Icon.ico b/Demos/Extensions/Borland Demo/borland_demo_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1998c2db4f9d3c870f5dc2715f351a4b348b459b GIT binary patch literal 766 zcmaKqyK2KQ6o!A-#TrvnD4m*&9aB1V$dFEXfxdvdXz>yV#03xaH8JZaCjlJ?fc?;C-O)_f`S?P*r~7$R$;w zZCg65e6ZH7D0XLZLuhGwwO`8oKgTc4_%!^;O3X(t`#=H5K0(b9_ebO@ynz7=?O6L% zHBU?}oP~g?X@o;SVT|#dNiB6?Eu7?L=KY?v4*O}@V61iS>uK#aAZy{g7ETVlIO8&J z&f-gB>eGC3;}{|T%``^-h#c`e#cVNqqFW_8i>@D+>20m&E}jKxm^>tPHsEE+fwCy2 z8Iz??V1$c;8n`Qw6LVKCV+oLwayXjU6h`z)@o=X!7UKFb*jCwt)?I6hZ pK9d#jz6ORtU9wZB{X@>T7jqO9Z-Cb=u-PHn+A7}JRfo^d+HY9lw=e(z literal 0 HcmV?d00001 diff --git a/Demos/Extensions/Class demo/class_demo.bdsproj b/Demos/Extensions/Class demo/class_demo.bdsproj new file mode 100644 index 0000000..59f6d7a --- /dev/null +++ b/Demos/Extensions/Class demo/class_demo.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + class_demo.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/Class demo/dm_Class.ddp b/Demos/Extensions/Class demo/dm_Class.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos/Extensions/Class demo/dm_Class.pas b/Demos/Extensions/Class demo/dm_Class.pas index ce1c304..d71692a 100644 --- a/Demos/Extensions/Class demo/dm_Class.pas +++ b/Demos/Extensions/Class demo/dm_Class.pas @@ -4,10 +4,10 @@ { Author: } { Serhiy Perevoznyk } { serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } +{ http://users.telenet.be/ws36637 } {*******************************************************} -{ $Id: dm_Class.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: dm_Class.pas,v 7.0 04/2007 delphi32 Exp $ } unit dm_Class; @@ -45,7 +45,7 @@ Tclassdemo = class(TPHPExtension) this_ptr: Pzval; TSRMLS_DC: Pointer); procedure classdemoFunctions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } public @@ -92,10 +92,10 @@ procedure Tclassdemo.GetEmailExecute(Sender: TPHPClassInstance; end; procedure Tclassdemo.classdemoFunctions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin - PHPDemoClass.ProduceInstance(Functions[0].ZendVar.AsZendVariable); + PHPDemoClass.ProduceInstance(ZendVar.AsZendVariable); end; end. diff --git a/Demos/Extensions/Delphi Class 1/delphi_class.bdsproj b/Demos/Extensions/Delphi Class 1/delphi_class.bdsproj new file mode 100644 index 0000000..16719f2 --- /dev/null +++ b/Demos/Extensions/Delphi Class 1/delphi_class.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + delphi_class.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/Delphi Class 1/delphi_class_module.pas b/Demos/Extensions/Delphi Class 1/delphi_class_module.pas index d338d33..2ee6ce4 100644 --- a/Demos/Extensions/Delphi Class 1/delphi_class_module.pas +++ b/Demos/Extensions/Delphi Class 1/delphi_class_module.pas @@ -34,23 +34,23 @@ interface TPHDelphiPExtension = class(TPHPExtension) procedure DelphiMessageExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure FormCreateExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure SetPropertyExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure ClassFreeExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure PHPExtensionCreate(Sender: TObject); procedure GetPropertyExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure ClassCreateExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } @@ -176,7 +176,7 @@ implementation {$R *.DFM} procedure TPHDelphiPExtension.ClassCreateExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var @@ -213,7 +213,7 @@ procedure TPHDelphiPExtension.ClassCreateExecute(Sender: TObject; end; procedure TPHDelphiPExtension.GetPropertyExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var Obj : TObject; @@ -225,14 +225,14 @@ procedure TPHDelphiPExtension.GetPropertyExecute(Sender: TObject; end; procedure TPHDelphiPExtension.ClassFreeExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin TObject(Parameters[0].ZendVariable.AsInteger).Free; end; procedure TPHDelphiPExtension.SetPropertyExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var Obj : TObject; @@ -244,7 +244,7 @@ procedure TPHDelphiPExtension.SetPropertyExecute(Sender: TObject; end; procedure TPHDelphiPExtension.FormCreateExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var CN : string; @@ -277,7 +277,7 @@ procedure TPHDelphiPExtension.FormCreateExecute(Sender: TObject; end; procedure TPHDelphiPExtension.DelphiMessageExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin ShowMessage(Parameters[0].ZendVariable.AsString); diff --git a/Demos/Extensions/Delphi Class 2/delphi_class2.bdsproj b/Demos/Extensions/Delphi Class 2/delphi_class2.bdsproj new file mode 100644 index 0000000..8385cdd --- /dev/null +++ b/Demos/Extensions/Delphi Class 2/delphi_class2.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + delphi_class2.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/Delphi Class 2/delphi_class2.dpr b/Demos/Extensions/Delphi Class 2/delphi_class2.dpr index 082ca7a..96005e8 100644 --- a/Demos/Extensions/Delphi Class 2/delphi_class2.dpr +++ b/Demos/Extensions/Delphi Class 2/delphi_class2.dpr @@ -28,7 +28,7 @@ end; procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; begin php_info_print_table_start(); - php_info_print_table_row(2, PChar('Delphi classes support'), PChar('enabled')); + php_info_print_table_row(2, PAnsiChar('Delphi classes support'), PAnsiChar('enabled')); php_info_print_table_end(); end; @@ -47,8 +47,66 @@ end; var moduleEntry : Tzend_module_entry; + DelphiTable : array [0..12] of zend_function_entry; +procedure InitDelphiFunctions; +begin + PHP_FUNCTION(DelphiTable[0], 'delphi_date', @delphi_date); + PHP_FUNCTION(DelphiTable[1], 'delphi_extract_file_dir', @delphi_extract_file_dir); + PHP_FUNCTION(DelphiTable[2], 'delphi_extract_file_drive', @delphi_extract_file_drive); + PHP_FUNCTION(DelphiTable[3], 'delphi_extract_file_name', @delphi_extract_file_name); + + DelphiTable[4].fname := 'delphi_extract_file_ext'; + DelphiTable[4].handler := @delphi_extract_file_ext; + {$IFDEF PHP4} + DelphiTable[4].func_arg_types := nil; + {$ELSE} + DelphiTable[4].arg_info := nil; + {$ENDIF} + + DelphiTable[5].fname := 'delphi_show_message'; + DelphiTable[5].handler := @delphi_show_message; + {$IFDEF PHP4} + DelphiTable[5].func_arg_types := nil; + {$ELSE} + DelphiTable[5].arg_info := nil; + {$ENDIF} + + DelphiTable[6].fname := 'register_delphi_object'; + delphitable[6].handler := @register_delphi_object; + {$IFDEF PHP4} + DelphiTable[6].func_arg_types := nil; + {$ELSE} + DelphiTable[6].arg_info := nil; + {$ENDIF} + + DelphiTable[7].fname := 'delphi_get_author'; + DelphiTable[7].handler := @delphi_get_author; + {$IFDEF PHP4} + DelphiTable[7].func_arg_types := nil; + {$ELSE} + DelphiTable[7].arg_info := nil; + {$ENDIF} + + DelphiTable[8].fname := 'delphi_str_date'; + DelphiTable[8].handler := @delphi_str_date; + {$IFDEF PHP4} + DelphiTable[8].func_arg_types := nil; + {$ELSE} + DelphiTable[8].arg_info := nil; + {$ENDIF} + + + PHP_FUNCTION(DelphiTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); + + + PHP_FUNCTION(DelphiTable[10], 'delphi_input_box', @delphi_input_box); + PHP_FUNCTION(DelphiTable[11], 'register_delphi_component', @register_delphi_component); + DelphiTable[12].fname := nil; + DelphiTable[12].handler := nil; +end; + function get_module : Pzend_module_entry; cdecl; begin if not PHPLoaded then @@ -69,6 +127,13 @@ begin {$ENDIF} ModuleEntry.functions := @DelphiTable[0]; ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} Result := @ModuleEntry; end; diff --git a/Demos/Extensions/Math/delphi_math.bdsproj b/Demos/Extensions/Math/delphi_math.bdsproj new file mode 100644 index 0000000..7a2c949 --- /dev/null +++ b/Demos/Extensions/Math/delphi_math.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + delphi_math.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/Math/extmain.pas b/Demos/Extensions/Math/extmain.pas index fcddfab..764d387 100644 --- a/Demos/Extensions/Math/extmain.pas +++ b/Demos/Extensions/Math/extmain.pas @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: extmain.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: extmain.pas,v 7.0 04/2007 delphi32 Exp $ } unit extmain; @@ -32,16 +32,16 @@ interface TMathExtension = class(TPHPExtension) procedure SinExecute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure CoshExecute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure ArcsinExecute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure ArccoshExecute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } public @@ -56,28 +56,28 @@ implementation {$R *.DFM} procedure TMathExtension.SinExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin ReturnValue := Sin(Parameters[0].ZendVariable.AsFloat); end; procedure TMathExtension.CoshExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin ReturnValue := Cosh(Parameters[0].Value); end; procedure TMathExtension.ArcsinExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin ReturnValue := ArcSin(Parameters[0].value); end; procedure TMathExtension.ArccoshExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin ReturnValue := ArcCosh(Parameters[0].ZendVariable.AsFloat); diff --git a/Demos/Extensions/Read array parameters/Unit1.ddp b/Demos/Extensions/Read array parameters/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/Extensions/Read array parameters/Unit1.dfm b/Demos/Extensions/Read array parameters/Unit1.dfm new file mode 100644 index 0000000..d1309d2 --- /dev/null +++ b/Demos/Extensions/Read array parameters/Unit1.dfm @@ -0,0 +1,25 @@ +object OneWireWrapper: TOneWireWrapper + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'blah' + Tag = 0 + Parameters = < + item + Name = 'i' + ParamType = tpInteger + end + item + Name = 'a' + ParamType = tpArray + end> + OnExecute = OneWireWrapperFunctions0Execute + Description = 'Test function for passing arrays' + end> + ModuleName = 'rarp' + Left = 192 + Top = 114 + Height = 150 + Width = 215 +end diff --git a/Demos/Extensions/Read array parameters/Unit1.pas b/Demos/Extensions/Read array parameters/Unit1.pas new file mode 100644 index 0000000..46d4e03 --- /dev/null +++ b/Demos/Extensions/Read array parameters/Unit1.pas @@ -0,0 +1,68 @@ +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TOneWireWrapper = class(TPHPExtension) + procedure OneWireWrapperFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + OneWireWrapper: TOneWireWrapper; + +implementation + +{$R *.DFM} + +procedure TOneWireWrapper.OneWireWrapperFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + variable : pzval; + ar : array of string; + cnt : integer; + tmp : ^ppzval; +begin + //This function reads array parameter + variable := Parameters.ParamByName('a').ZendValue; + if variable^._type = IS_ARRAY then + begin + SetLength(ar, zend_hash_num_elements(variable^.value.ht)); + for cnt := 0 to zend_hash_num_elements(variable^.value.ht) -1 do + begin + new(tmp); + zend_hash_index_find(variable^.value.ht, cnt, tmp); + ar[cnt] := tmp^^^.value.str.val; + freemem(tmp); + end; + //Array is stored now in "ar" variable + //Lets do something with it + ReturnValue := ''; + for cnt := 0 to Length(ar) - 1 do + ReturnValue := ReturnValue + ar[cnt]; + end + else + ReturnValue := ''; +end; + +end. \ No newline at end of file diff --git a/Demos/Extensions/Read array parameters/rarp.bdsproj b/Demos/Extensions/Read array parameters/rarp.bdsproj new file mode 100644 index 0000000..482c70a --- /dev/null +++ b/Demos/Extensions/Read array parameters/rarp.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + rarp.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/Read array parameters/rarp.dpr b/Demos/Extensions/Read array parameters/rarp.dpr new file mode 100644 index 0000000..b4402d8 --- /dev/null +++ b/Demos/Extensions/Read array parameters/rarp.dpr @@ -0,0 +1,16 @@ +library rarp; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {OneWireWrapper: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TOneWireWrapper, OneWireWrapper); + Application.Run; +end. \ No newline at end of file diff --git a/Demos/Extensions/Read array parameters/rarp.res b/Demos/Extensions/Read array parameters/rarp.res new file mode 100644 index 0000000000000000000000000000000000000000..12285339869941018a4fabc8ac660d953d8887af GIT binary patch literal 876 zcmZuw!D`e{6g`;)45ZX42(7CQp|tKaWGUE6i{ireABr?v86*8G_oYa(EsH5tABp6QY{lccv56Ijv3zT^ z19e@C-2COG;9(9a-zxRU+>^PUYH1+j}xxlrXAFT7wca-=1dawoNZ1^kc zxi#EAaOu; + \ No newline at end of file diff --git a/Demos/Extensions/Resources/Unit1.pas b/Demos/Extensions/Resources/Unit1.pas index 06a760e..35c3fba 100644 --- a/Demos/Extensions/Resources/Unit1.pas +++ b/Demos/Extensions/Resources/Unit1.pas @@ -21,10 +21,10 @@ Tres_module = class(TPHPExtension) procedure PHPExtensionModuleInit(Sender: TObject; TSRMLS_DC: Pointer); procedure PHPExtension1Functions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure PHPExtension1Functions1Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } public @@ -66,7 +66,7 @@ procedure Tres_module.PHPExtensionModuleInit(Sender: TObject; end; procedure Tres_module.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var rc : PMyResource; @@ -75,18 +75,19 @@ procedure Tres_module.PHPExtension1Functions0Execute(Sender: TObject; rc := emalloc(sizeof(TMyResource)); rc^.resource_link := 1; rc^.resource_string := 'Hello'; - rn := zend_register_resource(Functions[0].ZendVar.AsZendVariable, rc, le_myresource); - ZVAL_RESOURCE(Functions[0].ZendVar.AsZendVariable, rn); + rn := zend_register_resource(ZendVar.AsZendVariable, rc, le_myresource); + ZVAL_RESOURCE(ZendVar.AsZendVariable, rn); end; procedure Tres_module.PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var rc : PMyResource; - + Z : PZVAL; begin - rc := zend_fetch_resource(@Parameters[0].ZendValue, TSRMLS_DC, -1, 'my resource', nil, 1, le_myresource); + Z := Parameters[0].ZendValue; + rc := zend_fetch_resource(@Z, TSRMLS_DC, -1, 'my resource', nil, 1, le_myresource); ReturnValue := String(rc^.resource_string); end; diff --git a/Demos/Extensions/Resources/res_ext.bdsproj b/Demos/Extensions/Resources/res_ext.bdsproj new file mode 100644 index 0000000..56f22f4 --- /dev/null +++ b/Demos/Extensions/Resources/res_ext.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + res_ext.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/array result/Unit1.ddp b/Demos/Extensions/array result/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/Extensions/array result/Unit1.pas b/Demos/Extensions/array result/Unit1.pas index 9a38069..a87cfdc 100644 --- a/Demos/Extensions/array result/Unit1.pas +++ b/Demos/Extensions/array result/Unit1.pas @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } unit Unit1; @@ -31,10 +31,10 @@ interface TPHPExtension1 = class(TPHPExtension) procedure PHPExtension1Functions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure PHPExtension1Functions1Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } public @@ -49,7 +49,7 @@ implementation {$R *.DFM} procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var @@ -60,7 +60,7 @@ procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; // This demo shows how to use zend variable and work with complex // PHP types - pval := Functions[0].ZendVar.AsZendVariable; + pval := ZendVar.AsZendVariable; if _array_init(pval, nil, 0) = FAILURE then begin php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); @@ -76,7 +76,7 @@ procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; end; procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); var pval : pzval; @@ -84,7 +84,7 @@ procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; months : pzval; smonths : pzval; begin - pval := Functions[1].ZendVar.AsZendVariable; + pval := ZendVar.AsZendVariable; if _array_init(pval, nil, 0) = FAILURE then begin php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); diff --git a/Demos/Extensions/array result/rarray.bdsproj b/Demos/Extensions/array result/rarray.bdsproj new file mode 100644 index 0000000..3178fb8 --- /dev/null +++ b/Demos/Extensions/array result/rarray.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + rarray.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/array result/rarray.dproj b/Demos/Extensions/array result/rarray.dproj new file mode 100644 index 0000000..cbba566 --- /dev/null +++ b/Demos/Extensions/array result/rarray.dproj @@ -0,0 +1,112 @@ + + + {623FFC65-09C5-4426-8422-F7AB0072B09F} + rarray.dpr + True + Debug + 1 + Library + None + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + false + true + 00400000 + 1 + true + rarray + System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1 + 2057 + false + false + + + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + true + rarray_Icon.ico + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + Debug + + + rarray_Icon.ico + + + RELEASE;$(DCC_Define) + 0 + false + 0 + + + true + false + DEBUG;$(DCC_Define) + + + + MainSource + + +
PHPExtension1
+ TPHPExtension +
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + VCLApplication + + + + rarray.dpr + + + + False + True + False + + + 12 + + + +
diff --git a/Demos/Extensions/array result/rarray.dproj.local b/Demos/Extensions/array result/rarray.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/Demos/Extensions/array result/rarray.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/Demos/Extensions/array result/rarray.identcache b/Demos/Extensions/array result/rarray.identcache new file mode 100644 index 0000000000000000000000000000000000000000..46a0cdd95c5eac34f5b3980b9f1f3c13853cac92 GIT binary patch literal 163 zcmZQ#U|?`^wu(tfEsH5mO)JXJ$uEm3$S5#LNzEz9$c%AG&CM^4ajhsx%`48#&nu2e sEGkN@R47UbVQM1iHOv;RdF7|DKSw~_-)Ze}i(aKK;FNJDiMsRLYBJ+*<3bgu!Cy99YWDPSGj zUc{D;w1z*4FOc)7rr|t**CjVHo}n6eoqo1+PU{PK;h4lBsq=(G9YB*TVL753q6TW| z36c?YH`FK7$udD;1pnj1C6+nI*bzym+WI5u7-XLw6pWw=ai3?j(RWr&6Wub%0e&Yg z(qllb)}$x%9!h&QfVv?^l-ncHx|ErSmwTzCw$E3yV#03xaH8JZaCjlJ?fc?;C-O)_f`S?P*r~7$R$;w zZCg65e6ZH7D0XLZLuhGwwO`8oKgTc4_%!^;O3X(t`#=H5K0(b9_ebO@ynz7=?O6L% zHBU?}oP~g?X@o;SVT|#dNiB6?Eu7?L=KY?v4*O}@V61iS>uK#aAZy{g7ETVlIO8&J z&f-gB>eGC3;}{|T%``^-h#c`e#cVNqqFW_8i>@D+>20m&E}jKxm^>tPHsEE+fwCy2 z8Iz??V1$c;8n`Qw6LVKCV+oLwayXjU6h`z)@o=X!7UKFb*jCwt)?I6hZ pK9d#jz6ORtU9wZB{X@>T7jqO9Z-Cb=u-PHn+A7}JRfo^d+HY9lw=e(z literal 0 HcmV?d00001 diff --git a/Demos/Extensions/css/css.bdsproj b/Demos/Extensions/css/css.bdsproj new file mode 100644 index 0000000..601da01 --- /dev/null +++ b/Demos/Extensions/css/css.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + css.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/css/css.dpr b/Demos/Extensions/css/css.dpr index 59a0944..a128fc7 100644 --- a/Demos/Extensions/css/css.dpr +++ b/Demos/Extensions/css/css.dpr @@ -37,7 +37,7 @@ end; procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; begin php_info_print_table_start(); - php_info_print_table_row(2, PChar('Delphi CSS'), PChar('enabled')); + php_info_print_table_row(2, PAnsiChar('Delphi CSS'), PAnsiChar('enabled')); php_info_print_table_end(); end; @@ -57,7 +57,7 @@ procedure delphi_css(ht : integer; return_value : pzval; this_ptr : pzval; procedure Puts(Str : string); begin str := StringReplace(str, '\n', #13#10, [rfReplaceAll]); - php_body_write(Pchar(str), Length(str), TSRMLS_DC); + php_body_write(PAnsiChar(str), Length(str), TSRMLS_DC); end; begin @@ -104,10 +104,19 @@ begin ModuleEntry.info_func := @php_info_module; module_entry_table[0].fname := 'delphi_css'; module_entry_table[0].handler := @delphi_css; - module_entry_table[0].func_arg_types := nil; - ModuleEntry.functions := @module_entry_table[0]; - ModuleEntry._type := MODULE_PERSISTENT; - result := @ModuleEntry; + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; end; exports diff --git a/Demos/Extensions/css/css.dproj b/Demos/Extensions/css/css.dproj new file mode 100644 index 0000000..b32fbbe --- /dev/null +++ b/Demos/Extensions/css/css.dproj @@ -0,0 +1,99 @@ + + + {CE16E83A-351C-422B-9201-84377F49BCEF} + css.dpr + True + Debug + 1 + Library + None + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + false + css + false + 2057 + true + false + System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + true + false + 1 + 00400000 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + Debug + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + + + 0 + RELEASE;$(DCC_Define) + false + 0 + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + VCLApplication + + + + css.dpr + + + + False + True + False + + + 12 + + + + diff --git a/Demos/Extensions/css/css.dproj.local b/Demos/Extensions/css/css.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/Demos/Extensions/css/css.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/Demos/Extensions/css/css.identcache b/Demos/Extensions/css/css.identcache new file mode 100644 index 0000000000000000000000000000000000000000..d847324678fe32766a80779a4cd239b8b3b9a078 GIT binary patch literal 64 zcmZQ%U|`U9wu(t9E>4Xp$S5#LNzEz9$c%AG&CM^4ajhsx%`48#&nu2eE(T-0l!79l H7B~O^nz<6C literal 0 HcmV?d00001 diff --git a/Demos/Extensions/css/css.res b/Demos/Extensions/css/css.res new file mode 100644 index 0000000000000000000000000000000000000000..4adeb59400fc6d5e0919eb8ea0864f896fea3645 GIT binary patch literal 600 zcmZXS!AiqG5QhIq4%UM`}cESx?1irqHh6NU>6?)MkhzSRJ(lgI%^@$QasK+|tc|&aW z75@B6)?YLH`^r@%1NzD;r85!%ytztc$~A_TX`(mCx!zSEJan2!F;ku6F*Ddi5yW7v z@6t2V$ZbB|I>`NW2d&cZw)I{ACw_w#~m#JQ;l + + + + + + + + + + + php_class.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/php class/php_class.dpr b/Demos/Extensions/php class/php_class.dpr index 3346ba5..d123dbb 100644 --- a/Demos/Extensions/php class/php_class.dpr +++ b/Demos/Extensions/php class/php_class.dpr @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: php_class.dpr,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: php_class.dpr,v 7.0 04/2007 delphi32 Exp $ } {$I PHP.INC} @@ -148,6 +148,13 @@ begin {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} Result := @ModuleEntry; end; diff --git a/Demos/Extensions/phpDLL/Unit1.ddp b/Demos/Extensions/phpDLL/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos/Extensions/phpDLL/Unit1.pas b/Demos/Extensions/phpDLL/Unit1.pas index 0dd81dd..b2bbb36 100644 --- a/Demos/Extensions/phpDLL/Unit1.pas +++ b/Demos/Extensions/phpDLL/Unit1.pas @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } unit Unit1; @@ -31,7 +31,7 @@ interface TPHPExtension1 = class(TPHPExtension) procedure PHPExtension1Functions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } public @@ -46,7 +46,7 @@ implementation {$R *.DFM} procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin diff --git a/Demos/Extensions/phpDLL/phpDLL.bdsproj b/Demos/Extensions/phpDLL/phpDLL.bdsproj new file mode 100644 index 0000000..6c47695 --- /dev/null +++ b/Demos/Extensions/phpDLL/phpDLL.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + phpDLL.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/reference/Unit1.ddp b/Demos/Extensions/reference/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/Extensions/reference/Unit1.pas b/Demos/Extensions/reference/Unit1.pas index 8b57eaf..740ddbb 100644 --- a/Demos/Extensions/reference/Unit1.pas +++ b/Demos/Extensions/reference/Unit1.pas @@ -20,7 +20,7 @@ interface TPHPExtension1 = class(TPHPExtension) procedure PHPExtension1Functions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } public @@ -35,7 +35,7 @@ implementation {$R *.DFM} procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin ZVAL_STRING(Parameters[0].ZendValue, 'hello', true); diff --git a/Demos/Extensions/reference/php_ref.bdsproj b/Demos/Extensions/reference/php_ref.bdsproj new file mode 100644 index 0000000..93dbff0 --- /dev/null +++ b/Demos/Extensions/reference/php_ref.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + php_ref.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/skeleton/skeleton.bdsproj b/Demos/Extensions/skeleton/skeleton.bdsproj new file mode 100644 index 0000000..935ff46 --- /dev/null +++ b/Demos/Extensions/skeleton/skeleton.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + skeleton.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + C:\php\ext + + + + $(DELPHI)\Lib\Debug + vcl;rtl;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;vclx;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;php4DelphiR7;CoolTrayIcon_D6plus;psvLabelsR7;PSCControlsR7;cxLibraryVCLD7;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtItemsD7;dxBarExtDBItemsD7;dxsbD7;dxDockingD7;dxNavBarD7;dxPSCoreD7;dxPsPrVwAdvD7;dxPSLnksD7;dxPSTeeChartD7;dxPSDBTeeChartD7;cxEditorsVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxVerticalGridVCLD7;cxPageControlVCLD7;cxGridVCLD7;FreeBurner;FBTranscoder;FBAudioGrabber;SqlDir70;Vcwd7;MSICS_D7_Rtl;VirtualTreesD7;DSPack_D7;DirectX9_D7;WPTools5_D7;RemObjects_WebBroker_D7;RemObjects_Indy_D7;RemObjects_RODX_D7;RemObjects_BPDX_D7;DataAbstract_Core_D7;DataAbstract_IDE_D7;DataAbstract_DBXDriver_D7;DataAbstract_Scripting_D7;PascalScript_RO_D7;RaizeComponentsVcl + + + False + + + c:\php\skeleton.php + C:\php\php.exe + + False + c:\php + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/Extensions/skeleton/skeleton.dpr b/Demos/Extensions/skeleton/skeleton.dpr index 9712780..8448493 100644 --- a/Demos/Extensions/skeleton/skeleton.dpr +++ b/Demos/Extensions/skeleton/skeleton.dpr @@ -4,10 +4,12 @@ { Author: } { Serhiy Perevoznyk } { serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } {*******************************************************} -{ $Id: skeleton.dpr,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: skeleton.dpr,v 7.4 10/2009 delphi32 Exp $ } + {$I php.inc} library skeleton; @@ -29,7 +31,7 @@ end; procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; begin php_info_print_table_start(); - php_info_print_table_row(2, PChar('extname support'), PChar('enabled')); + php_info_print_table_row(2, PAnsiChar('extname support'), PAnsiChar('enabled')); php_info_print_table_end(); end; @@ -51,13 +53,15 @@ procedure confirm_extname_compiled (ht : integer; return_value : pzval; this_ptr return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} var -arg : PChar; +arg : PAnsiChar; str : string; param : pzval_array; begin + {$IFDEF PHP510} if return_value_ptr = nil then begin end; + {$ENDIF} if ht = 0 then begin @@ -72,8 +76,8 @@ begin end; arg := param[0]^.value.str.val; - str := Format('Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.', ['extname', arg]); - ZVAL_STRING(return_value, PChar(str), true); + str := Format('Congratulations! Module %.78s is now compiled into PHP.', [arg]); + ZVAL_STRING(return_value, PAnsiChar(str), true); dispose_pzval_array(param); end; @@ -104,6 +108,13 @@ begin {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} Result := @ModuleEntry; end; diff --git a/Demos/Extensions/skeleton/skeleton.dproj b/Demos/Extensions/skeleton/skeleton.dproj new file mode 100644 index 0000000..5d1cf97 --- /dev/null +++ b/Demos/Extensions/skeleton/skeleton.dproj @@ -0,0 +1,565 @@ + + + {56fae2c6-8299-400a-ad86-fdd3f0aca7c0} + skeleton.dpr + Debug + AnyCPU + DCC32 + C:\php\ext\skeleton.dll + + + 7.0 + False + False + 0 + C:\php\ext + $(DELPHI)\Lib\Debug + $(DELPHI)\Lib\Debug + $(DELPHI)\Lib\Debug + $(DELPHI)\Lib\Debug + RELEASE + + + 7.0 + C:\php\ext + $(DELPHI)\Lib\Debug + $(DELPHI)\Lib\Debug + $(DELPHI)\Lib\Debug + $(DELPHI)\Lib\Debug + DEBUG + + + Delphi.Personality + VCLApplication + + + c:\php\skeleton.php + C:\php\php.exe + False + c:\php + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + skeleton.dpr + + + + + + + MainSource + + + + + diff --git a/Demos/Tutorial/Step.01/Unit1.ddp b/Demos/Tutorial/Step.01/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos/Tutorial/Step.01/Unit1.dfm b/Demos/Tutorial/Step.01/Unit1.dfm index 59d99f7..50aaa09 100644 --- a/Demos/Tutorial/Step.01/Unit1.dfm +++ b/Demos/Tutorial/Step.01/Unit1.dfm @@ -2,6 +2,8 @@ object PHPExtension1: TPHPExtension1 OldCreateOrder = False Version = '0.0' Functions = <> - Height = 0 - Width = 0 + Left = 512 + Top = 312 + Height = 331 + Width = 444 end diff --git a/Demos/Tutorial/Step.01/Unit1.pas b/Demos/Tutorial/Step.01/Unit1.pas index 9f24204..ecbc59f 100644 --- a/Demos/Tutorial/Step.01/Unit1.pas +++ b/Demos/Tutorial/Step.01/Unit1.pas @@ -9,7 +9,7 @@ unit Unit1; -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } interface diff --git a/Demos/Tutorial/Step.02/Unit1.ddp b/Demos/Tutorial/Step.02/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos/Tutorial/Step.02/Unit1.dfm b/Demos/Tutorial/Step.02/Unit1.dfm index 4152a0a..111df55 100644 --- a/Demos/Tutorial/Step.02/Unit1.dfm +++ b/Demos/Tutorial/Step.02/Unit1.dfm @@ -3,6 +3,8 @@ object PHPExtension1: TPHPExtension1 Version = '1.0' Functions = <> ModuleName = 'mymodule' - Height = 0 - Width = 0 + Left = 541 + Top = 282 + Height = 376 + Width = 406 end diff --git a/Demos/Tutorial/Step.02/Unit1.pas b/Demos/Tutorial/Step.02/Unit1.pas index 9f24204..ecbc59f 100644 --- a/Demos/Tutorial/Step.02/Unit1.pas +++ b/Demos/Tutorial/Step.02/Unit1.pas @@ -9,7 +9,7 @@ unit Unit1; -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } interface diff --git a/Demos/Tutorial/Step.03/Unit1.ddp b/Demos/Tutorial/Step.03/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos/Tutorial/Step.03/Unit1.dfm b/Demos/Tutorial/Step.03/Unit1.dfm index fa1174e..8e031ca 100644 --- a/Demos/Tutorial/Step.03/Unit1.dfm +++ b/Demos/Tutorial/Step.03/Unit1.dfm @@ -8,6 +8,8 @@ object PHPExtension1: TPHPExtension1 Parameters = <> end> ModuleName = 'mymodule' - Height = 0 - Width = 0 + Left = 499 + Top = 235 + Height = 443 + Width = 508 end diff --git a/Demos/Tutorial/Step.03/Unit1.pas b/Demos/Tutorial/Step.03/Unit1.pas index 209050f..01f2126 100644 --- a/Demos/Tutorial/Step.03/Unit1.pas +++ b/Demos/Tutorial/Step.03/Unit1.pas @@ -9,7 +9,7 @@ unit Unit1; -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } interface diff --git a/Demos/Tutorial/Step.04/Unit1.ddp b/Demos/Tutorial/Step.04/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos/Tutorial/Step.04/Unit1.dfm b/Demos/Tutorial/Step.04/Unit1.dfm index a93362b..e7da054 100644 --- a/Demos/Tutorial/Step.04/Unit1.dfm +++ b/Demos/Tutorial/Step.04/Unit1.dfm @@ -12,6 +12,8 @@ object PHPExtension1: TPHPExtension1 end> end> ModuleName = 'mymodule' - Height = 0 - Width = 0 + Left = 397 + Top = 234 + Height = 497 + Width = 591 end diff --git a/Demos/Tutorial/Step.04/Unit1.pas b/Demos/Tutorial/Step.04/Unit1.pas index 9f24204..ecbc59f 100644 --- a/Demos/Tutorial/Step.04/Unit1.pas +++ b/Demos/Tutorial/Step.04/Unit1.pas @@ -9,7 +9,7 @@ unit Unit1; -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } interface diff --git a/Demos/Tutorial/Step.05/Project1.dproj b/Demos/Tutorial/Step.05/Project1.dproj new file mode 100644 index 0000000..53020cd --- /dev/null +++ b/Demos/Tutorial/Step.05/Project1.dproj @@ -0,0 +1,557 @@ + + + + {5e5de191-1320-4dd5-80c8-355592ca7340} + Project1.dpr + Debug + AnyCPU + DCC32 + Project1.dll + + + 7.0 + False + False + 0 + RELEASE + + + 7.0 + DEBUG + + + Delphi.Personality + VCLApplication + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Project1.dpr + + + + + + + MainSource + + +
PHPExtension1
+
+
+ +
+ + diff --git a/Demos/Tutorial/Step.05/Unit1.ddp b/Demos/Tutorial/Step.05/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..b8bd99bb04cfa56367186605375dfd9204345c07 GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}0#=r!G E07Zcdv;Y7A literal 0 HcmV?d00001 diff --git a/Demos/Tutorial/Step.05/Unit1.dfm b/Demos/Tutorial/Step.05/Unit1.dfm index 5bb4741..b394487 100644 --- a/Demos/Tutorial/Step.05/Unit1.dfm +++ b/Demos/Tutorial/Step.05/Unit1.dfm @@ -13,6 +13,8 @@ object PHPExtension1: TPHPExtension1 OnExecute = PHPExtension1Functions0Execute end> ModuleName = 'mymodule' - Height = 0 - Width = 0 + Left = 414 + Top = 262 + Height = 359 + Width = 478 end diff --git a/Demos/Tutorial/Step.05/Unit1.pas b/Demos/Tutorial/Step.05/Unit1.pas index e7da6bc..24c784a 100644 --- a/Demos/Tutorial/Step.05/Unit1.pas +++ b/Demos/Tutorial/Step.05/Unit1.pas @@ -9,7 +9,7 @@ unit Unit1; -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } interface @@ -31,7 +31,7 @@ interface TPHPExtension1 = class(TPHPExtension) procedure PHPExtension1Functions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } public @@ -46,7 +46,7 @@ implementation {$R *.DFM} procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs b/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs index 81bec25..4a471eb 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs +++ b/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs @@ -16,9 +16,11 @@ namespace PHP4DelphiDemo /// public class Form1 : System.Windows.Forms.Form { - private System.Windows.Forms.TextBox textBox1; - private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.OpenFileDialog openFileDialog1; + private Panel panel1; + private Button btnExecuteScript; + private Button btnExecuteCode; /// /// Required designer variable. /// @@ -58,43 +60,67 @@ protected override void Dispose( bool disposing ) /// private void InitializeComponent() { - this.textBox1 = new System.Windows.Forms.TextBox(); - this.button1 = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.SuspendLayout(); - // - // textBox1 - // - this.textBox1.Location = new System.Drawing.Point(8, 16); - this.textBox1.Multiline = true; - this.textBox1.Name = "textBox1"; - this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBox1.Size = new System.Drawing.Size(272, 176); - this.textBox1.TabIndex = 0; - this.textBox1.Text = ""; - // - // button1 - // - this.button1.Location = new System.Drawing.Point(208, 200); - this.button1.Name = "button1"; - this.button1.TabIndex = 1; - this.button1.Text = "Execute"; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // openFileDialog1 - // - this.openFileDialog1.Filter = "PHP files|*.php"; - // - // Form1 - // - this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); - this.ClientSize = new System.Drawing.Size(292, 229); - this.Controls.AddRange(new System.Windows.Forms.Control[] { - this.button1, - this.textBox1}); - this.Name = "Form1"; - this.Text = "PHP"; - this.ResumeLayout(false); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.panel1 = new System.Windows.Forms.Panel(); + this.btnExecuteScript = new System.Windows.Forms.Button(); + this.btnExecuteCode = new System.Windows.Forms.Button(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox1.Location = new System.Drawing.Point(0, 0); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBox1.Size = new System.Drawing.Size(326, 197); + this.textBox1.TabIndex = 0; + // + // openFileDialog1 + // + this.openFileDialog1.Filter = "PHP files|*.php"; + // + // panel1 + // + this.panel1.Controls.Add(this.btnExecuteCode); + this.panel1.Controls.Add(this.btnExecuteScript); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Location = new System.Drawing.Point(0, 197); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(326, 49); + this.panel1.TabIndex = 2; + // + // btnExecuteScript + // + this.btnExecuteScript.Location = new System.Drawing.Point(12, 12); + this.btnExecuteScript.Name = "btnExecuteScript"; + this.btnExecuteScript.Size = new System.Drawing.Size(94, 23); + this.btnExecuteScript.TabIndex = 2; + this.btnExecuteScript.Text = "Execute Script"; + // + // btnExecuteCode + // + this.btnExecuteCode.Location = new System.Drawing.Point(112, 12); + this.btnExecuteCode.Name = "btnExecuteCode"; + this.btnExecuteCode.Size = new System.Drawing.Size(96, 23); + this.btnExecuteCode.TabIndex = 3; + this.btnExecuteCode.Text = "Execute Code"; + this.btnExecuteCode.UseVisualStyleBackColor = true; + this.btnExecuteCode.Click += new System.EventHandler(this.btnExecuteCode_Click); + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(326, 246); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.panel1); + this.Name = "Form1"; + this.Text = "PHP"; + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); } #endregion @@ -119,7 +145,7 @@ private void button1_Click(object sender, System.EventArgs e) RequestID = InitRequest(); string fn = openFileDialog1.FileName; ExecutePHP(RequestID, fn); - l = GetResultText(RequestID, builder, 0); + l = GetResultBufferSize(RequestID); builder.Capacity = l; l = GetResultText(RequestID, builder, builder.Capacity + 1); textBox1.Text = builder.ToString(); @@ -138,7 +164,6 @@ private void button1_Click(object sender, System.EventArgs e) /// [DllImport("PHP4App.dll")] public static extern int ExecutePHP(int RequestID, string FileName); - [DllImport("PHP4App.dll", SetLastError=true)] public static extern void DoneRequest(int RequestID); @@ -146,6 +171,53 @@ private void button1_Click(object sender, System.EventArgs e) [DllImport("PHP4App.dll", SetLastError=true)] public static extern int GetResultText(int RequestID, StringBuilder Buf, int BufLen); + [DllImport("PHP4App.dll")] + public static extern void RegisterVariable(int RequestID, string AName, string AValue); + + [DllImport("PHP4App.dll")] + public static extern int ExecuteCode(int RequestID, string ACode); + + [DllImport("PHP4App.dll")] + public static extern int GetVariable(int RequestID, string AName, StringBuilder Buffer, int BufLen); + + [DllImport("PHP4App.dll")] + public static extern int SaveToFile(int RequestID, string AFileName); + + [DllImport("PHP4App.dll")] + public static extern int GetVariableSize(int RequestID, string AName); + + [DllImport("PHP4App.dll")] + public static extern int GetResultBufferSize(int RequestID); + + private void btnExecuteCode_Click(object sender, EventArgs e) + { + int l = 0; + int RequestID = 0; + StringBuilder builder = new StringBuilder(); + StringBuilder varbuilder = new StringBuilder(); + + RequestID = InitRequest(); + RegisterVariable(RequestID, "x","2"); + RegisterVariable(RequestID, "y","3"); + RegisterVariable(RequestID, "z","0"); + ExecuteCode(RequestID, "$z = $x + $y; echo \"Result \"; echo $z;"); + l = GetResultBufferSize(RequestID); + if (l > 0) + { + builder.Capacity = l; + GetResultText(RequestID, builder, builder.Capacity + 1); + textBox1.Text = builder.ToString(); + } + + l = GetVariableSize(RequestID, "z"); + if (l > 0) + { + varbuilder.Capacity = l; + GetVariable(RequestID, "z", varbuilder, varbuilder.Capacity + 1); + MessageBox.Show(String.Concat("After execution z=", varbuilder.ToString())); + } + DoneRequest(RequestID); + } } } diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx b/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx index 4955b81..8dc6b17 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx +++ b/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx @@ -1,75 +1,96 @@ + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + + + + + + + + + + + + + + + + + + - + + @@ -88,18 +109,15 @@ text/microsoft-resx - 1.3 + 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - - - Form1 - + \ No newline at end of file diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj b/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj index 4e377d2..ffc86c8 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj +++ b/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj @@ -1,123 +1,112 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + Local + 8.0.50727 + 2.0 + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA} + Debug + AnyCPU + App.ico + + + PHP4DelphiDemo + + + JScript + Grid + IE50 + false + WinExe + PHP4DelphiDemo + OnBuildSuccess + + + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + + + Code + + + Form + + + Form1.cs + + + + + + + + + + \ No newline at end of file diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user b/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user index 638205b..5c913b9 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user +++ b/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user @@ -1,48 +1,58 @@ - - - - - - - - - - - - + + + 7.10.3077 + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln b/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln index 55489fd..dd398bc 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln +++ b/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln @@ -1,21 +1,19 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PHP4DelphiDemo", "PHP4DelphiDemo.csproj", "{0DA732DE-42B5-436C-8BD0-9036B7D79EAA}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection EndProject Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug.ActiveCfg = Debug|.NET - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug.Build.0 = Debug|.NET - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release.ActiveCfg = Release|.NET - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release.Build.0 = Release|.NET + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE EndGlobalSection EndGlobal diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/app.config b/Demos/php4Applications/C#/PHP4DelphiDemo/app.config index 902693c..8055384 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/app.config +++ b/Demos/php4Applications/C#/PHP4DelphiDemo/app.config @@ -1,5 +1,4 @@ - - +
diff --git a/Demos/php4Applications/C++ VS 2005/cdemo.cpp b/Demos/php4Applications/C++ VS 2005/cdemo.cpp index 496409d..3ec10e9 100644 --- a/Demos/php4Applications/C++ VS 2005/cdemo.cpp +++ b/Demos/php4Applications/C++ VS 2005/cdemo.cpp @@ -1,7 +1,6 @@ // cdemo.cpp : Defines the entry point for the console application. // -{ $Id: cdemo.cpp,v 6.2 02/2006 delphi32 Exp $ } # include "stdafx.h" # include diff --git a/Demos/php4Applications/C++ VS 6.0/cdemo.cpp b/Demos/php4Applications/C++ VS 6.0/cdemo.cpp index 496409d..3ec10e9 100644 --- a/Demos/php4Applications/C++ VS 6.0/cdemo.cpp +++ b/Demos/php4Applications/C++ VS 6.0/cdemo.cpp @@ -1,7 +1,6 @@ // cdemo.cpp : Defines the entry point for the console application. // -{ $Id: cdemo.cpp,v 6.2 02/2006 delphi32 Exp $ } # include "stdafx.h" # include diff --git a/Demos/php4Applications/Delphi/Project1.bdsproj b/Demos/php4Applications/Delphi/Project1.bdsproj new file mode 100644 index 0000000..77b2016 --- /dev/null +++ b/Demos/php4Applications/Delphi/Project1.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + Project1.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/php4Applications/Delphi/Project1.res b/Demos/php4Applications/Delphi/Project1.res index 71fa700bde6e8acf85ec0c4df62c2e0ef7b475b5..55f874204136d6cde31b105890029f4503c878e3 100644 GIT binary patch delta 20 acmaFE_J(bO851YVMhh`!AT>FFSq1<FFSq1<=Km_Rk diff --git a/Demos/php4Applications/Delphi/Unit1.ddp b/Demos/php4Applications/Delphi/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/php4Applications/Delphi/Unit1.dfm b/Demos/php4Applications/Delphi/Unit1.dfm index c15ee57..039b5cf 100644 --- a/Demos/php4Applications/Delphi/Unit1.dfm +++ b/Demos/php4Applications/Delphi/Unit1.dfm @@ -20,7 +20,7 @@ object Form1: TForm1 Width = 581 Height = 241 Lines.Strings = ( - '') + '$z = $x + $y; echo "Result "; echo $z;') TabOrder = 0 end object btnExecuteScript: TButton diff --git a/Demos/php4Applications/Delphi/Unit1.pas b/Demos/php4Applications/Delphi/Unit1.pas index 91fa036..f78d31d 100644 --- a/Demos/php4Applications/Delphi/Unit1.pas +++ b/Demos/php4Applications/Delphi/Unit1.pas @@ -1,4 +1,13 @@ -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } unit Unit1; @@ -38,13 +47,20 @@ procedure TForm1.btnExecuteScriptClick(Sender: TObject); var S : String; L : integer; + FileName : string; + FilePath : string; begin Memo1.Lines.Clear; RequestID := InitRequest; RegisterVariable(RequestID, 'x','2'); RegisterVariable(RequestID, 'y','3'); RegisterVariable(RequestID, 'z','0'); - ExecutePHP(RequestID, 'test.php'); + + FilePath := ExtractFilePath(ParamStr(0)); + FileName := IncludeTrailingBackslash(FilePath) + 'test.php'; + + ExecutePHP(RequestID, PAnsiChar(FileName)); + L := GetResultText(RequestID, nil, 0); if L > 0 then begin diff --git a/Demos/php4Applications/Delphi/result.txt b/Demos/php4Applications/Delphi/result.txt new file mode 100644 index 0000000..0f9b03d --- /dev/null +++ b/Demos/php4Applications/Delphi/result.txt @@ -0,0 +1 @@ +Result 5 \ No newline at end of file diff --git a/Demos/psvPHP/Components/ComponentsDemo.bdsproj b/Demos/psvPHP/Components/ComponentsDemo.bdsproj new file mode 100644 index 0000000..340b845 --- /dev/null +++ b/Demos/psvPHP/Components/ComponentsDemo.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + ComponentsDemo.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/psvPHP/Components/ComponentsDemo.dpr b/Demos/psvPHP/Components/ComponentsDemo.dpr index 1f6fbff..8291061 100644 --- a/Demos/psvPHP/Components/ComponentsDemo.dpr +++ b/Demos/psvPHP/Components/ComponentsDemo.dpr @@ -8,6 +8,7 @@ uses begin Application.Initialize; + Application.Title := 'Components Demo'; Application.CreateForm(TfrmTest, frmTest); Application.Run; end. diff --git a/Demos/psvPHP/Components/ComponentsDemo.res b/Demos/psvPHP/Components/ComponentsDemo.res index 55f874204136d6cde31b105890029f4503c878e3..c791b86b17d95defb4193c5c4f343c6fc35628c0 100644 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 876 zcmaJ=Jxc>Y5Pj=~TWm~%7FH&uWyHcFg^CccPz(RS*=&<05J-d+UUf~tKNE-t+g#=E zNNH(l5wgCWy~_uF40${AX5Q>hmRkU56V3%N+_8_nsvc3Jq}FKc*DBE|gEnzRD3odT z{B9}0AJQ~9t_+D3MNzQehw#n?$2H95lfjzJMiq+xpGS}RU|YW7TGAUn=>TJR9vbuv zQKv^fLP$_BH=di&s%NpygeRq7WOL!AU~H`oJdv~Xnj7J9-%dk4aAV5-jBGG4rXS8T z#&1Awg!ePy@tV(f_@tlj=qJ`@+x_IZ=P3K1ZEocskt@zKp3bKiEbG`L>hS!nd7PP< z*YiLohG%h>ba`1aP@aA!Bu=2+E0lZZSF-?KK7q>;Epm@~@dtdZ0(&$OeF0BP;A;i7bZNA5i@Ni6 j1fWAWcYr%w;}-YC4Ibz#+kO}RH7K;(HF*{O6)AiJ<8sA5 diff --git a/Demos/psvPHP/Components/Unit1.ddp b/Demos/psvPHP/Components/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Components/Unit1.dfm b/Demos/psvPHP/Components/Unit1.dfm index 22c2e25..a400fcf 100644 --- a/Demos/psvPHP/Components/Unit1.dfm +++ b/Demos/psvPHP/Components/Unit1.dfm @@ -14,6 +14,7 @@ object frmTest: TfrmTest OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate + OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel @@ -45,19 +46,15 @@ object frmTest: TfrmTest TabOrder = 1 OnClick = btnExecuteClick end - object btnClose: TButton - Left = 384 - Top = 42 - Width = 75 - Height = 25 - Caption = '&Close' - TabOrder = 2 - OnClick = btnCloseClick - end object PHP: TpsvPHP - Constants = <> Variables = <> Left = 400 Top = 136 end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 408 + Top = 88 + end end diff --git a/Demos/psvPHP/Components/Unit1.pas b/Demos/psvPHP/Components/Unit1.pas index 35c4755..c1bc8f2 100644 --- a/Demos/psvPHP/Components/Unit1.pas +++ b/Demos/psvPHP/Components/Unit1.pas @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } //This demo project shows how to access published property //of Delphi components from PHP script @@ -20,22 +20,33 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, php4delphi; + StdCtrls, php4delphi, PHPCommon; type + + TMyButton = class(TButton) + private + function GetFontSize: integer; + procedure SetFontSize(const Value: integer); + published + property FontSize : integer read GetFontSize write SetFontSize; + end; + TfrmTest = class(TForm) memScript: TMemo; btnExecute: TButton; - btnClose: TButton; PHP: TpsvPHP; Label1: TLabel; + PHPEngine: TPHPEngine; procedure btnExecuteClick(Sender: TObject); procedure btnCloseClick(Sender: TObject); procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } + btnClose : TMyButton; end; var @@ -44,6 +55,7 @@ TfrmTest = class(TForm) implementation {$R *.DFM} +{$R WindowsXP.res} procedure TfrmTest.btnExecuteClick(Sender: TObject); begin @@ -57,6 +69,20 @@ procedure TfrmTest.btnCloseClick(Sender: TObject); procedure TfrmTest.FormCreate(Sender: TObject); begin + btnClose := TMyButton.Create(Self); + with btnClose do + begin + Name := 'btnClose'; + Parent := Self; + Left := 384; + Top := 42; + Width := 75; + Height := 25; + Caption := '&Close'; + TabOrder := 2; + OnClick := btnCloseClick; + end; + memScript.Lines.Clear; with memScript.Lines do begin @@ -77,14 +103,32 @@ procedure TfrmTest.FormCreate(Sender: TObject); Add('$btnClose->Caption = "&Exit";'); Add('$frmTest->Caption = "PHP4Delphi demo";'); Add('$btnClose->Top = 150;'); - Add('$Font = $btnClose->Font;'); - Add('$Font->Size = 10;'); + Add('$btnClose->FontSize = 10;'); Add('$btnClose->Cursor = -21;'); Add('$frmTest->Color = clGreen;'); Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); Add('delphi_show_message($st);'); {$ENDIF} end; + PHPEngine.StartupEngine; +end; + +procedure TfrmTest.FormDestroy(Sender: TObject); +begin + btnClose.Free; + PHPEngine.ShutdownEngine; +end; + +{ TMyButton } + +function TMyButton.GetFontSize: integer; +begin + Result := Font.Size; +end; + +procedure TMyButton.SetFontSize(const Value: integer); +begin + Font.Size := Value; end; end. diff --git a/Demos/psvPHP/Components/WindowsXP.res b/Demos/psvPHP/Components/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ + Left = 24 + Top = 20 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 24 + Top = 72 + end +end diff --git a/Demos/psvPHP/Custom Library/DemoMain.pas b/Demos/psvPHP/Custom Library/DemoMain.pas new file mode 100644 index 0000000..018bb49 --- /dev/null +++ b/Demos/psvPHP/Custom Library/DemoMain.pas @@ -0,0 +1,49 @@ +unit DemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + phpShellLibrary, StdCtrls, php4delphi, PHPCommon; + +type + TForm1 = class(TForm) + psvPHP: TpsvPHP; + PHPEngine: TPHPEngine; + Button1: TButton; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + Lib : TphpShellLibrary; + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TForm1.FormCreate(Sender: TObject); +begin + Lib := TphpShellLibrary.Create(Self); + PHPEngine.StartupEngine; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + Lib.Free; + PHPEngine.ShutdownEngine; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + psvPHP.RunCode('shellexecute(0, "open", "calc.exe", "", "", 0);'); +end; + +end. diff --git a/Demos/psvPHP/Custom Library/ExtDemo.bdsproj b/Demos/psvPHP/Custom Library/ExtDemo.bdsproj new file mode 100644 index 0000000..6626e63 --- /dev/null +++ b/Demos/psvPHP/Custom Library/ExtDemo.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + ExtDemo.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/psvPHP/Custom Library/ExtDemo.dpr b/Demos/psvPHP/Custom Library/ExtDemo.dpr new file mode 100644 index 0000000..e2d6586 --- /dev/null +++ b/Demos/psvPHP/Custom Library/ExtDemo.dpr @@ -0,0 +1,13 @@ +program ExtDemo; + +uses + Forms, + DemoMain in 'DemoMain.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/Custom Library/ExtDemo.res b/Demos/psvPHP/Custom Library/ExtDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Custom Library/WindowsXP.res b/Demos/psvPHP/Custom Library/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 876 zcmZuw!D`e{6g`;)45ZX42(7CQp|tKaWGUE6i{ireABr?v86*8G_oYa(EsH5tABp6QY{lccv56Ijv3zT^ z19e@C-2COG;9(9a-zxRU+>^PUYH1+j}xxlrXAFT7wca-=1dawoNZ1^kc zxi#EAaOu; Variables = < item Name = 'key' @@ -210,7 +211,6 @@ object frmMain: TfrmMain Top = 116 end object PHPLibrary1: TPHPLibrary - Executor = psvPHP LibraryName = 'ErrorsLib' Functions = < item @@ -226,4 +226,10 @@ object frmMain: TfrmMain Left = 360 Top = 168 end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 424 + Top = 124 + end end diff --git a/Demos/psvPHP/Encryption/uMain.pas b/Demos/psvPHP/Encryption/uMain.pas index 572cc90..a5a8c9f 100644 --- a/Demos/psvPHP/Encryption/uMain.pas +++ b/Demos/psvPHP/Encryption/uMain.pas @@ -1,11 +1,15 @@ +{$I PHP.INC} + unit uMain; interface uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Windows, Messages, SysUtils, + {$IFDEF VERSION6}Variants, {$ENDIF} + Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, php4delphi, PHPCustomLibrary, phpLibrary, phpFunctions, - ZendTypes; + ZendTypes, PHPCommon; type TfrmMain = class(TForm) @@ -32,12 +36,15 @@ TfrmMain = class(TForm) Errors: TMemo; Label1: TLabel; PHPLibrary1: TPHPLibrary; + PHPEngine: TPHPEngine; procedure btnEncryptClick(Sender: TObject); procedure btnDecryptClick(Sender: TObject); procedure btnCloseClick(Sender: TObject); procedure PHPLibrary1Functions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); private { Private declarations } public @@ -51,6 +58,7 @@ TfrmMain = class(TForm) implementation {$R *.dfm} +{$R WindowsXP.res} { TfrmMain } @@ -116,10 +124,20 @@ procedure TfrmMain.btnCloseClick(Sender: TObject); end; procedure TfrmMain.PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin Errors.Lines.Add(Parameters[0].Value); end; +procedure TfrmMain.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownEngine; +end; + end. diff --git a/Demos/psvPHP/Graph/Unit1.ddp b/Demos/psvPHP/Graph/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Graph/Unit1.dfm b/Demos/psvPHP/Graph/Unit1.dfm index 41bc05c..63c5246 100644 --- a/Demos/psvPHP/Graph/Unit1.dfm +++ b/Demos/psvPHP/Graph/Unit1.dfm @@ -13,32 +13,54 @@ object Form1: TForm1 Font.Style = [] OldCreateOrder = False Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object PaintBox: TPaintBox - Left = 0 - Top = 0 + Left = 4 + Top = 9 Width = 512 Height = 512 + OnPaint = PaintBoxPaint end object btnExecute: TButton Left = 524 Top = 4 - Width = 75 + Width = 97 Height = 25 Caption = '&Execute' TabOrder = 0 OnClick = btnExecuteClick end - object cbKeepSession: TCheckBox + object Button1: TButton Left = 524 - Top = 44 + Top = 32 Width = 97 - Height = 17 - Caption = 'Keep Session' + Height = 25 + Caption = 'Use Library' TabOrder = 1 + OnClick = Button1Click end object psvPHP: TpsvPHP + Variables = < + item + Name = 'X' + Value = '0' + end + item + Name = 'Y' + Value = '0' + end + item + Name = 'T' + Value = '0' + end> + Left = 236 + Top = 36 + end + object PHPEngine: TPHPEngine + HandleErrors = False Constants = < item Name = 'MinT' @@ -52,21 +74,47 @@ object Form1: TForm1 Name = 'Steps' Value = '2000' end> - Variables = < + ReportDLLError = False + Left = 172 + Top = 212 + end + object PHPLibrary: TPHPLibrary + Functions = < item - Name = 'X' - Value = '0' + FunctionName = 'gr_prepare' + Tag = 0 + Parameters = <> + OnExecute = PHPLibrary1Functions0Execute end item - Name = 'Y' - Value = '0' + FunctionName = 'gr_paint' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end + item + Name = 'Y' + ParamType = tpFloat + end> + OnExecute = PHPLibraryFunctions1Execute end item - Name = 'T' - Value = '0' + FunctionName = 'gr_move' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end + item + Name = 'Y' + ParamType = tpFloat + end> + OnExecute = PHPLibraryFunctions2Execute end> - UseDelimiters = False - Left = 236 - Top = 36 + Left = 288 + Top = 196 end end diff --git a/Demos/psvPHP/Graph/Unit1.pas b/Demos/psvPHP/Graph/Unit1.pas index 68f590e..e876537 100644 --- a/Demos/psvPHP/Graph/Unit1.pas +++ b/Demos/psvPHP/Graph/Unit1.pas @@ -7,7 +7,9 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +{$I PHP.INC} unit Unit1; @@ -15,19 +17,38 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, php4delphi, StdCtrls; + ExtCtrls, php4delphi, StdCtrls, PHPCommon, PHPCustomLibrary, phpLibrary, + PHPFunctions, ZendTypes, PHPTypes, ZendAPI, PHPAPI; type TForm1 = class(TForm) PaintBox: TPaintBox; psvPHP: TpsvPHP; btnExecute: TButton; - cbKeepSession: TCheckBox; + PHPEngine: TPHPEngine; + PHPLibrary: TPHPLibrary; + Button1: TButton; procedure btnExecuteClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure PaintBoxPaint(Sender: TObject); + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPLibraryFunctions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure Button1Click(Sender: TObject); + procedure PHPLibraryFunctions2Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } + Busy : boolean; + procedure PaintBoxImage; public { Public declarations } + B : TBitmap; end; var @@ -36,48 +57,153 @@ TForm1 = class(TForm) implementation {$R *.DFM} +{$R WindowsXP.res} procedure TForm1.btnExecuteClick(Sender: TObject); var Script : TStringList; - Canvas: TCanvas; Steps, X, Y: integer; MinT, MaxT, DeltaT, T: double; begin - psvPHP.KeepSession := cbKeepSession.Checked; - Canvas := PaintBox.Canvas; - Canvas.Brush.Color := clWhite; - Canvas.FillRect(PaintBox.ClientRect); - Canvas.Pen.Color := clSilver; - Canvas.MoveTo(0, 256); Canvas.LineTo(512, 256); - Canvas.MoveTo(256, 0); Canvas.LineTo(256, 512); - Canvas.Pen.Color := clBlack; + psvPHP.UseDelimiters := true; + B.Canvas.Brush.Color := clWhite; + B.Canvas.FillRect(B.Canvas.ClipRect); + B.Canvas.Pen.Color := clSilver; + B.Canvas.MoveTo(0, 256); + B.Canvas.LineTo(512, 256); + B.Canvas.MoveTo(256, 0); + B.Canvas.LineTo(256, 512); + B.Canvas.Pen.Color := clBlack; + Script := TStringList.Create; Script.Add('$R1 = 90.0;'); Script.Add('$R2 = 26.0;'); Script.Add('$O = 70.0;'); Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); - MinT := StrToFloat(psvPHP.Constants.Items[0].Value); - MaxT := StrToFloat(psvPHP.Constants.Items[1].Value); - Steps := StrToInt(psvPHP.Constants.Items[2].Value); + + MinT := StrToFloat(PHPEngine.Constants.Items[0].Value); + MaxT := StrToFloat(PHPEngine.Constants.Items[1].Value); + Steps := StrToInt(PHPEngine.Constants.Items[2].Value); DeltaT := (MaxT - MinT) / Steps; T := MinT; + psvPHP.VariableByName('T').AsFloat := T; psvPHP.RunCode(Script); X := psvPHP.VariableByName('X').AsInteger; Y := psvPHP.VariableByName('Y').AsInteger; - Canvas.MoveTo(X, Y); + B.Canvas.MoveTo(X, Y); + repeat T := T + DeltaT; psvPHP.VariableByName('T').AsFloat := T; psvPHP.RunCode(Script); X := psvPHP.VariableByName('X').AsInteger; Y := psvPHP.VariableByName('Y').AsInteger; - Canvas.LineTo(X, Y); + B.Canvas.LineTo(X, Y); + PaintBoxImage; Application.ProcessMessages; until T >= MaxT; Script.Free; end; +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; + B := TBitmap.Create; + B.Width := Paintbox.Width; + B.Height := PaintBox.Height; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownEngine; + B.Free; + B := nil; +end; + +procedure TForm1.PaintBoxImage; +begin + if Busy then + Exit; + Busy := true; + try + bitBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.Width, PaintBox.Height, + B.Canvas.Handle, 0, 0, SRCCOPY); + finally + Busy := false; + end; +end; + +procedure TForm1.PaintBoxPaint(Sender: TObject); +begin + PaintBoxImage; +end; + +procedure TForm1.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + B.Canvas.Brush.Color := clWhite; + B.Canvas.FillRect(B.Canvas.ClipRect); + B.Canvas.Pen.Color := clSilver; + B.Canvas.MoveTo(0, 256); + B.Canvas.LineTo(512, 256); + B.Canvas.MoveTo(256, 0); + B.Canvas.LineTo(256, 512); + B.Canvas.Pen.Color := clBlack; +end; + +procedure TForm1.PHPLibraryFunctions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + X, Y : integer; +begin + X := Parameters.ParamByName('X').ZendVariable.AsInteger; + Y := Parameters.ParamByName('Y').ZendVariable.AsInteger; + B.Canvas.LineTo(X, Y); + PaintBoxImage; + Application.ProcessMessages; +end; + +procedure TForm1.Button1Click(Sender: TObject); +var + Script : TStringList; +begin + Script := TStringList.Create; + try + Script.Add('gr_prepare();'); + Script.Add('$R1 = 90.0;'); + Script.Add('$R2 = 26.0;'); + Script.Add('$O = 70.0;'); + Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$DeltaT = (MaxT - MinT) / Steps;'); + Script.Add('$T = MinT;'); + Script.Add('gr_move($X, $Y);'); + Script.Add('gr_paint($X, $Y);'); + Script.Add('do {'); + Script.Add('$T = $T + $DeltaT;'); + Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('gr_paint($X, $Y);'); + Script.Add('} while ($T <= MaxT);'); + psvPHP.RunCode(Script); + finally + Script.Free; + end; +end; + +procedure TForm1.PHPLibraryFunctions2Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + X, Y : integer; +begin + X := Parameters.ParamByName('X').ZendVariable.AsInteger; + Y := Parameters.ParamByName('Y').ZendVariable.AsInteger; + B.Canvas.MoveTo(X, Y); +end; + end. diff --git a/Demos/psvPHP/Graph/WindowsXP.res b/Demos/psvPHP/Graph/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/ISAPI Module/dmEngine.dfm b/Demos/psvPHP/ISAPI Module/dmEngine.dfm new file mode 100644 index 0000000..cd57b69 --- /dev/null +++ b/Demos/psvPHP/ISAPI Module/dmEngine.dfm @@ -0,0 +1,30 @@ +object EngineModule: TEngineModule + OldCreateOrder = False + OnCreate = DataModuleCreate + OnDestroy = DataModuleDestroy + Left = 562 + Top = 381 + Height = 150 + Width = 215 + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 72 + Top = 24 + end + object PHPLibrary: TPHPLibrary + Functions = < + item + FunctionName = 'nb_test' + Tag = 0 + Parameters = < + item + Name = 'nb_pointer' + ParamType = tpString + end> + OnExecute = PHPLibraryFunctions0Execute + end> + Left = 120 + Top = 32 + end +end diff --git a/Demos/psvPHP/ISAPI Module/dmEngine.pas b/Demos/psvPHP/ISAPI Module/dmEngine.pas new file mode 100644 index 0000000..2ece809 --- /dev/null +++ b/Demos/psvPHP/ISAPI Module/dmEngine.pas @@ -0,0 +1,56 @@ +unit dmEngine; + +interface + +uses + SysUtils, Classes, PHPCommon, php4delphi, PHPCustomLibrary, phpLibrary, + PHPFunctions; + +type + TEngineModule = class(TDataModule) + PHPEngine: TPHPEngine; + PHPLibrary: TPHPLibrary; + procedure DataModuleCreate(Sender: TObject); + procedure DataModuleDestroy(Sender: TObject); + procedure PHPLibraryFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + EngineModule: TEngineModule; + +implementation + +uses dmMain; + +{$R *.dfm} + +procedure TEngineModule.DataModuleCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TEngineModule.DataModuleDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +procedure TEngineModule.PHPLibraryFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); +var + DM : TMainModule; +begin + DM := TMainModule(Parameters.ParamByName('nb_pointer').ZendVariable.AsInteger); + if DM <> nil then + ZendVar.AsString := DM.EventString + else + ZendVar.AsString := 'Result is not defined'; +end; + +end. diff --git a/Demos/psvPHP/ISAPI Module/dmMain.ddp b/Demos/psvPHP/ISAPI Module/dmMain.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/ISAPI Module/dmMain.dfm b/Demos/psvPHP/ISAPI Module/dmMain.dfm new file mode 100644 index 0000000..e77350a --- /dev/null +++ b/Demos/psvPHP/ISAPI Module/dmMain.dfm @@ -0,0 +1,23 @@ +object MainModule: TMainModule + OldCreateOrder = False + OnCreate = WebModuleCreate + Actions = < + item + Default = True + Name = 'WebActionItem1' + PathInfo = '/' + OnAction = MainModuleWebActionItem1Action + end> + Left = 513 + Top = 319 + Height = 254 + Width = 333 + object psvPHP: TpsvPHP + Variables = < + item + Name = 'nb' + end> + Left = 64 + Top = 56 + end +end diff --git a/Demos/psvPHP/ISAPI Module/dmMain.pas b/Demos/psvPHP/ISAPI Module/dmMain.pas new file mode 100644 index 0000000..f702c6d --- /dev/null +++ b/Demos/psvPHP/ISAPI Module/dmMain.pas @@ -0,0 +1,51 @@ +unit dmMain; + +interface + +uses + SysUtils, Classes, HTTPApp, PHPCommon, php4delphi; + +type + TMainModule = class(TWebModule) + psvPHP: TpsvPHP; + procedure WebModuleCreate(Sender: TObject); + procedure MainModuleWebActionItem1Action(Sender: TObject; + Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); + private + { Private declarations } + FEvent : TDateTime; + public + { Public declarations } + function EventString : string; + end; + +var + MainModule: TMainModule; + +implementation + +{$R *.dfm} + +{ TMainModule } + +function TMainModule.EventString: string; +begin + Result := DateTimeToStr(FEvent); +end; + +procedure TMainModule.WebModuleCreate(Sender: TObject); +begin + FEvent := Now; +end; + +procedure TMainModule.MainModuleWebActionItem1Action(Sender: TObject; + Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); +var + S : string; +begin + psvPHP.VariableByName('nb').AsInteger := integer(Self); + S := psvPHP.RunCode(''); + Response.Content := S; +end; + +end. diff --git a/Demos/psvPHP/ISAPI Module/phpisapitest.bdsproj b/Demos/psvPHP/ISAPI Module/phpisapitest.bdsproj new file mode 100644 index 0000000..587b308 --- /dev/null +++ b/Demos/psvPHP/ISAPI Module/phpisapitest.bdsproj @@ -0,0 +1,177 @@ + + + + + + + + + + + + phpISAPITest.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + vcl;rtl;vclx;dbrtl;vcldb;adortl;dbxcds;dbexpress;vclib;ibxpress;xmlrtl;vclactnband;inet;IntrawebDB_80_100;Intraweb_80_100;vclie;inetdbbde;inetdbxpress;IndyCore;IndySystem;dclOfficeXP;VclSmp;soaprtl;dsnap;IndyProtocols;bdertl;teeui;teedb;tee;vcldbx;dsnapcon;websnap;webdsnap;B304_r100;OERT100;cxLibraryD10;dxBarD10;dxComnD10;dxBarDBNavD10;dxBarExtDBItemsD10;dxBarExtItemsD10;dxDockingD10;dxsbD10;cxEditorsD10;dxThemeD10;cxDataD10;cxExtEditorsD10;cxVerticalGridD10;dxNavBarD10;dxPSCoreD10;dxPSTeeChartD10;dxPsPrVwAdvD10;dxPSLnksD10;vclshlctrls;dxPSDBTeeChartD10;dxPScxCommonD10;dxPScxExtCommonD10;dxPScxVGridLnkD10;SimpleObjectsR10;TortoisePlugIn100;DBLibR10;PSCControlsR10;FCLRD10;FCLR10;ZLibExR10;gtFiltersBDS2006;gtCompressionBDS2006;gtRtlBDS2006;gtCryptBDS2006;gtFontBDS2006;FreeImageR100;PSCSystemR100;PSCControlsDBR10 + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + diff --git a/Demos/psvPHP/ISAPI Module/phpisapitest.dpr b/Demos/psvPHP/ISAPI Module/phpisapitest.dpr new file mode 100644 index 0000000..bddf2a7 --- /dev/null +++ b/Demos/psvPHP/ISAPI Module/phpisapitest.dpr @@ -0,0 +1,54 @@ +library phpisapitest; + +uses + Windows, + ActiveX, + ComObj, + WebBroker, + ISAPIApp, + ISAPIThreadPool, + ZendTypes, + PHPTypes, + ZendAPI, + PHPAPI, + php4Delphi, + dmMain in 'dmMain.pas' {MainModule: TWebModule}, + dmEngine in 'dmEngine.pas' {EngineModule: TDataModule}; + +{$R *.res} + +exports + GetExtensionVersion, + HttpExtensionProc, + TerminateExtension; + +var + OrgDLLProc : TDLLProc; + EngineModule : TEngineModule; + +procedure HandlerExitProc(reason : integer); +begin + case Reason of + DLL_THREAD_DETACH: + begin + ts_free_thread; + end; + DLL_PROCESS_DETACH: + begin + EngineModule.Free; + end; + end; + + if Assigned(OrgDLLProc) then + OrgDLLProc(reason); +end; + +begin + CoInitFlags := COINIT_MULTITHREADED; + EngineModule := TEngineModule.Create(nil); + Application.Initialize; + OrgDLLProc := DLLProc; + DLLProc := HandlerExitProc; + Application.CreateForm(TMainModule, MainModule); + Application.Run; +end. diff --git a/Demos/psvPHP/ISAPI Module/phpisapitest.res b/Demos/psvPHP/ISAPI Module/phpisapitest.res new file mode 100644 index 0000000000000000000000000000000000000000..28e53612c3faeb93e0d6d9663c9a76f621e30286 GIT binary patch literal 4396 zcmbW5y^ice5QS^CNQeYBAfFAiE(S{o$&3%L$5+F6_ ztLm~nvz}%5S}Ik$ySmP)pYE~7%ek+?BU%R{e>Weh`PJ?^N50V=n zX`nry`}9L^kB^TwmExLl%I_aOSl{)AP3VWscsrl#tNuSeU?g^G=90%WPQG5nYbw1> z;;0z_S%yeee;W-|6Mu2+D*J8h)9~Q75&N@ZSKP!8hf!MoE+70OV3Xq|&l)EO z*Lrt5{K=2!-}jLJhlK|*dX1EWNw#os9;cV_lT&& z}Zn$UI;=sGs5}#P{jdmV$iyfbu>xYQj zZRVJR1Mk$|u}5Ja;3+*wAJ`Z1TiM1AzJ#?x&BM>9zy1ggb8zr8TjWP#1NiE(r@CPB z4p+w?WrOV?-Gz`Jk6->g-VqKO&%#EuKXYGCs@ME%$pKDa1~z^hzU=6GFzJIBljFwo zAl+%-5FCgR46lFU&W(fmlQqw2tp*1l>wGXz4xIzo$RX+(Pqy zZLHjDA2^)h1zY~2rY-*D(5>;4bCX}23R8kd7O%a_-@#h*3uI+17DfZp*=E25?k9Y9d@A>Y;PXd<^^`E$L zp5qRP_`Ns4As<7l(TI)mUx>AF&^Yl!@5k@?moLX0sBMTTe%A8N@f>L_`d(Vt89%)r z_0eANC19qo&Y1IemitzR=sWH&IEF9$5x>`8W8(EZ4e~EL*4^hESiY{kc{j3_=Yg@m zmwo)`Y2t3R!@uHBeD~e(13T8I()w3^Bmd&2xx_;Ajet(U=VcDO24lP5h@s&}{`Icf znsG)mH*waM`oOJ|o%VWtq`e=9b|%Fkf7{t}iSO^a>-@JPF%Ikf=l!R5a)Q8*`wL&h zMeNQ^v6I7$HSdM^hFbHmi?3dYdyV)Nk8toGF-HFoAKyTnbD!5c_tesx;)M+y zXWq|rN8Ay6o?Xrv*b9deV{);5Sm#{5#$oCC0~m1G>T_&zyxy~nR}NrZKFlF|XCXOJ zBW(Ph=@M_%@w?Y>)DQU`nL7L3eOwaIJM&25UDc=fEulAvk-Tvy@(xGuCCzWY<-Gna z2RqQq)WU%tqu1UdvUN=LB;OART>N|3b>sx!Z+Vi#YyI$o7kn2UPwh;?;eFW2FFBw+ zwm0O#?dFyX#Z7I}Px^hY&i!ce@hX?6Ctt@d_q`YIntl3vtG?#va=sqTswV%H{3H1! z`6xLyd6Y)p`#kDz2jpmWi+nWuQog?t#z9z}Fl#;D)^E-1dr7Td+b{N`{cOKVezM=B X^V$Bd!M_>$KjZ%1|JC4MkQ@6CnmZz1 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Library demo/LibraryDemo.dpr b/Demos/psvPHP/Library demo/LibraryDemo.dpr new file mode 100644 index 0000000..8afed48 --- /dev/null +++ b/Demos/psvPHP/Library demo/LibraryDemo.dpr @@ -0,0 +1,18 @@ +program LibraryDemo; + +uses + Forms, + Unit1 in 'Unit1.pas' {frmLibDemo}, + dm_Main in 'dm_Main.pas' {dmMain: TDataModule}, + frm_dialog in 'frm_dialog.pas' {Form2}; + +{$R *.RES} + +begin + Application.Initialize; + Application.Title := 'Library Demo'; + Application.CreateForm(TfrmLibDemo, frmLibDemo); + Application.CreateForm(TdmMain, dmMain); + Application.CreateForm(TForm2, Form2); + Application.Run; +end. diff --git a/Demos/psvPHP/Library demo/LibraryDemo.res b/Demos/psvPHP/Library demo/LibraryDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Library demo/Unit1.ddp b/Demos/psvPHP/Library demo/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Library demo/Unit1.dfm b/Demos/psvPHP/Library demo/Unit1.dfm index da1ac3f..a5584d7 100644 --- a/Demos/psvPHP/Library demo/Unit1.dfm +++ b/Demos/psvPHP/Library demo/Unit1.dfm @@ -1,7 +1,8 @@ -object Form1: TForm1 +object frmLibDemo: TfrmLibDemo Left = 395 Top = 303 - Caption = 'Form1' + BorderStyle = bsDialog + Caption = 'PHP Demo' ClientHeight = 209 ClientWidth = 377 Color = clBtnFace @@ -11,6 +12,7 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False + Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 object Memo1: TMemo @@ -20,7 +22,8 @@ object Form1: TForm1 Height = 189 Lines.Strings = ( 'formcaption("Hello from PHP");' - 'buttonclick();') + 'buttonclick();' + 'my_createcontrol();') TabOrder = 0 end object Button1: TButton @@ -32,23 +35,21 @@ object Form1: TForm1 TabOrder = 1 OnClick = Button1Click end - object Button2: TButton + object btnExecute: TButton Left = 292 Top = 12 Width = 75 Height = 25 Caption = 'Execute' TabOrder = 2 - OnClick = Button2Click + OnClick = btnExecuteClick end object psvPHP1: TpsvPHP - Constants = <> Variables = <> Left = 32 Top = 28 end object PHPLibrary1: TPHPLibrary - Executor = psvPHP1 LibraryName = 'SimpleLib' Functions = < item @@ -67,7 +68,13 @@ object Form1: TForm1 Parameters = <> OnExecute = PHPLibrary1Functions1Execute end> - Left = 68 - Top = 28 + Left = 88 + Top = 108 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 212 + Top = 64 end end diff --git a/Demos/psvPHP/Library demo/Unit1.pas b/Demos/psvPHP/Library demo/Unit1.pas index 0ebde95..681bb08 100644 --- a/Demos/psvPHP/Library demo/Unit1.pas +++ b/Demos/psvPHP/Library demo/Unit1.pas @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } unit Unit1; @@ -19,20 +19,21 @@ interface PHPFunctions, ZendTypes, phpTypes, PHPCommon; type - TForm1 = class(TForm) + TfrmLibDemo = class(TForm) psvPHP1: TpsvPHP; PHPLibrary1: TPHPLibrary; Memo1: TMemo; Button1: TButton; - Button2: TButton; + btnExecute: TButton; + PHPEngine: TPHPEngine; procedure Button1Click(Sender: TObject); - procedure Button2Click(Sender: TObject); + procedure btnExecuteClick(Sender: TObject); procedure PHPLibrary1Functions0Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); procedure PHPLibrary1Functions1Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + ZendVar : TZendVariable; TSRMLS_DC: Pointer); private { Private declarations } public @@ -40,31 +41,34 @@ TForm1 = class(TForm) end; var - Form1: TForm1; + frmLibDemo: TfrmLibDemo; implementation {$R *.DFM} +{$R WindowsXP.res} -procedure TForm1.Button1Click(Sender: TObject); +procedure TfrmLibDemo.Button1Click(Sender: TObject); begin ShowMessage('Click'); end; -procedure TForm1.Button2Click(Sender: TObject); +procedure TfrmLibDemo.btnExecuteClick(Sender: TObject); begin - psvPhp1.RunCode(memo1.Lines.text); + PHPEngine.StartupEngine; + psvPhp1.RunCode(memo1.Lines.text); + PHPEngine.ShutdownAndWaitFor; end; -procedure TForm1.PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; +procedure TfrmLibDemo.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin - Form1.Caption := Parameters[0].Value; + frmLibDemo.Caption := Parameters[0].Value; end; -procedure TForm1.PHPLibrary1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; +procedure TfrmLibDemo.PHPLibrary1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; TSRMLS_DC: Pointer); begin Button1.Click; diff --git a/Demos/psvPHP/Library demo/WindowsXP.res b/Demos/psvPHP/Library demo/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ + OnExecute = PHPLibrary1Functions0Execute + end> + Left = 44 + Top = 44 + end +end diff --git a/Demos/psvPHP/Library demo/dm_Main.dti b/Demos/psvPHP/Library demo/dm_Main.dti new file mode 100644 index 0000000..862f513 --- /dev/null +++ b/Demos/psvPHP/Library demo/dm_Main.dti @@ -0,0 +1,41 @@ +[Designer] +Version=1 +Left=332 +Top=246 +Width=730 +Height=508 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=dmMain\PHPLibrary1\PHPLibrary1.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/psvPHP/Library demo/dm_Main.pas b/Demos/psvPHP/Library demo/dm_Main.pas new file mode 100644 index 0000000..59bc840 --- /dev/null +++ b/Demos/psvPHP/Library demo/dm_Main.pas @@ -0,0 +1,39 @@ +unit dm_Main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + PHPCommon, PHPCustomLibrary, phpLibrary, PHPFunctions, ZendTypes; + +type + TdmMain = class(TDataModule) + PHPLibrary1: TPHPLibrary; + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ThisPtr: pzval; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + dmMain: TdmMain; + +implementation + +uses frm_dialog; + +{$R *.DFM} + +procedure TdmMain.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: pzval; + TSRMLS_DC: Pointer); +begin + Form2 := TForm2.Create(Application); + Form2.ShowModal; + Form2.Free; +end; + +end. diff --git a/Demos/psvPHP/Library demo/frm_dialog.dfm b/Demos/psvPHP/Library demo/frm_dialog.dfm new file mode 100644 index 0000000..a9a3ded --- /dev/null +++ b/Demos/psvPHP/Library demo/frm_dialog.dfm @@ -0,0 +1,34 @@ +object Form2: TForm2 + Left = 434 + Top = 330 + BorderStyle = bsDialog + Caption = 'Dialog' + ClientHeight = 231 + ClientWidth = 396 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 16 + Top = 52 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 0 + OnClick = Button1Click + end + object Edit1: TEdit + Left = 16 + Top = 20 + Width = 121 + Height = 21 + TabOrder = 1 + end +end diff --git a/Demos/psvPHP/Library demo/frm_dialog.pas b/Demos/psvPHP/Library demo/frm_dialog.pas new file mode 100644 index 0000000..266a6e9 --- /dev/null +++ b/Demos/psvPHP/Library demo/frm_dialog.pas @@ -0,0 +1,32 @@ +unit frm_dialog; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TForm2 = class(TForm) + Button1: TButton; + Edit1: TEdit; + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form2: TForm2; + +implementation + +{$R *.DFM} + +procedure TForm2.Button1Click(Sender: TObject); +begin + Close; +end; + +end. diff --git a/Demos/psvPHP/Logo/LogoDemo.res b/Demos/psvPHP/Logo/LogoDemo.res index 71fa700bde6e8acf85ec0c4df62c2e0ef7b475b5..c791b86b17d95defb4193c5c4f343c6fc35628c0 100644 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 876 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 F{{hk8NK^m- literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Logo/uMain.pas b/Demos/psvPHP/Logo/uMain.pas index fa2ede2..673a627 100644 --- a/Demos/psvPHP/Logo/uMain.pas +++ b/Demos/psvPHP/Logo/uMain.pas @@ -26,6 +26,7 @@ implementation logos; {$R *.DFM} +{$R WindowsXP.res} procedure TForm1.Button1Click(Sender: TObject); var diff --git a/Demos/psvPHP/Multithread simple/MultithreadSample.dpr b/Demos/psvPHP/Multithread simple/MultithreadSample.dpr new file mode 100644 index 0000000..2a38013 --- /dev/null +++ b/Demos/psvPHP/Multithread simple/MultithreadSample.dpr @@ -0,0 +1,14 @@ +program MultithreadSample; + +uses + Forms, + frm_main in 'frm_main.pas' {frmMain}, + php_thread in 'php_thread.pas'; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/Demos/psvPHP/Multithread simple/MultithreadSample.res b/Demos/psvPHP/Multithread simple/MultithreadSample.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Multithread simple/WindowsXP.res b/Demos/psvPHP/Multithread simple/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Multithread simple/frm_main.dfm b/Demos/psvPHP/Multithread simple/frm_main.dfm new file mode 100644 index 0000000..e29e9c3 --- /dev/null +++ b/Demos/psvPHP/Multithread simple/frm_main.dfm @@ -0,0 +1,44 @@ +object frmMain: TfrmMain + Left = 513 + Top = 399 + BorderStyle = bsDialog + Caption = 'PHP Multithread sample' + ClientHeight = 81 + ClientWidth = 306 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object btnRun: TButton + Left = 136 + Top = 48 + Width = 75 + Height = 25 + Caption = 'Run' + TabOrder = 0 + OnClick = btnRunClick + end + object btnClose: TButton + Left = 220 + Top = 48 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 1 + OnClick = btnCloseClick + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 12 + Top = 12 + end +end diff --git a/Demos/psvPHP/Multithread simple/frm_main.pas b/Demos/psvPHP/Multithread simple/frm_main.pas new file mode 100644 index 0000000..8ba9a62 --- /dev/null +++ b/Demos/psvPHP/Multithread simple/frm_main.pas @@ -0,0 +1,62 @@ +unit frm_main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + PHPCommon, php4delphi, StdCtrls; + +type + TfrmMain = class(TForm) + PHPEngine: TPHPEngine; + btnRun: TButton; + btnClose: TButton; + procedure btnRunClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmMain: TfrmMain; + +implementation + +uses php_thread; + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TfrmMain.btnRunClick(Sender: TObject); +var + cnt : integer; + T : TPHPThread; +begin + for cnt := 0 to 99 do + begin + T := TPHPThread.Create(true); + T.FreeOnTerminate := true; + T.Resume; + end; +end; + +procedure TfrmMain.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos/psvPHP/Multithread simple/php_thread.pas b/Demos/psvPHP/Multithread simple/php_thread.pas new file mode 100644 index 0000000..76f207c --- /dev/null +++ b/Demos/psvPHP/Multithread simple/php_thread.pas @@ -0,0 +1,45 @@ +unit php_thread; + +interface + +uses + Windows, Classes, Forms, PHPCommon, php4Delphi, PHPTypes, ZendTypes, ZENDAPI, PHPAPI; + +type + TPHPThread = class(TThread) + private + { Private declarations } + PHP : TpsvPHP; + protected + procedure Execute; override; + procedure ComeBack; + end; + +implementation + + +{ TPHPThread } + +procedure TPHPThread.ComeBack; +begin + Application.ProcessMessages; +end; + +procedure TPHPThread.Execute; +begin + PHP := TpsvPHP.Create(nil); + PHP.RunCode('echo "Threaded";'); + PHP.Free; + Synchronize(ComeBack); + sleep(250); //for zend_timeout to kill timer + Synchronize(ComeBack); + try + //This will release thread allocated resources + //The better way is to reuse existsing threads + //to save time and memory + ts_free_thread; + except + end; +end; + +end. diff --git a/Demos/psvPHP/Thread Management/ManageThreads.dpr b/Demos/psvPHP/Thread Management/ManageThreads.dpr new file mode 100644 index 0000000..ee4433b --- /dev/null +++ b/Demos/psvPHP/Thread Management/ManageThreads.dpr @@ -0,0 +1,14 @@ +program ManageThreads; + +uses + Forms, + frm_main in 'frm_main.pas' {frmMain}, + php_thread in 'php_thread.pas'; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/Demos/psvPHP/Thread Management/ManageThreads.res b/Demos/psvPHP/Thread Management/ManageThreads.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Thread Management/frm_main.dfm b/Demos/psvPHP/Thread Management/frm_main.dfm new file mode 100644 index 0000000..093da6e --- /dev/null +++ b/Demos/psvPHP/Thread Management/frm_main.dfm @@ -0,0 +1,56 @@ +object frmMain: TfrmMain + Left = 457 + Top = 410 + BorderStyle = bsDialog + Caption = 'Thread Management' + ClientHeight = 110 + ClientWidth = 358 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object btnRun: TButton + Left = 192 + Top = 72 + Width = 75 + Height = 25 + Caption = 'Run' + TabOrder = 0 + OnClick = btnRunClick + end + object btnClose: TButton + Left = 272 + Top = 72 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 1 + OnClick = btnCloseClick + end + object Memo1: TMemo + Left = 8 + Top = 8 + Width = 177 + Height = 89 + TabOrder = 2 + end + object Pool: TIdThreadMgrPool + PoolSize = 200 + Left = 16 + Top = 8 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 16 + Top = 64 + end +end diff --git a/Demos/psvPHP/Thread Management/frm_main.pas b/Demos/psvPHP/Thread Management/frm_main.pas new file mode 100644 index 0000000..2d40ca6 --- /dev/null +++ b/Demos/psvPHP/Thread Management/frm_main.pas @@ -0,0 +1,67 @@ +unit frm_main; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, PHPCommon, php4delphi, IdBaseComponent, IdThreadMgr, + IdThreadMgrPool, StdCtrls, psAPI; + +type + TfrmMain = class(TForm) + Pool: TIdThreadMgrPool; + PHPEngine: TPHPEngine; + btnRun: TButton; + btnClose: TButton; + Memo1: TMemo; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure btnRunClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmMain: TfrmMain; + +implementation + +uses php_thread; + +{$R *.dfm} + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; + Pool.ThreadClass := TPHPThread; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +procedure TfrmMain.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.btnRunClick(Sender: TObject); +var + cnt : integer; + T : TPHPThread; +begin + EmptyWorkingSet(GetCurrentProcess); + Memo1.Lines.Clear; + for cnt := 0 to 99 do + begin + T := TPHPThread(Pool.GetThread); + T.Pool := Pool; + T.Start; + end; +end; + +end. diff --git a/Demos/psvPHP/Thread Management/php_thread.pas b/Demos/psvPHP/Thread Management/php_thread.pas new file mode 100644 index 0000000..5c814dc --- /dev/null +++ b/Demos/psvPHP/Thread Management/php_thread.pas @@ -0,0 +1,61 @@ +unit php_thread; + +interface + +uses + Windows, Classes, PHPCommon, php4Delphi, PHPTypes, ZendTypes, ZENDAPI, PHPAPI, + idThread, IdBaseComponent, IdThreadMgr, + IdThreadMgrPool; + +type + TPHPThread = class(TidThread) + private + { Private declarations } + PHP : TpsvPHP; + S : string; + procedure Report; + public + Pool: TIdThreadMgrPool; + procedure Run; override; + procedure AfterRun; override; + end; + +implementation + +uses + frm_Main; + +{ TPHPThread } + +procedure TPHPThread.AfterRun; +begin + inherited; + Pool.ReleaseThread(Self); +end; + +procedure TPHPThread.Report; +begin + frmMain.Memo1.Lines.Add(S); +end; + +procedure TPHPThread.Run; +begin + PHP := TpsvPHP.Create(nil); + S := PHP.RunCode('echo "Threaded";'); + PHP.Free; + Synchronize(Report); + Stop; + //We will not destroy thread resources of TSRM + //(PHP thread safe resource manager) + //because theads will be reused + //It's faster then create new thread every time + //for a new request and all web-servers also do it + //if you change your php.ini file and add + // max_execution_time = 0 - Maximum execution time + //of each script, in seconds + // max_input_time = 0 - Maximum amount of time each + //script may spend parsing request data + //PHP will work faster +end; + +end. diff --git a/Demos/psvPHP/Threads Library/ManageThreads.dpr b/Demos/psvPHP/Threads Library/ManageThreads.dpr new file mode 100644 index 0000000..ee4433b --- /dev/null +++ b/Demos/psvPHP/Threads Library/ManageThreads.dpr @@ -0,0 +1,14 @@ +program ManageThreads; + +uses + Forms, + frm_main in 'frm_main.pas' {frmMain}, + php_thread in 'php_thread.pas'; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/Demos/psvPHP/Threads Library/ManageThreads.res b/Demos/psvPHP/Threads Library/ManageThreads.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Threads Library/frm_main.ddp b/Demos/psvPHP/Threads Library/frm_main.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/Threads Library/frm_main.dfm b/Demos/psvPHP/Threads Library/frm_main.dfm new file mode 100644 index 0000000..1a0df70 --- /dev/null +++ b/Demos/psvPHP/Threads Library/frm_main.dfm @@ -0,0 +1,98 @@ +object frmMain: TfrmMain + Left = 457 + Top = 410 + BorderStyle = bsDialog + Caption = 'Thread Management' + ClientHeight = 225 + ClientWidth = 358 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object btnRun: TButton + Left = 192 + Top = 72 + Width = 157 + Height = 25 + Caption = 'Run in threads' + TabOrder = 0 + OnClick = btnRunClick + end + object btnClose: TButton + Left = 280 + Top = 192 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 1 + OnClick = btnCloseClick + end + object MemoCode: TMemo + Left = 8 + Top = 8 + Width = 177 + Height = 89 + Lines.Strings = ( + '') + ScrollBars = ssBoth + TabOrder = 2 + end + object MemoOut: TMemo + Left = 8 + Top = 108 + Width = 177 + Height = 89 + ScrollBars = ssBoth + TabOrder = 3 + end + object btnNoThreads: TButton + Left = 192 + Top = 108 + Width = 157 + Height = 25 + Caption = 'Run no threads' + TabOrder = 4 + OnClick = btnNoThreadsClick + end + object Pool: TIdThreadMgrPool + PoolSize = 200 + Left = 272 + Top = 12 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 232 + Top = 12 + end + object PHPLibrary1: TPHPLibrary + Functions = < + item + FunctionName = 'nb_test' + Tag = 0 + Parameters = < + item + Name = 'Param1' + ParamType = tpString + end> + OnExecute = PHPLibrary1Functions0Execute + end> + Left = 48 + Top = 140 + end + object psvPHP: TpsvPHP + Variables = <> + Left = 288 + Top = 148 + end +end diff --git a/Demos/psvPHP/Threads Library/frm_main.pas b/Demos/psvPHP/Threads Library/frm_main.pas new file mode 100644 index 0000000..b3bf5df --- /dev/null +++ b/Demos/psvPHP/Threads Library/frm_main.pas @@ -0,0 +1,93 @@ +unit frm_main; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, PHPCommon, php4delphi, IdBaseComponent, IdThreadMgr, + IdThreadMgrPool, StdCtrls, psAPI, PHPCustomLibrary, phpLibrary, + phpFunctions, ZendAPI, PHPAPI, ZendTypes, PHPTypes; + +type + TfrmMain = class(TForm) + Pool: TIdThreadMgrPool; + PHPEngine: TPHPEngine; + btnRun: TButton; + btnClose: TButton; + MemoCode: TMemo; + MemoOut: TMemo; + PHPLibrary1: TPHPLibrary; + btnNoThreads: TButton; + psvPHP: TpsvPHP; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure btnRunClick(Sender: TObject); + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure btnNoThreadsClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmMain: TfrmMain; + +implementation + +uses php_thread; + +{$R *.dfm} + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; + Pool.ThreadClass := TPHPThread; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +procedure TfrmMain.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.btnRunClick(Sender: TObject); +var + cnt : integer; + T : TPHPThread; +begin + EmptyWorkingSet(GetCurrentProcess); + MemoOut.Lines.Clear; + for cnt := 0 to 100 do + begin + T := TPHPThread(Pool.GetThread); + T.Pool := Pool; + T.Code := memoCode.Text; + T.Start; + end; +end; + +procedure TfrmMain.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue:= Parameters[0].ZendVariable.AsString; +end; + +procedure TfrmMain.btnNoThreadsClick(Sender: TObject); +var + cnt : integer; +begin + MemoOut.Lines.Clear; + for cnt := 0 to 100 do + MemoOut.Lines.Add(psvPHP.RunCode(MemoCode.Lines)); +end; + +end. diff --git a/Demos/psvPHP/Threads Library/php_thread.pas b/Demos/psvPHP/Threads Library/php_thread.pas new file mode 100644 index 0000000..4008053 --- /dev/null +++ b/Demos/psvPHP/Threads Library/php_thread.pas @@ -0,0 +1,81 @@ +unit php_thread; + +interface + +uses + Windows, Classes, Forms, PHPCommon, php4Delphi, PHPTypes, ZendTypes, ZENDAPI, PHPAPI, + idThread, IdBaseComponent, IdThreadMgr, + IdThreadMgrPool; + +type + TPHPThread = class(TidThread) + private + { Private declarations } + PHP : TpsvPHP; + S : string; + procedure Report; + public + Pool: TIdThreadMgrPool; + Code : string; + constructor Create(ACreateSuspended: Boolean = True); override; + destructor Destroy; override; + procedure Run; override; + procedure AfterRun; override; + end; + +implementation + +uses + frm_Main; + +{ TPHPThread } + +procedure TPHPThread.AfterRun; +begin + inherited; + Pool.ReleaseThread(Self); +end; + +constructor TPHPThread.Create(ACreateSuspended: Boolean); +begin + inherited; + PHP := TpsvPHP.Create(nil); +end; + +destructor TPHPThread.Destroy; +begin + PHP.Free; + inherited; +end; + +procedure TPHPThread.Report; +begin + Application.ProcessMessages; + frmMain.MemoOut.Lines.Add(S); + Application.ProcessMessages; +end; + +procedure TPHPThread.Run; +var + cnt : integer; +begin + for cnt := 1 to 100 do + begin + S := PHP.RunCode(Code); + Synchronize(Report); + end; + Stop; + //We will not destroy thread resources of TSRM + //(PHP thread safe resource manager) + //because theads will be reused + //It's faster then create new thread every time + //for a new request and all web-servers also do it + //if you change your php.ini file and add + // max_execution_time = 0 - Maximum execution time + //of each script, in seconds + // max_input_time = 0 - Maximum amount of time each + //script may spend parsing request data + //PHP will work faster +end; + +end. diff --git a/Demos/psvPHP/array demo/Project1.bdsproj b/Demos/psvPHP/array demo/Project1.bdsproj new file mode 100644 index 0000000..952c85e --- /dev/null +++ b/Demos/psvPHP/array demo/Project1.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + Project1.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/psvPHP/array demo/Project1.res b/Demos/psvPHP/array demo/Project1.res index 08ba56e99891bf0b2acdfefe927247478e8bf093..c791b86b17d95defb4193c5c4f343c6fc35628c0 100644 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tp^Zst8L_ZP5k&}CsD*#vY_>@g2qZ!Zuev7Sp9#c+ZLacn zSX!pEkgRWK@A82kL*CB3nK!$W+mh^^CJHP~UnH4;YleN+gx}lm{@BAPvk7U=0#sy6=B^AQ5y+7;98)xnKC5zgd8bTHr1WEP zg?4K!Th0+Z;sn~gK)E-5HSfUl66lp^k$cpOKj3Q>*rSQ)6L|arK37m*E{#_1z3#jn i0_YIV?c)|#xWOH9jeGjaw%>(+4GQgcO;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/array demo/Unit1.dfm b/Demos/psvPHP/array demo/Unit1.dfm index ff2d68d..d9a28b9 100644 --- a/Demos/psvPHP/array demo/Unit1.dfm +++ b/Demos/psvPHP/array demo/Unit1.dfm @@ -1,9 +1,10 @@ object Form1: TForm1 - Left = 283 - Top = 220 - Width = 264 - Height = 194 + Left = 490 + Top = 294 + BorderStyle = bsDialog Caption = 'Array demo' + ClientHeight = 160 + ClientWidth = 256 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -11,6 +12,9 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object Button1: TButton @@ -31,22 +35,26 @@ object Form1: TForm1 TabOrder = 1 end object psvPHP1: TpsvPHP - Constants = <> Variables = <> Left = 20 Top = 16 end object PHPLibrary1: TPHPLibrary - Executor = psvPHP1 LibraryName = 'ArrayLib' Functions = < item FunctionName = 'get_php_array' Tag = 0 Parameters = <> - OnExecute = PHPLibrary1Functions0Execute + OnExecute = ExecuteGetArray end> Left = 52 Top = 16 end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 44 + Top = 112 + end end diff --git a/Demos/psvPHP/array demo/Unit1.pas b/Demos/psvPHP/array demo/Unit1.pas index bb26299..381b37f 100644 --- a/Demos/psvPHP/array demo/Unit1.pas +++ b/Demos/psvPHP/array demo/Unit1.pas @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } //This sample shows how to return an array as a result of PHP function unit Unit1; @@ -17,7 +17,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, PHPCustomLibrary, phpLibrary, php4delphi, phpFunctions, ZendAPI, PHPAPI, - StdCtrls, ZendTypes, phpTypes; + StdCtrls, ZendTypes, phpTypes, PHPCommon; type TForm1 = class(TForm) @@ -25,10 +25,13 @@ TForm1 = class(TForm) PHPLibrary1: TPHPLibrary; Button1: TButton; ListBox1: TListBox; - procedure PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); + PHPEngine: TPHPEngine; procedure Button1Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure ExecuteGetArray(Sender: TObject; Parameters: TFunctionParams; + var ReturnValue: Variant; ZendVar: TZendVariable; + TSRMLS_DC: Pointer); private { Private declarations } public @@ -43,9 +46,34 @@ implementation {$R *.DFM} -procedure TForm1.PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; - TSRMLS_DC: Pointer); + +procedure TForm1.Button1Click(Sender: TObject); +var + cnt : integer; +begin + //Clear array + SetLength(ar,0); + //Execute code + psvPHP1.RunCode('$z=0; $y=0; $ar=array("la","hu"); $x=45; $z = $x + $y; $count=count($ar); get_php_array();'); + //Display new value of the array + ListBox1.Items.Clear; + for cnt := 0 to Length(ar) - 1 do + ListBox1.Items.Add(ar[cnt]); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + // PHPEngine.ShutdownEngine; +end; + +procedure TForm1.ExecuteGetArray(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); var ht : PHashTable; data: ^ppzval; @@ -53,7 +81,7 @@ procedure TForm1.PHPLibrary1Functions0Execute(Sender: TObject; variable : pzval; tmp : ^ppzval; begin - ht := GetSymbolsTable(TSRMLS_DC); + ht := GetSymbolsTable; if Assigned(ht) then begin new(data); @@ -76,18 +104,4 @@ procedure TForm1.PHPLibrary1Functions0Execute(Sender: TObject; end; end; -procedure TForm1.Button1Click(Sender: TObject); -var - cnt : integer; -begin - //Clear array - SetLength(ar,0); - //Execute code - psvPHP1.RunCode('$z=0; $y=0; $ar=array("la","hu"); $x=45; $z = $x + $y; $count=count($ar); get_php_array();'); - //Display new value of the array - ListBox1.Items.Clear; - for cnt := 0 to Length(ar) - 1 do - ListBox1.Items.Add(ar[cnt]); -end; - end. diff --git a/Demos/psvPHP/array demo/WindowsXP.res b/Demos/psvPHP/array demo/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{ 1 then begin writeln(Format('Usage: %s ', [ParamStr(0)])); Halt(1); end; + Engine := TPHPEngine.Create(nil); + Engine.StartupEngine; php := TpsvPHP.Create(nil); php.FileName := ParamStr(1); write(php.Execute); php.Free; + Engine.ShutdownEngine; + Engine.Free; end. diff --git a/Demos/psvPHP/sample1/Sample1.bdsproj b/Demos/psvPHP/sample1/Sample1.bdsproj new file mode 100644 index 0000000..ad495de --- /dev/null +++ b/Demos/psvPHP/sample1/Sample1.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + Sample1.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/psvPHP/sample1/Sample1.dpr b/Demos/psvPHP/sample1/Sample1.dpr new file mode 100644 index 0000000..35dbf7c --- /dev/null +++ b/Demos/psvPHP/sample1/Sample1.dpr @@ -0,0 +1,16 @@ +program Sample1; + +uses + Forms, + frm_phpDemo in 'frm_phpDemo.pas' {frmPHPDemo}, + zendAPI, + php4delphi, + phpAPI; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmPHPDemo, frmPHPDemo); + Application.Run; +end. diff --git a/Demos/psvPHP/sample1/Sample1.dproj b/Demos/psvPHP/sample1/Sample1.dproj new file mode 100644 index 0000000..477ea4e --- /dev/null +++ b/Demos/psvPHP/sample1/Sample1.dproj @@ -0,0 +1,37 @@ + + + + {918ad693-3b86-4b4f-9d15-809746772557} + Sample1.dpr + Debug + AnyCPU + DCC32 + Sample1.exe + + + 7.0 + False + False + 0 + RELEASE + + + 7.0 + DEBUG + + + Delphi.Personality + VCLApplication + +FalseTrueFalseTrueFalse1001FalseFalseFalseFalseFalse20671252Serhiy Perevoznyk1.0.0.11.0.0.0Sample1.dpr + + + + + MainSource + + +
frmPHPDemo
+
+
+
\ No newline at end of file diff --git a/Demos/psvPHP/sample1/Sample1.res b/Demos/psvPHP/sample1/Sample1.res new file mode 100644 index 0000000000000000000000000000000000000000..d09f372643c552a540472a0bf37ed11503b541ba GIT binary patch literal 2552 zcmbuAL1>&s6o6mq3cn%9#zGE~LkuE~2T7P7%t=gRp5A&~5qh6wbBSCvUDKXhDZ*FEGEa<%^itaGHVX=& zQ_2%#=1TJ5LThbdU?_EFC|eJ6#Xah8@8tT$WDVyoF=bF;{yP08Xj zMyOt>-Fo?K9WPm|=hv~wxpKLC@~K`@G|U{-CPqZ7Vf**CbbkFoYPFgaMIi$N12Q-` zC__U-GCVviqoboTHZ~^n^Ybz@Gb2+|Q!+U@Ddks5W@nRpBYTqmjPlFgQ`vj+M85v< zClWcjrw4k>s>9~6Ic!dCT%5Xi>>j~m_t-sl-4?J1>;WZU57?O`VvpD(_J|>3Pv{9f zMa%3M9l;%e9Ge`^g{5b3FgO?-3=RfEg2BPyU~n)v7z`5z2ZMvb!QfypbQl~A4h9E< zgTWihFQkN=TmkLAUa1b)X`5z{^Ta?f_FDX&^y>DUds`7zh%` z9ms9hVY#uBKaf9=U#}>TKTw+hLx3Sr2fa3`VyDN#%&6B$4I=p>Y!Qw~KD%1wpav0+ zs2m*3uA5B}mIzA(B9hP^0azj%BTf-RgoQ7iINV8uC2Bp4MV|(}1#B=R7!nK#h6F=` z!5$|VA`A(J1Ve;@Fm(K3NH8QA5)6csOF9!z)a(H+sM@L6;e0(e?CnwVRJIQyC9`QRa zsjmJ8bRwQ<8dudMkN=}}I-RaZmOA~Xx=H95^xKvC`?1*9q^_u@%3g`j(QW_fK-|t_ z-KrVRr|yyWR(iJoDN&9WYNPBPr>FF)%*gw4Lq4Kklbg&{JNsVNf3-{eEdO<6Z9mtZ{-cq# z=O}r8&sIfhw$fF)(_iK|CmXUZw`En9U*)sD+m7?fyQ zUL(&neD2DcEaLx=DlDQcS@b#Pb-6{nhcY6wrY*@A_ckp`KSgV}V_}rIIjb#m{ z+xV_pEFH$FS>Gw&g2lUk#%Ds_!6)|#{6{Ueo@2v&S7BQ@M=0`^`FzOwvaRZA*5K7@ zEW^Ih&7L`XexKm6D4((KF7vwFfxBwi_hvVSR#o#>XH>1KP{lZl?>(Y@&e=CE5DK-{ zbD#IQc>1$v*XQ$fJ6FCN&89V|2&WBn!MH1`-ffG#X-`T%;VQdU@H~4Lmy17Y{{pqQ B=e_^{ literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/sample1/Thumbs.db b/Demos/psvPHP/sample1/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..9fda9ba16bacae14263d6467c7e185d770857eab GIT binary patch literal 18944 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 LD)9gL&FX&xjA>+g literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/sample1/WindowsXP.res b/Demos/psvPHP/sample1/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/sample1/frm_phpDemo.dfm b/Demos/psvPHP/sample1/frm_phpDemo.dfm new file mode 100644 index 0000000..43ed881 --- /dev/null +++ b/Demos/psvPHP/sample1/frm_phpDemo.dfm @@ -0,0 +1,194 @@ +object frmPHPDemo: TfrmPHPDemo + Left = 299 + Top = 239 + Caption = 'psvPHP demo' + ClientHeight = 506 + ClientWidth = 775 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 484 + Top = 0 + Width = 4 + Height = 465 + Align = alRight + end + object pnlButtons: TPanel + Left = 0 + Top = 465 + Width = 775 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 590 + Top = 0 + Width = 185 + Height = 41 + Align = alRight + BevelOuter = bvNone + TabOrder = 0 + object btnExecuteCode: TButton + Left = 88 + Top = 8 + Width = 87 + Height = 25 + Caption = 'Execute Code' + TabOrder = 0 + OnClick = btnExecuteCodeClick + end + object btnExecuteFile: TButton + Left = 8 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Execute File' + TabOrder = 1 + OnClick = btnExecuteFileClick + end + end + end + object WebBrowser1: TWebBrowser + Left = 0 + Top = 0 + Width = 484 + Height = 465 + Align = alClient + TabOrder = 1 + ControlData = { + 4C000000063200000F3000000000000000000000000000000000000000000000 + 000000004C000000000000000000000001000000E0D057007335CF11AE690800 + 2B2E126208000000000000004C0000000114020000000000C000000000000046 + 8000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000100000000000000000000000000000000000000} + end + object Panel3: TPanel + Left = 488 + Top = 0 + Width = 287 + Height = 465 + Align = alRight + Caption = 'Panel3' + TabOrder = 2 + object Label1: TLabel + Left = 1 + Top = 1 + Width = 285 + Height = 13 + Margins.Bottom = 0 + Align = alTop + Caption = ' PHP code' + ExplicitWidth = 55 + end + object Label2: TLabel + Left = 1 + Top = 295 + Width = 285 + Height = 13 + Margins.Bottom = 0 + Align = alBottom + Caption = ' Result values' + ExplicitWidth = 70 + end + object memPHPCode: TMemo + Left = 1 + Top = 14 + Width = 285 + Height = 281 + Align = alClient + Lines.Strings = ( + 'echo "Before function declaration...
\n";' + '' + 'function print_something_multiple_times($something,$times)' + '{' + + ' echo "----
\nIn function, printing the string \"$something\' + + '" $times times
\n";' + ' for ($i=0; $i<$times; $i++) {' + ' echo "$i) $something
\n";' + ' }' + ' echo "Done with function...
\n-----
\n";' + '}' + '' + 'function some_other_function()' + '{' + + ' echo "This is some other function, to ensure more than just on' + + 'e function works fine...
\n";' + '}' + '' + '' + 'echo "After function declaration...
\n";' + '' + 'echo "Calling function for the first time...
\n";' + 'print_something_multiple_times($test,10);' + 'echo "Returned from function call...
\n";' + '' + 'echo "Calling the function for the second time...
\n";' + + 'print_something_multiple_times("This like, really works and stuf' + + 'f...",3);' + 'echo "Returned from function call...
\n";' + '' + 'some_other_function();' + '' + '$test = "I don'#39't believe";' + '$tool = "PHP";') + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + object lbVariables: TListBox + Left = 1 + Top = 308 + Width = 285 + Height = 156 + Align = alBottom + ItemHeight = 13 + TabOrder = 1 + end + end + object psvPHP: TpsvPHP + Variables = < + item + Name = 'test' + Value = 'This works!' + end + item + Name = 'tool' + Value = 'Delphi' + end> + OnReadPost = psvPHPReadPost + RequestType = prtPost + Left = 116 + Top = 28 + end + object OpenDialog1: TOpenDialog + DefaultExt = '.php' + Filter = 'PHP script (*.php)|*.php|Any File (*.*)|*.*' + Left = 196 + Top = 132 + end + object PHPEngine: TPHPEngine + OnLogMessage = psvPHPLogMessage + Constants = <> + ReportDLLError = False + Left = 72 + Top = 124 + end + object PHPSystemLibrary1: TPHPSystemLibrary + Left = 248 + Top = 100 + end +end diff --git a/Demos/psvPHP/sample1/frm_phpDemo.pas b/Demos/psvPHP/sample1/frm_phpDemo.pas new file mode 100644 index 0000000..4593e8e --- /dev/null +++ b/Demos/psvPHP/sample1/frm_phpDemo.pas @@ -0,0 +1,178 @@ +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{$I PHP.INC} + +unit frm_phpDemo; + +{ $Id: frm_phpDemo.pas,v 7.4 10/2009 delphi32 Exp $ } + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + OleCtrls, SHDocVw, StdCtrls, ExtCtrls, ActiveX, php4delphi, PHPCommon, + PHPCustomLibrary, phpLibrary; + +type + TfrmPHPDemo = class(TForm) + pnlButtons: TPanel; + Panel2: TPanel; + btnExecuteCode: TButton; + WebBrowser1: TWebBrowser; + psvPHP: TpsvPHP; + btnExecuteFile: TButton; + OpenDialog1: TOpenDialog; + Panel3: TPanel; + memPHPCode: TMemo; + lbVariables: TListBox; + Splitter1: TSplitter; + Label1: TLabel; + Label2: TLabel; + PHPEngine: TPHPEngine; + PHPSystemLibrary1: TPHPSystemLibrary; + procedure FormCreate(Sender: TObject); + procedure btnExecuteFileClick(Sender: TObject); + procedure btnExecuteCodeClick(Sender: TObject); + procedure psvPHPLogMessage(Sender: TObject; AText: String); + procedure psvPHPReadPost(Sender: TObject; Stream: TStream); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure DisplayResultInBrowser(AStr : string); + procedure DisplayVariables; + end; + +var + frmPHPDemo: TfrmPHPDemo; + +implementation + + + +{$R *.DFM} +{$R internal.res} +{$R WindowsXP.res} + +function StringToOleStream(const AString: string): IStream; +var + MemHandle: THandle; +begin + MemHandle := GlobalAlloc(GPTR, Length(AString) + 1); + if MemHandle <> 0 then begin + Move(AString[1], PChar(MemHandle)^, Length(AString) + 1); + CreateStreamOnHGlobal(MemHandle, True, Result); + end else + Result := nil; +end; + +procedure TfrmPHPDemo.FormCreate(Sender: TObject); +var + Url : OleVariant; + Doc : string; +begin + PHPEngine.StartupEngine; + Url := 'about:blank'; + Webbrowser1.Navigate2(Url); + Doc := psvPHP.RunCode('phpinfo();'); + DisplayResultInBrowser(Doc); + DisplayVariables; +end; + + + +procedure TfrmPHPDemo.btnExecuteFileClick(Sender: TObject); +var + doc : string; +begin + if OpenDialog1.Execute then + begin + doc := ''; + MemPHPCode.Lines.Clear; + MemPHPCode.Lines.LoadFromFile(OpenDialog1.FileName); + doc := psvPHP.Execute(OpenDialog1.FileName); + DisplayResultInBrowser(doc); + DisplayVariables; + end; +end; + +procedure TfrmPHPDemo.DisplayResultInBrowser(AStr: string); +var + Stream: IStream; + StreamInit: IPersistStreamInit; +begin + if AStr = '' then + begin + WebBrowser1.Navigate('about:The script returns no result'); + Exit; + end; + AStr := StringReplace(AStr, 'src="?=PHPE9568F34-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ParamStr(0)+'/php"', [rfReplaceAll, rfIgnoreCase]); + + {$IFDEF PHP4} + AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ ParamStr(0) + '/zend1"', [rfReplaceAll, rfIgnoreCase]); + {$ELSE} + AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ ParamStr(0) + '/zend2"', [rfReplaceAll, rfIgnoreCase]); + {$ENDIF} + + Stream := StringToOleStream(AStr); + StreamInit := Webbrowser1.Document as IPersistStreamInit; + StreamInit.InitNew; + StreamInit.Load(Stream); +end; + +procedure TfrmPHPDemo.DisplayVariables; +var + i : integer; +begin + lbVariables.Items.Clear; + for i := 0 to psvPHP.Variables.Count - 1 do + begin + lbVariables.Items.Add(psvphp.Variables[i].Name + '=' + psvPHP.Variables[i].Value); + end; + lbVariables.Items.Add(''); + lbVariables.Items.Add('Headers:'); + lbVariables.Items.Add(''); + for i := 0 to psvPHP.Headers.Count - 1 do + lbVariables.Items.Add(psvPHP.Headers[i].Header); +end; + +procedure TfrmPHPDemo.btnExecuteCodeClick(Sender: TObject); +var + doc : string; +begin + doc := ''; + doc := psvPHP.RunCode(memPHPCode.Text); + DisplayResultInBrowser(doc); + DisplayVariables; +end; + +procedure TfrmPHPDemo.psvPHPLogMessage(Sender: TObject; AText: String); +begin + ShowMessage('Trapped ' + AText); +end; + +procedure TfrmPHPDemo.psvPHPReadPost(Sender: TObject; Stream: TStream); +var + PostData : string; +begin + PostData :='postname=postvalue'#0; + Stream.Write(PostData[1], length(PostData)); +end; + +procedure TfrmPHPDemo.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos/psvPHP/sample2/Sample2.bdsproj b/Demos/psvPHP/sample2/Sample2.bdsproj new file mode 100644 index 0000000..3a68c11 --- /dev/null +++ b/Demos/psvPHP/sample2/Sample2.bdsproj @@ -0,0 +1,658 @@ + + + + + + + + + + + + Sample2.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/Demos/psvPHP/sample2/Sample2.dpr b/Demos/psvPHP/sample2/Sample2.dpr new file mode 100644 index 0000000..c6f5c16 --- /dev/null +++ b/Demos/psvPHP/sample2/Sample2.dpr @@ -0,0 +1,14 @@ +program Sample2; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}, + PHP4Delphi; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/sample2/Sample2.res b/Demos/psvPHP/sample2/Sample2.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/sample2/Unit1.dfm b/Demos/psvPHP/sample2/Unit1.dfm index 13db704..d1d054f 100644 --- a/Demos/psvPHP/sample2/Unit1.dfm +++ b/Demos/psvPHP/sample2/Unit1.dfm @@ -1,9 +1,10 @@ object Form1: TForm1 Left = 414 Top = 391 - Width = 344 - Height = 154 - Caption = 'Form1' + BorderStyle = bsDialog + Caption = 'Calculator' + ClientHeight = 120 + ClientWidth = 336 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -11,6 +12,7 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False + Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel @@ -18,6 +20,7 @@ object Form1: TForm1 Top = 36 Width = 6 Height = 13 + Margins.Bottom = 0 Caption = '+' end object Label2: TLabel @@ -25,6 +28,7 @@ object Form1: TForm1 Top = 36 Width = 6 Height = 13 + Margins.Bottom = 0 Caption = '=' end object Label3: TLabel @@ -32,6 +36,7 @@ object Form1: TForm1 Top = 36 Width = 3 Height = 13 + Margins.Bottom = 0 end object Edit1: TEdit Left = 8 @@ -59,7 +64,6 @@ object Form1: TForm1 OnClick = Button1Click end object psvPHP1: TpsvPHP - Constants = <> Variables = < item Name = 'x' @@ -74,4 +78,10 @@ object Form1: TForm1 Left = 20 Top = 80 end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 76 + Top = 84 + end end diff --git a/Demos/psvPHP/sample2/Unit1.pas b/Demos/psvPHP/sample2/Unit1.pas index 7adfdcd..6e20fb9 100644 --- a/Demos/psvPHP/sample2/Unit1.pas +++ b/Demos/psvPHP/sample2/Unit1.pas @@ -8,13 +8,13 @@ {*******************************************************} unit Unit1; -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, php4delphi; + StdCtrls, php4delphi, PHPCommon; type TForm1 = class(TForm) @@ -25,6 +25,7 @@ TForm1 = class(TForm) Label2: TLabel; Label3: TLabel; Button1: TButton; + PHPEngine: TPHPEngine; procedure Button1Click(Sender: TObject); private { Private declarations } @@ -41,10 +42,12 @@ implementation procedure TForm1.Button1Click(Sender: TObject); begin + PHPEngine.StartupEngine; psvPHP1.Variables.Items[0].Value := Edit1.text; psvPHP1.Variables.Items[1].Value := Edit2.text; psvPHP1.RunCode('$z = $x + $y;'); Label3.Caption := psvPHP1.VariableByName('z').Value; + PHPEngine.ShutdownAndWaitFor; end; end. diff --git a/Demos/psvPHP/sample3/Sample3.dpr b/Demos/psvPHP/sample3/Sample3.dpr new file mode 100644 index 0000000..b90060c --- /dev/null +++ b/Demos/psvPHP/sample3/Sample3.dpr @@ -0,0 +1,13 @@ +program Sample3; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/sample3/Sample3.res b/Demos/psvPHP/sample3/Sample3.res new file mode 100644 index 0000000000000000000000000000000000000000..c791b86b17d95defb4193c5c4f343c6fc35628c0 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/sample3/Unit1.ddp b/Demos/psvPHP/sample3/Unit1.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/sample3/Unit1.dfm b/Demos/psvPHP/sample3/Unit1.dfm index 62f3213..a1d1140 100644 --- a/Demos/psvPHP/sample3/Unit1.dfm +++ b/Demos/psvPHP/sample3/Unit1.dfm @@ -13,6 +13,8 @@ object Form1: TForm1 Font.Style = [] OldCreateOrder = False Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object Memo1: TMemo @@ -71,14 +73,19 @@ object Form1: TForm1 OnClick = Button3Click end object psvPHP1: TpsvPHP - Constants = <> Variables = < item Name = 'test' Value = 'test' end> - HandleErrors = False Left = 112 Top = 140 end + object PHPEngine: TPHPEngine + HandleErrors = False + Constants = <> + ReportDLLError = False + Left = 116 + Top = 252 + end end diff --git a/Demos/psvPHP/sample3/Unit1.pas b/Demos/psvPHP/sample3/Unit1.pas index cef9513..bcf0e46 100644 --- a/Demos/psvPHP/sample3/Unit1.pas +++ b/Demos/psvPHP/sample3/Unit1.pas @@ -11,14 +11,14 @@ {$I PHP.INC} -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } interface uses Windows, Messages, SysUtils, {$IFDEF VERSION6} Variants, {$ENDIF} Classes, Graphics, Controls, Forms, - Dialogs, php4delphi, StdCtrls; + Dialogs, php4delphi, StdCtrls, PHPCommon; type TForm1 = class(TForm) @@ -29,9 +29,12 @@ TForm1 = class(TForm) Button2: TButton; Button3: TButton; psvPHP1: TpsvPHP; + PHPEngine: TPHPEngine; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); private { Private declarations } public @@ -44,6 +47,7 @@ TForm1 = class(TForm) implementation {$R *.dfm} +{$R WindowsXP.res} procedure TForm1.Button1Click(Sender: TObject); begin @@ -60,4 +64,14 @@ procedure TForm1.Button3Click(Sender: TObject); ShowMessage(psvPHP1.RunCode(Memo3.Lines.text)); end; +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + end. diff --git a/Demos/psvPHP/sample3/WindowsXP.res b/Demos/psvPHP/sample3/WindowsXP.res new file mode 100644 index 0000000000000000000000000000000000000000..acb40f5da0b9e9b28ebe8dedc2fcd26c80fd5580 GIT binary patch literal 648 zcmaKq-A}?W6vd}+lJM?h(?^pHra+W12|-Pa@eTF4bR9IVx69gr`|I&`A2{R3k|x`^ z?YZZ7JJ0hxg6nXo7ruUb?oZqLIqo^BYQxTs+5AJLWG8YXHAFNFhLi~4I+n1B=*#NC zzox`k1~E%Dh=`WL(D`k@*YC}kF+#1=lAr~ch!#0a4c`jIjISimwb6<7xmHtVRIm#v zQ4C}vjD79)Lo-5-W{8je!XW0bce6=>Px# delta 27 gcmXpuo**lBz=4U8lZ`VpuOzc1CpE>8je!XW0bDi($p8QV diff --git a/Demos/psvPHP/sample4/frm_PHPTest.dfm b/Demos/psvPHP/sample4/frm_PHPTest.dfm index 153e4eb..a5a36ee 100644 --- a/Demos/psvPHP/sample4/frm_PHPTest.dfm +++ b/Demos/psvPHP/sample4/frm_PHPTest.dfm @@ -1,6 +1,6 @@ object frmPHPTest: TfrmPHPTest - Left = 218 - Top = 174 + Left = 422 + Top = 286 Width = 590 Height = 435 Caption = 'psvPHP test' @@ -11,6 +11,8 @@ object frmPHPTest: TfrmPHPTest Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter @@ -88,9 +90,14 @@ object frmPHPTest: TfrmPHPTest end end object psvPHP: TpsvPHP - Constants = <> Variables = <> Left = 84 Top = 148 end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 80 + Top = 248 + end end diff --git a/Demos/psvPHP/sample4/frm_PHPTest.pas b/Demos/psvPHP/sample4/frm_PHPTest.pas index 7e6750f..9b238de 100644 --- a/Demos/psvPHP/sample4/frm_PHPTest.pas +++ b/Demos/psvPHP/sample4/frm_PHPTest.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - php4delphi, StdCtrls, ExtCtrls; + php4delphi, StdCtrls, ExtCtrls, PHPCommon; type TfrmPHPTest = class(TForm) @@ -17,7 +17,10 @@ TfrmPHPTest = class(TForm) memoScript: TMemo; MemoResult: TMemo; psvPHP: TpsvPHP; + PHPEngine: TPHPEngine; procedure Button1Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); private { Private declarations } public @@ -30,10 +33,21 @@ TfrmPHPTest = class(TForm) implementation {$R *.DFM} +{$R WindowsXP.res} procedure TfrmPHPTest.Button1Click(Sender: TObject); begin MemoResult.Text := psvPHP.RunCode(memoScript.Text); end; +procedure TfrmPHPTest.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TfrmPHPTest.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + end. diff --git a/Demos/psvPHP/sample4/psvPHP_test.res b/Demos/psvPHP/sample4/psvPHP_test.res index 08ba56e99891bf0b2acdfefe927247478e8bf093..c791b86b17d95defb4193c5c4f343c6fc35628c0 100644 GIT binary patch literal 1860 zcmbuAu}@S%5QhgmlP4ht8Y&9B3ObXmD8sWQU zx^hqKYrm#w$b8Y57%`)UqaPz_zkilquP0Si$?WW`%+Jru!oq?qE-p&H- zkilReYinz=y1FX$JCpTwlMiwv_Or;hqhE4#b|&w?d?it$D?QUo=O(m-me7)G9Govv zbj46~MOSp+meDhM#>wazokhNY2572vtxhqr#%FC@k@n zVNsGRiIkuUOO%0|ilMM5EKwFX6b^+$;ZQiDRB$K^3WLJnrBgT*28E&c?}0H&NS^M4 zALaGxKt=A%swg$NGfbJJnFJZ8OzzChOpr|OOzt?2$c;|^O#V!MKcYj@8HP+9 z{Me{Ue0vmTMn6VsP{>zcD{vI@#nCzkH7IZt=irOQakHtwQeY`S6cWZG083$GVNpRS zuyE0d!-X6c>n(F#*z$fB`=W*RNIrv9w+xBWjXSFleepvVj zeqC8JGbnL|b!ECV*2m^Oe(b*~qvVMS literal 876 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 literal 0 HcmV?d00001 diff --git a/Documentation/php4Delphi.pdf b/Documentation/php4Delphi.pdf new file mode 100644 index 0000000000000000000000000000000000000000..83568fc3144a405f1d6b9623d2b630dff246a06b GIT binary patch literal 205551 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
D?|dE&08P$ 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�gk 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 TxSc>LDv2nhprF6ZK - - - - - - - - - - - PHP4DelphiD2006.dpk - - - 7.0 - - - 8 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - True - True - True - - - - 0 - 0 - False - 1 - False - False - False - 16384 - 1048576 - 4194304 - php4Delphi (design-time) - - - - - - - - - - - False - - - - - - False - - - True - False - - - - $00000000 - - - - True - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 2067 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - + + + + + + + + + + + + PHP4DelphiD2006.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + php4Delphi (design-time) + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/PHP4DelphiD2006.dpk b/PHP4DelphiD2006.dpk index b3e773f..ee63fa4 100644 --- a/PHP4DelphiD2006.dpk +++ b/PHP4DelphiD2006.dpk @@ -1,7 +1,8 @@ -package php4DelphiD2006; - -{$R *.res} +package php4DelphiD2006; + +{$R *.res} {$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -12,22 +13,24 @@ package php4DelphiD2006; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (design-time)'} {$DESIGNONLY} {$IMPLICITBUILD OFF} -requires +rrequires rtl, vcl, designide, @@ -35,11 +38,11 @@ requires vclx, php4DelphiR2006; -contains +ocontains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpWeb in 'phpWeb.pas', phpAbout in 'phpAbout.pas' {dlgAbout}; -end. +d. diff --git a/PHP4DelphiD2006.dproj b/PHP4DelphiD2006.dproj new file mode 100644 index 0000000..ed2309b --- /dev/null +++ b/PHP4DelphiD2006.dproj @@ -0,0 +1,125 @@ + + + {C73D9AE1-F5DB-47DF-A699-3A1D775350AD} + PHP4DelphiD2006.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + PHP4DelphiD2006 + 1 + false + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + false + php4Delphi (design-time) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + false + true + 2057 + true + true + true + + + PHP4DelphiD2006_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + PHP4DelphiD2006_Icon.ico + + + false + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + PHP4DelphiD2006.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/PHP4DelphiD2006.dproj.local b/PHP4DelphiD2006.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/PHP4DelphiD2006.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/PHP4DelphiD2006.stat b/PHP4DelphiD2006.stat new file mode 100644 index 0000000..2539032 --- /dev/null +++ b/PHP4DelphiD2006.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=4 +StartTime=21.09.2018 3:07:34 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/PHP4DelphiD2006_Icon.ico b/PHP4DelphiD2006_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..93f732ed5ea2004cf8f8171acf70c3e56af1c26d GIT binary patch literal 766 zcmb7Cv2NTj3}u=E9t$IIGxo-=MsRR}4(%^^NR`isAo$4OhI0@cNT9<_LHZ*_hg~{A zroc$kG(jkHr&4?dp!t%2+?ZLymw`hFC(5eKH`^o6YH$bUus!aHDiCHh-thKoH*a>X z8@`d_cd7(CMSjDdKSF2mP^#C%=6Z;M#Gu4Rx6QW?%tK{nJgDkZ?8Cy9qan!SS~^5B z)2_`?)7_KnlIRJm10+U^~l=|F?9n7-Hu9W6#ZJ|ptAgJz2Zu>gd zyq0@#=(+Er#grs^0Qh%ZotvvDL-%9mDiJ=lz38gZ`u5WLG$0|0sEAjKUUVJ+9OqZD zc 0; -end; - -procedure UnloadPHP; -var - H : THandle; -begin - H := InterlockedExchange(integer(PHPLib), 0); - if H > 0 then + + + + + +type + TPHPFileInfo = record + MajorVersion: Word; + MinorVersion: Word; + Release:Word; + Build:Word; + end; + +function GetPHPVersion: TPHPFileInfo; + + +implementation + +function PHPLoaded : boolean; +begin + Result := PHPLib <> 0; +end; + +procedure UnloadPHP; +var + H : THandle; +begin + H := InterlockedExchange(integer(PHPLib), 0); + if H > 0 then + begin + FreeLibrary(H); + end; +end; + +{$IFDEF PHP4} +function GetSymbolsTable : PHashTable; +var + executor_globals : pointer; + executor_globals_value : integer; + executor_hash : PHashTable; + tsrmls_dc : pointer; +begin + if not PHPLoaded then + begin + Result := nil; + Exit; + end; + + executor_globals := GetProcAddress(PHPLib, 'executor_globals_id'); + executor_globals_value := integer(executor_globals^); + tsrmls_dc := tsrmls_fetch; + asm + mov ecx, executor_globals_value + mov edx, dword ptr tsrmls_dc + mov eax, dword ptr [edx] + mov ecx, dword ptr [eax+ecx*4-4] + add ecx, 0DCh + mov executor_hash, ecx + end; + Result := executor_hash; +end; +{$ELSE} +function GetSymbolsTable : PHashTable; +begin + Result := @GetExecutorGlobals.symbol_table; +end; + +{$ENDIF} + +function GetTrackHash(Name : AnsiString) : PHashTable; +var + data : ^ppzval; + arr : PHashTable; + ret : integer; +begin + Result := nil; + {$IFDEF PHP4} + arr := GetSymbolsTable; + {$ELSE} + arr := @GetExecutorGlobals.symbol_table; + {$ENDIF} + if Assigned(Arr) then + begin + new(data); + ret := zend_hash_find(arr, PAnsiChar(Name), Length(Name)+1, Data); + if ret = SUCCESS then + begin + Result := data^^^.value.ht; + end; + end; +end; + + +function GetSAPIGlobals : Psapi_globals_struct; +var + sapi_globals_value : integer; + sapi_globals : Psapi_globals_struct; + tsrmls_dc : pointer; +begin + Result := nil; + if Assigned(sapi_globals_id) then + begin + tsrmls_dc := tsrmls_fetch; + sapi_globals_value := integer(sapi_globals_id^); + asm + mov ecx, sapi_globals_value + mov edx, dword ptr tsrmls_dc + mov eax, dword ptr [edx] + mov ecx, dword ptr [eax+ecx*4-4] + mov sapi_globals, ecx + end; + Result := sapi_globals; + end; +end; + + +function zval2variant(value : zval) : variant; +begin + case Value._type of + IS_NULL : Result := NULL; + IS_LONG : Result := Value.value.lval; + IS_DOUBLE : Result := Value.value.dval; + IS_STRING : Result := AnsiString(Value.Value.str.val); + IS_BOOL : Result := Boolean(Value.Value.lval); + else + Result := NULL; + end; +end; + +function GetStringOf(const V: TVarData): string; begin - FreeLibrary(H); - end; -end; - -{$IFDEF PHP4} -function GetSymbolsTable(TSRMLS_DC : pointer) : PHashTable; -var - executor_globals : pointer; - executor_globals_value : integer; - executor_hash : PHashTable; -begin - if not PHPLoaded then - begin - Result := nil; - Exit; - end; - - executor_globals := GetProcAddress(PHPLib, 'executor_globals_id'); - executor_globals_value := integer(executor_globals^); - asm - mov ecx, executor_globals_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - add ecx, 0DCh - mov executor_hash, ecx - end; - Result := executor_hash; -end; -{$ELSE} -function GetSymbolsTable(TSRMLS_DC : pointer) : PHashTable; -begin - Result := @GetExecutorGlobals(TSRMLS_DC).symbol_table; -end; - -{$ENDIF} - -function GetTrackHash(Name : string; TSRMLS_DC : pointer) : PHashTable; -var - data : ^ppzval; - arr : PHashTable; - ret : integer; -begin - Result := nil; - {$IFDEF PHP4} - arr := GetSymbolsTable(TSRMLS_DC); - {$ELSE} - arr := @GetExecutorGlobals(TSRMLS_DC).symbol_table; - {$ENDIF} - if Assigned(Arr) then - begin - new(data); - ret := zend_hash_find(arr, PChar(Name), Length(Name)+1, Data); - if ret = SUCCESS then - begin - Result := data^^^.value.ht; - end; - end; -end; - - -function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; -var - sapi_global_id : pointer; - sapi_globals_value : integer; - sapi_globals : Psapi_globals_struct; - -begin - Result := nil; - sapi_global_id := GetProcAddress(PHPLib, 'sapi_globals_id'); - if Assigned(sapi_global_id) then - begin - sapi_globals_value := integer(sapi_global_id^); - asm - mov ecx, sapi_globals_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov sapi_globals, ecx - end; - Result := sapi_globals; - end; -end; - - -function zval2variant(value : zval) : variant; -begin - case Value._type of - IS_NULL : Result := NULL; - IS_LONG : Result := Value.value.lval; - IS_DOUBLE : Result := Value.value.dval; - IS_STRING : Result := String(Value.Value.str.val); - IS_BOOL : Result := Boolean(Value.Value.lval); - else - Result := NULL; - end; -end; - - -procedure variant2zval(value : variant; z : pzval); -var - S : string; -begin - if VarIsEmpty(value) then - begin - ZVAL_NULL(z); - Exit; - end; - - case TVarData(Value).VType of - varString : //Peter Enz - begin - if Assigned ( TVarData(Value).VString ) then - begin - ZVAL_STRING(z, TVarData(Value).VString , true); - end - else - begin - ZVAL_STRING(z, '', true); - end; - end; - - varOleStr : //Peter Enz - begin - if Assigned ( TVarData(Value).VString ) then - begin - S := Value; - ZVAL_STRING(z, PChar(s), {TVarData(Value).VString, } true); - end - else - begin - ZVAL_STRING(z, '', true); - end; - end; - - varSmallInt : ZVAL_LONG(z, TVarData(Value).VSmallint); - varInteger : ZVAL_LONG(z, TVarData(Value).VInteger); - varBoolean : ZVAL_BOOL(z, TVarData(Value).VBoolean); - varSingle : ZVAL_DOUBLE(z, TVarData(Value).VSingle); - varDouble : ZVAL_DOUBLE(z, TVarData(Value).VDouble); - varError : ZVAL_LONG(z, TVarData(Value).VError); - varByte : ZVAL_LONG(z, TVarData(Value).VByte); - varDate : ZVAL_DOUBLE(z, TVarData(Value).VDate); - else - ZVAL_NULL(Z); - end; -end; - - -function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; -var - core_global_id : pointer; - core_globals_value : integer; - core_globals : Pphp_core_globals; -begin - Result := nil; - core_global_id := GetProcAddress(PHPLib, 'core_globals_id'); - if Assigned(core_global_id) then - begin - core_globals_value := integer(core_global_id^); - asm - mov ecx, core_globals_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov core_globals, ecx - end; - Result := core_globals; - end; -end; - - - -function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals; -begin - result := GetPHPGlobals(TSRMLS_DC); -end; - - - - -procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : PChar; AHandler : pointer); -begin - AFunction.fname := AName; - - AFunction.handler := AHandler; - {$IFDEF PHP4} - AFunction.func_arg_types := nil; - {$ELSE} - AFunction.arg_info := nil; - {$ENDIF} -end; - - -procedure phperror(Error : PChar); -begin - zend_error(E_PARSE, Error); -end; - - -{$IFDEF PHP4} -function LoadPHP(const DllFileName: string = 'php4ts.dll') : boolean; -{$ELSE} -function LoadPHP(const DllFileName: string = 'php5ts.dll') : boolean; -{$ENDIF} + case V.VType of + varEmpty, varNull: + Result := ''; + varSmallInt: + Result := IntToStr(V.VSmallInt); + varInteger: + Result := IntToStr(V.VInteger); + varSingle: + Result := FloatToStr(V.VSingle); + varDouble: + Result := FloatToStr(V.VDouble); + varCurrency: + Result := CurrToStr(V.VCurrency); + varDate: + Result := DateTimeToStr(V.VDate); + varOleStr: + Result := V.VOleStr; + varBoolean: + Result := BoolToStr(V.VBoolean, true); + varByte: + Result := IntToStr(V.VByte); + varWord: + Result := IntToStr(V.VWord); + varShortInt: + Result := IntToStr(V.VShortInt); + varLongWord: + Result := IntToStr(V.VLongWord); + varInt64: + Result := IntToStr(V.VInt64); + varString: + Result := string(V.VString); + {$IFDEF SUPPORTS_UNICODE_STRING} + varUString: + Result := string(V.VUString); + {$ENDIF SUPPORTS_UNICODE_STRING} + {varArray, + varDispatch, + varError, + varUnknown, + varAny, + varByRef:} + end; +end; + + +procedure variant2zval(value : variant;var z : pzval); +var + W : WideString; + S: String; +begin + if VarIsEmpty(value) then + begin + ZVAL_NULL(z); + Exit; + end; + // MessageBoxA(0, PAnsiChar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ; + case TVarData(Value).VType of + varString : //Peter Enz + begin + if Assigned ( TVarData(Value).VString ) then + begin + ZVAL_STRING(z, TVarData(Value).VString , true); + end + else + begin + ZVAL_STRING(z, '', true); + end; + end; + + varUString : //Peter Enz + begin + S := string(TVarData(Value).VUString); + + ZVAL_STRING(z, PAnsiChar(AnsiString(S)), true); + end; + + varOleStr : //Peter Enz + begin + if Assigned ( TVarData(Value).VOleStr ) then + begin + W := WideString(Pointer(TVarData(Value).VOleStr)); + ZVAL_STRINGW(z, PWideChar(W), true); + end + else + begin + ZVAL_STRING(z, '', true); + end; + end; + varSmallInt : ZVAL_LONG(z, Integer(TVarData(Value).VSmallint)); + varInteger : ZVAL_LONG(z, TVarData(Value).VInteger); + varBoolean : ZVAL_BOOL(z, TVarData(Value).VBoolean); + varSingle : ZVAL_DOUBLE(z, TVarData(Value).VSingle); + varDouble : ZVAL_DOUBLE(z, TVarData(Value).VDouble); + varError : ZVAL_LONG(z, Integer(TVarData(Value).VError)); + varByte : ZVAL_LONG(z, Integer(TVarData(Value).VByte)); + varDate : ZVAL_DOUBLE(z, TVarData(Value).VDate); + //varArray : ZVAL_ARRAY(z, Value); + else + ZVAL_NULL(Z); + end; +end; + + +function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; +var + core_globals_value : integer; + core_globals : Pphp_core_globals; +begin + Result := nil; + if Assigned(core_globals_id) then + begin + core_globals_value := integer(core_globals_id^); + asm + mov ecx, core_globals_value + mov edx, dword ptr tsrmls_dc + mov eax, dword ptr [edx] + mov ecx, dword ptr [eax+ecx*4-4] + mov core_globals, ecx + end; + Result := core_globals; + end; +end; + + + +function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals; +begin + result := GetPHPGlobals(TSRMLS_DC); +end; + + + + +procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : PAnsiChar; AHandler : pointer); +begin + AFunction.fname := AName; + + AFunction.handler := AHandler; + {$IFDEF PHP4} + AFunction.func_arg_types := nil; + {$ELSE} + AFunction.arg_info := nil; + {$ENDIF} +end; + + +{procedure phperror(Error : PAnsiChar); +begin + zend_error(E_PARSE, Error); +end; } +{$IFDEF PHP540} +//HERE + +procedure php_start_implicit_flush(TSRMLS_D : pointer); +begin + php_output_set_implicit_flush(PHP_IMPLICIT_FLUSH_START, TSRMLS_D); +end; +procedure php_end_implicit_flush(TSRMLS_D : pointer); +begin + php_output_set_implicit_flush(PHP_IMPLICIT_FLUSH_END, TSRMLS_D); +end; +{$ENDIF} + + +function LoadPHP(const DllFileName: AnsiString = PHPWin) : boolean; begin Result := false; @@ -466,6 +592,12 @@ function LoadPHP(const DllFileName: string = 'php5ts.dll') : boolean; Exit; end; + sapi_globals_id := GetProcAddress(PHPLib, 'sapi_globals_id'); + + core_globals_id := GetProcAddress(PHPLib, 'core_globals_id'); + + php_default_post_reader := GetProcAddress(PHPLib, 'php_default_post_reader'); + sapi_add_header_ex := GetProcAddress(PHPLib, 'sapi_add_header_ex'); php_request_startup := GetProcAddress(PHPLib, 'php_request_startup'); @@ -503,7 +635,27 @@ function LoadPHP(const DllFileName: string = 'php5ts.dll') : boolean; php_output_set_status := GetProcAddress(PHPLib, 'php_output_set_status'); php_output_register_constants := GetProcAddress(PHPLib, 'php_output_register_constants'); + {$IFDEF PHP540} + php_start_ob_buffer := GetProcAddress(PHPLib, 'php_output_start_user'); + + php_start_ob_buffer_named := GetProcAddress(PHPLib, 'php_output_start_internal'); + + php_end_ob_buffer := GetProcAddress(PHPLib, 'php_output_end'); + php_end_ob_buffers := GetProcAddress(PHPLib, 'php_output_end_all'); + + php_ob_get_buffer := GetProcAddress(PHPLib, 'php_output_get_contents'); + + php_ob_get_length := GetProcAddress(PHPLib, 'php_output_get_length'); + + php_output_set_implicit_flush :=GetProcAddress(PHPLib, 'php_output_set_implicit_flush'); + + php_get_output_start_filename := GetProcAddress(PHPLib, 'php_output_get_start_filename'); + + php_get_output_start_lineno := GetProcAddress(PHPLib, 'php_output_get_start_lineno'); + + php_output_handler_started := GetProcAddress(PHPLib, 'php_output_handler_started'); + {$ELSE} php_start_ob_buffer := GetProcAddress(PHPLib, 'php_start_ob_buffer'); php_start_ob_buffer_named := GetProcAddress(PHPLib, 'php_start_ob_buffer_named'); @@ -525,6 +677,7 @@ function LoadPHP(const DllFileName: string = 'php5ts.dll') : boolean; php_get_output_start_lineno := GetProcAddress(PHPLib, 'php_get_output_start_lineno'); php_ob_handler_used := GetProcAddress(PHPLib, 'php_ob_handler_used'); +{$ENDIF} php_ob_init_conflict := GetProcAddress(PHPLib, 'php_ob_init_conflict'); @@ -640,225 +793,172 @@ function LoadPHP(const DllFileName: string = 'php5ts.dll') : boolean; php_error_docref2 := GetProcAddress(PHPLib, 'php_error_docref2'); + + {$IFNDEF QUIET_LOAD} CheckPHPErrors; {$ENDIF} Result := true; -end; - - - -{$IFNDEF QUIET_LOAD} -procedure CheckPHPErrors; -begin - if @sapi_add_header_ex = nil then raise EPHP4DelphiException.Create('sapi_add_header_ex'); - if @php_request_startup = nil then raise EPHP4DelphiException.Create('php_request_startup'); - if @php_request_shutdown = nil then raise EPHP4DelphiException.Create('php_request_shutdown'); - if @php_module_startup = nil then raise EPHP4DelphiException.Create('php_module_startup'); - if @php_module_shutdown = nil then raise EPHP4DelphiException.Create('php_module_shutdown'); - if @php_module_shutdown_wrapper = nil then raise EPHP4DelphiException.Create('php_module_shutdown_wrapper'); - if @sapi_startup = nil then raise EPHP4DelphiException.Create('sapi_startup'); - if @sapi_shutdown = nil then raise EPHP4DelphiException.Create('sapi_shutdown'); - if @sapi_activate = nil then raise EPHP4DelphiException.Create('sapi_activate'); - if @sapi_deactivate = nil then raise EPHP4DelphiException.Create('sapi_deactivate'); - if @php_execute_script = nil then raise EPHP4DelphiException.Create('php_execute_script'); - if @php_handle_aborted_connection = nil then raise EPHP4DelphiException.Create('php_handle_aborted_connection'); - if @php_register_variable = nil then raise EPHP4DelphiException.Create('php_register_variable'); - if @php_register_variable_safe = nil then raise EPHP4DelphiException.Create('php_register_variable_safe'); - if @php_register_variable_ex = nil then raise EPHP4DelphiException.Create('php_register_variable_ex'); - if @php_output_startup = nil then raise EPHP4DelphiException.Create('php_output_startup'); - if @php_output_activate = nil then raise EPHP4DelphiException.Create('php_output_activate'); - if @php_output_set_status = nil then raise EPHP4DelphiException.Create('php_output_set_status'); - if @php_output_register_constants = nil then raise EPHP4DelphiException.Create('php_output_register_constants'); - if @php_start_ob_buffer = nil then raise EPHP4DelphiException.Create('php_start_ob_buffer'); - if @php_start_ob_buffer_named = nil then raise EPHP4DelphiException.Create('php_start_ob_buffer_named'); - if @php_end_ob_buffer = nil then raise EPHP4DelphiException.Create('php_end_ob_buffer'); - if @php_end_ob_buffers = nil then raise EPHP4DelphiException.Create('php_end_ob_buffers'); - if @php_ob_get_buffer = nil then raise EPHP4DelphiException.Create('php_ob_get_buffer'); - if @php_ob_get_length = nil then raise EPHP4DelphiException.Create('php_ob_get_length'); - if @php_start_implicit_flush = nil then raise EPHP4DelphiException.Create('php_start_implicit_flush'); - if @php_end_implicit_flush = nil then raise EPHP4DelphiException.Create('php_end_implicit_flush'); - if @php_get_output_start_filename = nil then raise EPHP4DelphiException.Create('php_get_output_start_filename'); - if @php_get_output_start_lineno = nil then raise EPHP4DelphiException.Create('php_get_output_start_lineno'); - if @php_ob_handler_used = nil then raise EPHP4DelphiException.Create('php_ob_handler_used'); - if @php_ob_init_conflict = nil then raise EPHP4DelphiException.Create('php_ob_init_conflict'); - if @php_strtoupper = nil then raise EPHP4DelphiException.Create('php_strtoupper'); - if @php_strtolower = nil then raise EPHP4DelphiException.Create('php_strtolower'); - if @php_strtr = nil then raise EPHP4DelphiException.Create('php_strtr'); - if @php_stripcslashes = nil then raise EPHP4DelphiException.Create('php_stripcslashes'); - if @php_basename = nil then raise EPHP4DelphiException.Create('php_basename'); - if @php_dirname = nil then raise EPHP4DelphiException.Create('php_dirname'); - if @php_stristr = nil then raise EPHP4DelphiException.Create('php_stristr'); - if @php_str_to_str = nil then raise EPHP4DelphiException.Create('php_str_to_str'); - if @php_strip_tags = nil then raise EPHP4DelphiException.Create('php_strip_tags'); - if @php_implode = nil then raise EPHP4DelphiException.Create('php_implode'); - if @php_explode = nil then raise EPHP4DelphiException.Create('php_explode'); - if @php_info_html_esc = nil then raise EPHP4DelphiException.Create('php_info_html_esc'); - if @php_print_info_htmlhead = nil then raise EPHP4DelphiException.Create('php_print_info_htmlhead'); - if @php_print_info = nil then raise EPHP4DelphiException.Create('php_print_info'); - if @php_info_print_table_colspan_header = nil then raise EPHP4DelphiException.Create('php_info_print_table_colspan_header'); - if @php_info_print_box_start = nil then raise EPHP4DelphiException.Create('php_info_print_box_start'); - if @php_info_print_box_end = nil then raise EPHP4DelphiException.Create('php_info_print_box_end'); - if @php_info_print_hr = nil then raise EPHP4DelphiException.Create('php_info_print_hr'); - if @php_info_print_table_start = nil then raise EPHP4DelphiException.Create('php_info_print_table_start'); - if @php_info_print_table_row1 = nil then raise EPHP4DelphiException.Create('php_info_print_table_row1'); - if @php_info_print_table_row2 = nil then raise EPHP4DelphiException.Create('php_info_print_table_row2'); - if @php_info_print_table_row3 = nil then raise EPHP4DelphiException.Create('php_info_print_table_row3'); - if @php_info_print_table_row4 = nil then raise EPHP4DelphiException.Create('php_info_print_table_row4'); - if @php_info_print_table_row = nil then raise EPHP4DelphiException.Create('php_info_print_table_row'); - if @php_info_print_table_end = nil then raise EPHP4DelphiException.Create('php_info_print_table_end'); - if @php_body_write = nil then raise EPHP4DelphiException.Create('php_body_write'); - if @php_header_write = nil then raise EPHP4DelphiException.Create('php_header_write'); - if @php_log_err = nil then raise EPHP4DelphiException.Create('php_log_err'); - if @php_html_puts = nil then raise EPHP4DelphiException.Create('php_html_puts'); - if @_php_error_log = nil then raise EPHP4DelphiException.Create('_php_error_log'); - if @php_print_credits = nil then raise EPHP4DelphiException.Create('php_print_credits'); - if @php_info_print_css = nil then raise EPHP4DelphiException.Create('php_info_print_css'); - if @php_set_sock_blocking = nil then raise EPHP4DelphiException.Create('php_set_sock_blocking'); - if @php_copy_file = nil then raise EPHP4DelphiException.Create('php_copy_file'); - - {$IFDEF PHP4} - if @php_flock = nil then raise EPHP4DelphiException.Create('php_flock'); - if @php_lookup_hostname = nil then raise EPHP4DelphiException.Create('php_lookup_hostname'); - {$ENDIF} - - if @php_header = nil then raise EPHP4DelphiException.Create('php_header'); - if @php_setcookie = nil then raise EPHP4DelphiException.Create('php_setcookie'); - if @php_escape_html_entities = nil then raise EPHP4DelphiException.Create('php_escape_html_entities'); - if @php_ini_long = nil then raise EPHP4DelphiException.Create('php_ini_long'); - if @php_ini_double = nil then raise EPHP4DelphiException.Create('php_ini_double'); - if @php_ini_string = nil then raise EPHP4DelphiException.Create('php_ini_string'); - if @php_url_free = nil then raise EPHP4DelphiException.Create('php_url_free'); - if @php_url_parse = nil then raise EPHP4DelphiException.Create('php_url_parse'); - if @php_url_decode = nil then raise EPHP4DelphiException.Create('php_url_decode'); - if @php_raw_url_decode = nil then raise EPHP4DelphiException.Create('php_raw_url_decode'); - if @php_url_encode = nil then raise EPHP4DelphiException.Create('php_url_encode'); - if @php_raw_url_encode = nil then raise EPHP4DelphiException.Create('php_raw_url_encode'); - if @php_startup_extensions = nil then raise EPHP4DelphiException.Create('php_startup_extensions'); - if @php_error_docref0 = nil then raise EPHP4DelphiException.Create('php_error_docref0'); - if @php_error_docref = nil then raise EPHP4DelphiException.Create('php_error_docref'); - if @php_error_docref1 = nil then raise EPHP4DelphiException.Create('php_error_docref1'); - if @php_error_docref2 = nil then raise EPHP4DelphiException.Create('php_error_docref2'); -end; -{$ENDIF} - -function GetPostVariables: pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; -begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[0]; -end; - -function GetGetVariables : pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; -begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[1]; -end; - -function GetServerVariables : pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; -begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[3]; -end; - -function GetEnvVariables : pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; -begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[4]; -end; - -function GetFilesVariables : pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; -begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[5]; -end; - - -function FloatToValue(Value: Extended): string; -var - c: Char; -begin - c := DecimalSeparator; - DecimalSeparator := '.'; - Result := SysUtils.FormatFloat('0.####', Value); - DecimalSeparator := c; -end; - -function ValueToFloat(Value : string) : extended; -var - c: Char; -begin - c := DecimalSeparator; - DecimalSeparator := '.'; - Result := SysUtils.StrToFloat(Value); - DecimalSeparator := c; -end; - - -function GetPHPVersion: TPHPFileInfo; -var - FileName: string; - InfoSize, Wnd: DWORD; - VerBuf: Pointer; - FI: PVSFixedFileInfo; - VerSize: DWORD; -begin - Result.MajorVersion := 0; - Result.MinorVersion := 0; - Result.Release := 0; - Result.Build := 0; - {$IFDEF PHP4} - FileName := 'php4ts.dll'; - {$ELSE} - FileName := 'php5ts.dll'; - {$ENDIF} - InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd); - if InfoSize <> 0 then - begin - GetMem(VerBuf, InfoSize); - try - if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then - if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then - begin - Result.MajorVersion := HIWORD(FI.dwFileVersionMS); - Result.MinorVersion := LOWORD(FI.dwFileVersionMS); - Result.Release := HIWORD(FI.dwFileVersionLS); - Result.Build := LOWORD(FI.dwFileVersionLS); - end; - finally - FreeMem(VerBuf); - end; - end; -end; - -initialization -{$IFDEF PHP4DELPHI_AUTOLOAD} - LoadPHP; -{$ENDIF} - -finalization -{$IFDEF PHP4DELPHI_AUTOUNLOAD} - UnloadPHP; -{$ENDIF} - -end. \ No newline at end of file +end; + + + +{$IFNDEF QUIET_LOAD} +procedure CheckPHPErrors; +begin + if @sapi_add_header_ex = nil then raise EPHP4DelphiException.Create('sapi_add_header_ex'); + if @php_request_startup = nil then raise EPHP4DelphiException.Create('php_request_startup'); + if @php_request_shutdown = nil then raise EPHP4DelphiException.Create('php_request_shutdown'); + if @php_module_startup = nil then raise EPHP4DelphiException.Create('php_module_startup'); + if @php_module_shutdown = nil then raise EPHP4DelphiException.Create('php_module_shutdown'); + if @php_module_shutdown_wrapper = nil then raise EPHP4DelphiException.Create('php_module_shutdown_wrapper'); + if @sapi_startup = nil then raise EPHP4DelphiException.Create('sapi_startup'); + if @sapi_shutdown = nil then raise EPHP4DelphiException.Create('sapi_shutdown'); + if @sapi_activate = nil then raise EPHP4DelphiException.Create('sapi_activate'); + if @sapi_deactivate = nil then raise EPHP4DelphiException.Create('sapi_deactivate'); + if @php_execute_script = nil then raise EPHP4DelphiException.Create('php_execute_script'); + if @php_handle_aborted_connection = nil then raise EPHP4DelphiException.Create('php_handle_aborted_connection'); + if @php_register_variable = nil then raise EPHP4DelphiException.Create('php_register_variable'); + if @php_register_variable_safe = nil then raise EPHP4DelphiException.Create('php_register_variable_safe'); + if @php_register_variable_ex = nil then raise EPHP4DelphiException.Create('php_register_variable_ex'); + if @php_strip_tags = nil then raise EPHP4DelphiException.Create('php_strip_tags'); + if @php_log_err = nil then raise EPHP4DelphiException.Create('php_log_err'); + if @php_html_puts = nil then raise EPHP4DelphiException.Create('php_html_puts'); + if @_php_error_log = nil then raise EPHP4DelphiException.Create('_php_error_log'); + if @php_print_credits = nil then raise EPHP4DelphiException.Create('php_print_credits'); + if @php_info_print_css = nil then raise EPHP4DelphiException.Create('php_info_print_css'); + if @php_set_sock_blocking = nil then raise EPHP4DelphiException.Create('php_set_sock_blocking'); + if @php_copy_file = nil then raise EPHP4DelphiException.Create('php_copy_file'); + + if @php_ini_long = nil then raise EPHP4DelphiException.Create('php_ini_long'); + if @php_ini_double = nil then raise EPHP4DelphiException.Create('php_ini_double'); + if @php_ini_string = nil then raise EPHP4DelphiException.Create('php_ini_string'); + if @php_url_free = nil then raise EPHP4DelphiException.Create('php_url_free'); + if @php_url_parse = nil then raise EPHP4DelphiException.Create('php_url_parse'); + if @php_url_decode = nil then raise EPHP4DelphiException.Create('php_url_decode'); + if @php_raw_url_decode = nil then raise EPHP4DelphiException.Create('php_raw_url_decode'); + if @php_url_encode = nil then raise EPHP4DelphiException.Create('php_url_encode'); + if @php_raw_url_encode = nil then raise EPHP4DelphiException.Create('php_raw_url_encode'); + + {$IFDEF PHP510} + if @php_register_extensions = nil then raise EPHP4DelphiException.Create('php_register_extensions'); + {$ELSE} + if @php_startup_extensions = nil then raise EPHP4DelphiException.Create('php_startup_extensions'); + {$ENDIF} + + if @php_error_docref0 = nil then raise EPHP4DelphiException.Create('php_error_docref0'); + if @php_error_docref = nil then raise EPHP4DelphiException.Create('php_error_docref'); + if @php_error_docref1 = nil then raise EPHP4DelphiException.Create('php_error_docref1'); + if @php_error_docref2 = nil then raise EPHP4DelphiException.Create('php_error_docref2'); +end; +{$ENDIF} + +function GetPostVariables: pzval; +var + TSRMLS_D : pointer; + CoreGlobals : Pphp_Core_Globals; +begin + TSRMLS_D := ts_resource_ex(0, nil); + CoreGlobals := PG(TSRMLS_D); + Result := CoreGlobals^.http_globals[0]; +end; + +function GetGetVariables : pzval; +var + TSRMLS_D : pointer; + CoreGlobals : Pphp_Core_Globals; +begin + TSRMLS_D := ts_resource_ex(0, nil); + CoreGlobals := PG(TSRMLS_D); + Result := CoreGlobals^.http_globals[1]; +end; + +function GetServerVariables : pzval; +var + TSRMLS_D : pointer; + CoreGlobals : Pphp_Core_Globals; +begin + TSRMLS_D := ts_resource_ex(0, nil); + CoreGlobals := PG(TSRMLS_D); + Result := CoreGlobals^.http_globals[3]; +end; + +function GetEnvVariables : pzval; +var + TSRMLS_D : pointer; + CoreGlobals : Pphp_Core_Globals; +begin + TSRMLS_D := ts_resource_ex(0, nil); + CoreGlobals := PG(TSRMLS_D); + Result := CoreGlobals^.http_globals[4]; +end; + +function GetFilesVariables : pzval; +var + TSRMLS_D : pointer; + CoreGlobals : Pphp_Core_Globals; +begin + TSRMLS_D := ts_resource_ex(0, nil); + CoreGlobals := PG(TSRMLS_D); + Result := CoreGlobals^.http_globals[5]; +end; + + +function FloatToValue(Value: Extended): AnsiString; +var + {$IFDEF VERSION12} + c: WideChar; + {$ELSE} + c: AnsiChar; + {$ENDIF} +begin + c := FormatSettings.DecimalSeparator; + try + FormatSettings.DecimalSeparator := '.'; + Result := SysUtils.FormatFloat('0.####', Value); + finally + FormatSettings.DecimalSeparator := c; + end; +end; + +function ValueToFloat(Value : AnsiString) : extended; +var + {$IFDEF VERSION12} + c: WideChar; + {$ELSE} + c : AnsiChar; + {$ENDIF} +begin + c := FormatSettings.DecimalSeparator; + try + FormatSettings.DecimalSeparator := '.'; + Result := SysUtils.StrToFloat(Value); + finally + FormatSettings.DecimalSeparator := c; + end; +end; + + +function GetPHPVersion: TPHPFileInfo; +var + FileName: AnsiString; +begin + Result.MajorVersion := 0; + Result.MinorVersion := 0; + Result.Release := 0; + Result.Build := 0; + FileName := PHPWin; +end; + +initialization +{$IFDEF PHP4DELPHI_AUTOLOAD} + LoadPHP; +{$ENDIF} + +finalization +{$IFDEF PHP4DELPHI_AUTOUNLOAD} + UnloadPHP; +{$ENDIF} + +end. diff --git a/PHPCommon.pas b/PHPCommon.pas index fc6f2d1..15422bc 100644 --- a/PHPCommon.pas +++ b/PHPCommon.pas @@ -1,406 +1,422 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Developers: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ Michael Maroszek } -{ maroszek@gmx.net } -{ } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpcommon.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit PHPCommon; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ZendTypes, ZendAPI, PHPTypes, PHPAPI; - -type - EDelphiErrorEx = class(Exception); - EPHPErrorEx = class(Exception); - - TPHPErrorType = ( - etError, //0 - etWarning, //1 - etParse, //2 - etNotice, - etCoreError, - etCoreWarning, - etCompileError, - etCompileWarning, - etUserError, - etUserWarning, - etUserNotice, - etUnknown); - - TPHPExecuteMethod = (emServer, emGet); - - TPHPAboutInfo = (abPHP4Delphi); - - TPHPVariable = class(TCollectionItem) - private - FName : string; - FValue : string; - function GetAsBoolean: boolean; - function GetAsFloat: double; - function GetAsInteger: integer; - procedure SetAsBoolean(const Value: boolean); - procedure SetAsFloat(const Value: double); - procedure SetAsInteger(const Value: integer); - protected - function GetDisplayName : string; override; - public - property AsInteger : integer read GetAsInteger write SetAsInteger; - property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; - property AsString : string read FValue write FValue; - property AsFloat : double read GetAsFloat write SetAsFloat; - published - property Name : string read FName write FName; - property Value : string read FValue write FValue; - end; - - TPHPVariables = class(TCollection) - private - FOwner : TComponent; - procedure SetItem(Index: Integer; const Value: TPHPVariable); - function GetItem(Index: Integer): TPHPVariable; - protected - function GetOwner : TPersistent; override; - public - function Add: TPHPVariable; - constructor Create(AOwner: TComponent); - function GetVariables : string; - function IndexOf(AName : string) : integer; - procedure AddRawString(AString : string); - property Items[Index: Integer]: TPHPVariable read GetItem write SetItem; default; - function ByName(AName : string) : TPHPVariable; - end; - - TPHPConstant = class(TCollectionItem) - private - FName : string; - FValue : string; - protected - function GetDisplayName : string; override; - published - property Name : string read FName write FName; - property Value : string read FValue write FValue; - end; - - TPHPConstants = class(TCollection) - private - FOwner : TComponent; - procedure SetItem(Index: Integer; const Value: TPHPConstant); - function GetItem(Index: Integer): TPHPConstant; - protected - function GetOwner : TPersistent; override; - public - function Add: TPHPConstant; - constructor Create(AOwner: TComponent); - function IndexOf(AName : string) : integer; - property Items[Index: Integer]: TPHPConstant read GetItem write SetItem; default; - end; - - TPHPHeader = class(TCollectionItem) - private - FHeader : String; - published - property Header : string read FHeader write FHeader; - end; - - TPHPHeaders = class(TCollection) - private - FOwner : TComponent; - procedure SetItem(Index: Integer; const Value: TPHPHeader); - function GetItem(Index: Integer): TPHPHeader; - protected - function GetOwner : TPersistent; override; - public - function Add: TPHPHeader; - constructor Create(AOwner: TComponent); - function GetHeaders : string; - property Items[Index: Integer]: TPHPHeader read GetItem write SetItem; default; - end; - - TPHPComponent = class(TComponent) - private - FAbout : TPHPAboutInfo; - protected - public - published - property About : TPHPAboutInfo read FAbout write FAbout stored False; - end; - - - -implementation - - -{ TPHPVariables } - -function TPHPVariables.Add: TPHPVariable; -begin - result := TPHPVariable(inherited Add); -end; - -constructor TPHPVariables.Create(AOwner: TComponent); -begin - inherited create(TPHPVariable); - FOwner := AOwner; -end; - -function TPHPVariables.GetItem(Index: Integer): TPHPVariable; -begin - Result := TPHPVariable(inherited GetItem(Index)); -end; - -procedure TPHPVariables.SetItem(Index: Integer; const Value: TPHPVariable); -begin - inherited SetItem(Index, Value) -end; - -function TPHPVariables.GetOwner : TPersistent; -begin - Result := FOwner; -end; - -function TPHPVariables.GetVariables: string; -var i : integer; -begin - for i := 0 to Count - 1 do - begin - Result := Result + Items[i].FName + '=' + Items[i].FValue; - if i < Count - 1 then - Result := Result + '&'; - end; -end; - -function TPHPVariables.IndexOf(AName: string): integer; -var - i : integer; -begin - Result := -1; - for i := 0 to Count - 1 do - begin - if SameText(Items[i].Name, AName) then - begin - Result := i; - break; - end; - end; -end; - -procedure TPHPVariables.AddRawString(AString : string); -var - SL : TStringList; - i : integer; - j : integer; - V : TPHPVariable; -begin - if AString[Length(AString)] = ';' then - SetLength(AString, Length(AString)-1); - SL := TStringList.Create; - ExtractStrings([';'], [], PChar(AString), SL); - for i := 0 to SL.Count - 1 do - begin - j := IndexOf(SL.Names[i]); - if j= -1 then - begin - V := Add; - V.Name := SL.Names[i]; - V.Value := Copy(SL[I], Length(SL.Names[i]) + 2, MaxInt); - end - else - begin - Items[j].Value := Copy(SL[I], Length(SL.Names[i]) + 2, MaxInt); - end; - end; - SL.Free; -end; - -function TPHPVariables.ByName(AName: string): TPHPVariable; -var - i : integer; -begin - Result := nil; - for i := 0 to Count - 1 do - begin - if SameText(Items[i].Name, AName) then - begin - Result := Items[i]; - break; - end; - end; -end; - - -{ TPHPVariable } - -function TPHPVariable.GetAsBoolean: boolean; -begin - if FValue = '' then - begin - Result := false; - Exit; - end; - - if SameText(FValue, 'True') then - Result := true - else - Result := false; -end; - -function TPHPVariable.GetAsFloat: double; -begin - if FValue = '' then - begin - Result := 0; - Exit; - end; - - Result := ValueToFloat(FValue); -end; - -function TPHPVariable.GetAsInteger: integer; -var - c : char; -begin - c := DecimalSeparator; - DecimalSeparator := '.'; - Result := Round(ValueToFloat(FValue)); - DecimalSeparator := c; -end; - -function TPHPVariable.GetDisplayName: string; -begin - if FName = '' then - result := inherited GetDisplayName - else - Result := FName; -end; - -procedure TPHPVariable.SetAsBoolean(const Value: boolean); -begin - if Value then - FValue := 'True' - else - FValue := 'False'; -end; - -procedure TPHPVariable.SetAsFloat(const Value: double); -begin - FValue := FloatToValue(Value); -end; - -procedure TPHPVariable.SetAsInteger(const Value: integer); -var - c : char; -begin - c := DecimalSeparator; - DecimalSeparator := '.'; - FValue := IntToStr(Value); - DecimalSeparator := c; -end; - -{ TPHPConstant } - -function TPHPConstant.GetDisplayName: string; -begin - if FName = '' then - result := inherited GetDisplayName - else - Result := FName; -end; - - -{ TPHPConstants } - -function TPHPConstants.Add: TPHPConstant; -begin - result := TPHPConstant(inherited Add); -end; - -constructor TPHPConstants.Create(AOwner: TComponent); -begin - inherited create(TPHPConstant); - FOwner := AOwner; -end; - -function TPHPConstants.GetItem(Index: Integer): TPHPConstant; -begin - Result := TPHPConstant(inherited GetItem(Index)); -end; - -function TPHPConstants.GetOwner: TPersistent; -begin - Result := FOwner; -end; - -function TPHPConstants.IndexOf(AName: string): integer; -var - i : integer; -begin - Result := -1; - for i := 0 to Count - 1 do - begin - if SameText(Items[i].Name, AName) then - begin - Result := i; - break; - end; - end; -end; - -procedure TPHPConstants.SetItem(Index: Integer; const Value: TPHPConstant); -begin - inherited SetItem(Index, Value) -end; - - -{ TPHPHeaders } - -function TPHPHeaders.Add: TPHPHeader; -begin - result := TPHPHeader(inherited Add); -end; - -constructor TPHPHeaders.Create(AOwner: TComponent); -begin - inherited create(TPHPHeader); - FOwner := AOwner; -end; - -function TPHPHeaders.GetItem(Index: Integer): TPHPHeader; -begin - Result := TPHPHeader(inherited GetItem(Index)); -end; - -procedure TPHPHeaders.SetItem(Index: Integer; const Value: TPHPHeader); -begin - inherited SetItem(Index, Value) -end; - -function TPHPHeaders.GetOwner : TPersistent; -begin - Result := FOwner; -end; - -function TPHPHeaders.GetHeaders: string; -var i : integer; -begin - for i := 0 to Count - 1 do - begin - Result := Result + Items[i].FHeader; - if i < Count - 1 then - Result := Result + #13#10; - end; -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Developers: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ Michael Maroszek } +{ maroszek@gmx.net } +{ } +{ http://users.chello.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: phpcommon.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit PHPCommon; + +interface + +uses + Windows, Messages, SysUtils, Classes, VCL.Graphics, VCL.Controls, VCL.Forms, VCL.Dialogs, + ZendTypes, ZendAPI, PHPTypes, PHPAPI; + +type + EDelphiErrorEx = class(Exception); + EPHPErrorEx = class(Exception); + + TPHPErrorType = ( + etError, //0 + etWarning, //1 + etParse, //2 + etNotice, + etCoreError, + etCoreWarning, + etCompileError, + etCompileWarning, + etUserError, + etUserWarning, + etUserNotice, + etUnknown); + + TPHPExecuteMethod = (emServer, emGet); + + TPHPAboutInfo = (abPHP4Delphi); + + TPHPVariable = class(TCollectionItem) + private + FName : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF}; + FValue : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF}; + function GetAsBoolean: boolean; + function GetAsFloat: double; + function GetAsInteger: integer; + procedure SetAsBoolean(const Value: boolean); + procedure SetAsFloat(const Value: double); + procedure SetAsInteger(const Value: integer); + protected + function GetDisplayName : string; override; + public + property AsInteger : integer read GetAsInteger write SetAsInteger; + property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; + property AsString : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF} read FValue write FValue; + property AsFloat : double read GetAsFloat write SetAsFloat; + published + property Name : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF} read FName write FName; + property Value : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF} read FValue write FValue; + end; + + TPHPVariables = class(TCollection) + private + FOwner : TComponent; + procedure SetItem(Index: Integer; const Value: TPHPVariable); + function GetItem(Index: Integer): TPHPVariable; + protected + function GetOwner : TPersistent; override; + public + function Add: TPHPVariable; + constructor Create(AOwner: TComponent); + function GetVariables : AnsiString; + function IndexOf(AName : AnsiString) : integer; + procedure AddRawString(AString : AnsiString); + property Items[Index: Integer]: TPHPVariable read GetItem write SetItem; default; + function ByName(AName : AnsiString) : TPHPVariable; + end; + + TPHPConstant = class(TCollectionItem) + private + FName : AnsiString; + FValue : AnsiString; + protected + function GetDisplayName : string; override; + published + property Name : AnsiString read FName write FName; + property Value : AnsiString read FValue write FValue; + end; + + TPHPConstants = class(TCollection) + private + FOwner : TComponent; + procedure SetItem(Index: Integer; const Value: TPHPConstant); + function GetItem(Index: Integer): TPHPConstant; + protected + function GetOwner : TPersistent; override; + public + function Add: TPHPConstant; + constructor Create(AOwner: TComponent); + function IndexOf(AName : AnsiString) : integer; + property Items[Index: Integer]: TPHPConstant read GetItem write SetItem; default; + end; + + TPHPHeader = class(TCollectionItem) + private + FHeader : String; + published + property Header : string read FHeader write FHeader; + end; + + TPHPHeaders = class(TCollection) + private + FOwner : TComponent; + procedure SetItem(Index: Integer; const Value: TPHPHeader); + function GetItem(Index: Integer): TPHPHeader; + protected + function GetOwner : TPersistent; override; + public + function Add: TPHPHeader; + constructor Create(AOwner: TComponent); + function GetHeaders : AnsiString; + property Items[Index: Integer]: TPHPHeader read GetItem write SetItem; default; + end; + + TPHPComponent = class(TComponent) + private + FAbout : TPHPAboutInfo; + protected + public + published + property About : TPHPAboutInfo read FAbout write FAbout stored False; + end; + + + +implementation + + +{ TPHPVariables } + +function TPHPVariables.Add: TPHPVariable; +begin + result := TPHPVariable(inherited Add); +end; + +constructor TPHPVariables.Create(AOwner: TComponent); +begin + inherited create(TPHPVariable); + FOwner := AOwner; +end; + +function TPHPVariables.GetItem(Index: Integer): TPHPVariable; +begin + Result := TPHPVariable(inherited GetItem(Index)); +end; + +procedure TPHPVariables.SetItem(Index: Integer; const Value: TPHPVariable); +begin + inherited SetItem(Index, Value) +end; + +function TPHPVariables.GetOwner : TPersistent; +begin + Result := FOwner; +end; + +function TPHPVariables.GetVariables: AnsiString; +var i : integer; +begin + for i := 0 to Count - 1 do + begin + Result := Result + Items[i].FName + '=' + Items[i].FValue; + if i < Count - 1 then + Result := Result + '&'; + end; +end; + +function TPHPVariables.IndexOf(AName: AnsiString): integer; +var + i : integer; +begin + Result := -1; + for i := 0 to Count - 1 do + begin + if SameText(Items[i].Name, AName) then + begin + Result := i; + break; + end; + end; +end; + +procedure TPHPVariables.AddRawString(AString : AnsiString); +var + SL : TStringList; + i : integer; + j : integer; + V : TPHPVariable; +begin + if AString[Length(AString)] = ';' then + SetLength(AString, Length(AString)-1); + SL := TStringList.Create; + + ExtractStrings([';'], [], PWideChar(WideString(AString)), SL); + + for i := 0 to SL.Count - 1 do + begin + j := IndexOf(SL.Names[i]); + if j= -1 then + begin + V := Add; + V.Name := SL.Names[i]; + V.Value := Copy(SL[I], Length(SL.Names[i]) + 2, MaxInt); + end + else + begin + Items[j].Value := Copy(SL[I], Length(SL.Names[i]) + 2, MaxInt); + end; + end; + SL.Free; +end; + +function TPHPVariables.ByName(AName: AnsiString): TPHPVariable; +var + i : integer; +begin + Result := nil; + for i := 0 to Count - 1 do + begin + if SameText(Items[i].Name, AName) then + begin + Result := Items[i]; + break; + end; + end; +end; + + +{ TPHPVariable } + +function TPHPVariable.GetAsBoolean: boolean; +begin + if FValue = '' then + begin + Result := false; + Exit; + end; + + if SameText(FValue, 'True') then + Result := true + else + Result := false; +end; + +function TPHPVariable.GetAsFloat: double; +begin + if FValue = '' then + begin + Result := 0; + Exit; + end; + + Result := ValueToFloat(FValue); +end; + +function TPHPVariable.GetAsInteger: integer; +var + {$IFDEF VERSION12} + c : WideChar; + {$ELSE} + c : AnsiChar; + {$ENDIF} +begin + c := FormatSettings.DecimalSeparator; + try + FormatSettings.DecimalSeparator := '.'; + Result := Round(ValueToFloat(FValue)); + finally + FormatSettings.DecimalSeparator := c; + end; +end; + +function TPHPVariable.GetDisplayName: string; +begin + if FName = '' then + result := inherited GetDisplayName + else + Result := FName; +end; + +procedure TPHPVariable.SetAsBoolean(const Value: boolean); +begin + if Value then + FValue := 'True' + else + FValue := 'False'; +end; + +procedure TPHPVariable.SetAsFloat(const Value: double); +begin + FValue := FloatToValue(Value); +end; + +procedure TPHPVariable.SetAsInteger(const Value: integer); +var + {$IFDEF VERSION12} + c : WideChar; + {$ELSE} + c : AnsiChar; + {$ENDIF} +begin + c := FormatSettings.DecimalSeparator; + try + FormatSettings.DecimalSeparator := '.'; + FValue := IntToStr(Value); + finally + FormatSettings.DecimalSeparator := c; + end; +end; + +{ TPHPConstant } + +function TPHPConstant.GetDisplayName: string; +begin + if FName = '' then + result := inherited GetDisplayName + else + Result := FName; +end; + + +{ TPHPConstants } + +function TPHPConstants.Add: TPHPConstant; +begin + result := TPHPConstant(inherited Add); +end; + +constructor TPHPConstants.Create(AOwner: TComponent); +begin + inherited Create(TPHPConstant); + FOwner := AOwner; +end; + +function TPHPConstants.GetItem(Index: Integer): TPHPConstant; +begin + Result := TPHPConstant(inherited GetItem(Index)); +end; + +function TPHPConstants.GetOwner: TPersistent; +begin + Result := FOwner; +end; + +function TPHPConstants.IndexOf(AName: AnsiString): integer; +var + i : integer; +begin + Result := -1; + for i := 0 to Count - 1 do + begin + if SameText(Items[i].Name, AName) then + begin + Result := i; + break; + end; + end; +end; + +procedure TPHPConstants.SetItem(Index: Integer; const Value: TPHPConstant); +begin + inherited SetItem(Index, Value) +end; + + +{ TPHPHeaders } + +function TPHPHeaders.Add: TPHPHeader; +begin + result := TPHPHeader(inherited Add); +end; + +constructor TPHPHeaders.Create(AOwner: TComponent); +begin + inherited create(TPHPHeader); + FOwner := AOwner; +end; + +function TPHPHeaders.GetItem(Index: Integer): TPHPHeader; +begin + Result := TPHPHeader(inherited GetItem(Index)); +end; + +procedure TPHPHeaders.SetItem(Index: Integer; const Value: TPHPHeader); +begin + inherited SetItem(Index, Value) +end; + +function TPHPHeaders.GetOwner : TPersistent; +begin + Result := FOwner; +end; + +function TPHPHeaders.GetHeaders: AnsiString; +var i : integer; +begin + for i := 0 to Count - 1 do + begin + Result := Result + Items[i].FHeader; + if i < Count - 1 then + Result := Result + #13#10; + end; +end; + +end. diff --git a/PHPFunctions.pas b/PHPFunctions.pas index 2e3002e..6bf6806 100644 --- a/PHPFunctions.pas +++ b/PHPFunctions.pas @@ -1,783 +1,801 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: PHPFunctions.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit phpFunctions; - -interface - uses - Windows, SysUtils, Classes, {$IFDEF VERSION6} Variants, - {$ENDIF} ZendTypes, PHPTypes, ZendAPI, PHPAPI ; - -type - TParamType = (tpString, tpInteger, tpFloat, tpBoolean, tpArray, tpUnknown); - - TZendVariable = class - private - FValue : PZval; - function GetAsBoolean: boolean; - procedure SetAsBoolean(const Value: boolean); - function GetAsFloat: double; - function GetAsInteger: integer; - function GetAsString: string; - procedure SetAsFloat(const Value: double); - procedure SetAsInteger(const Value: integer); - procedure SetAsString(const Value: string); - function GetAsDate: TDateTime; - function GetAsDateTime: TDateTime; - function GetAsTime: TDateTime; - procedure SetAsDate(const Value: TDateTime); - procedure SetAsDateTime(const Value: TDateTime); - procedure SetAsTime(const Value: TDateTime); - function GetAsVariant: variant; - procedure SetAsVariant(const Value: variant); - function GetDataType: integer; - function GetIsNull: boolean; - function GetTypeName: string; - public - constructor Create; virtual; - procedure UnAssign; - property IsNull : boolean read GetIsNull; - property AsZendVariable : Pzval read FValue write FValue; - property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; - property AsInteger : integer read GetAsInteger write SetAsInteger; - property AsString : string read GetAsString write SetAsString; - property AsFloat : double read GetAsFloat write SetAsFloat; - property AsDate : TDateTime read GetAsDate write SetAsDate; - property AsTime : TDateTime read GetAsTime write SetAsTime; - property AsDateTime : TDateTime read GetAsDateTime write SetAsDateTime; - property AsVariant : variant read GetAsVariant write SetAsVariant; - property DataType : integer read GetDataType; - property TypeName : string read GetTypeName; - end; - - - TFunctionParam = class(TCollectionItem) - private - FName : string; - FParamType : TParamType; - FZendVariable : TZendVariable; - function GetZendValue: PZVal; - procedure SetZendValue(const Value: PZVal); - function GetValue: variant; - procedure SetValue(const Value: variant); - public - constructor Create(Collection : TCollection); override; - destructor Destroy; override; - function GetDisplayName: string; override; - procedure SetDisplayName(const Value: string); override; - procedure AssignTo(Dest: TPersistent); override; - property Value : variant read GetValue write SetValue; - property ZendValue : PZVal read GetZendValue write SetZendValue; - property ZendVariable : TZendVariable read FZendVariable write FZendVariable; - published - property Name : string read FName write SetDisplayName; - property ParamType : TParamType read FParamType write FParamType; - end; - - TFunctionParams = class(TCollection) - private - FOwner: TPersistent; - function GetItem(Index: Integer): TFunctionParam; - procedure SetItem(Index: Integer; Value: TFunctionParam); - protected - function GetOwner: TPersistent; override; - procedure SetItemName(Item: TCollectionItem); override; - public - constructor Create(Owner: TPersistent; ItemClass: TCollectionItemClass); - function ParamByName(AName : string) : TFunctionParam; - function Values(AName : string) : Variant; - function Add : TFunctionParam; - property Items[Index: Integer]: TFunctionParam read GetItem write SetItem; default; - end; - - - TPHPExecute = procedure(Sender : TObject; Parameters : TFunctionParams ; var ReturnValue : Variant; - ThisPtr : pzval; TSRMLS_DC : pointer) of object; - - TPHPFunction = class(TCollectionItem) - private - FOnExecute : TPHPExecute; - FFunctionName : string; - FTag : integer; - FFunctionParams: TFunctionParams; - FZendVar : TZendVariable; - procedure SetFunctionParams(const Value: TFunctionParams); - public - ReturnValue : variant; - constructor Create(Collection : TCollection); override; - destructor Destroy; override; - function GetDisplayName: string; override; - procedure SetDisplayName(const Value: string); override; - procedure AssignTo(Dest: TPersistent); override; - property ZendVar: TZendVariable read FZendVar; - published - property FunctionName : string read FFunctionName write SetDisplayName; - property Tag : integer read FTag write FTag; - property Parameters: TFunctionParams read FFunctionParams write SetFunctionParams; - property OnExecute : TPHPExecute read FOnExecute write FOnExecute; - end; - - TPHPFunctions = class(TCollection) - private - FOwner: TPersistent; - function GetItem(Index: Integer): TPHPFunction; - procedure SetItem(Index: Integer; Value: TPHPFunction); - protected - function GetOwner: TPersistent; override; - procedure SetItemName(Item: TCollectionItem); override; - public - constructor Create(Owner: TPersistent; ItemClass: TCollectionItemClass); - function Add : TPHPFunction; - function FunctionByName(const AName : string) : TPHPFunction; - property Items[Index: Integer]: TPHPFunction read GetItem write SetItem; default; - end; - - -function IsParamTypeCorrect(AParamType : TParamType; z : Pzval) : boolean; - -function ZendTypeToString(_type : integer) : string; - -implementation - -function ZendTypeToString(_type : integer) : string; -begin - case _type of - IS_NULL : Result := 'IS_NULL'; - IS_LONG : Result := 'IS_LONG'; - IS_DOUBLE : Result := 'IS_DOUBLE'; - IS_STRING : Result := 'IS_STRING'; - IS_ARRAY : Result := 'IS_ARRAY'; - IS_OBJECT : Result := 'IS_OBJECT'; - IS_BOOL : Result := 'IS_BOOL'; - IS_RESOURCE : Result := 'IS_RESOURCE'; - IS_CONSTANT : Result := 'IS_CONSTANT'; - IS_CONSTANT_ARRAY : Result := 'IS_CONSTANT_ARRAY'; - end; -end; - -function IsParamTypeCorrect(AParamType : TParamType; z : Pzval) : boolean; -var - ZType : integer; -begin - ZType := Z^._type; - case AParamType Of - tpString : Result := (ztype in [IS_STRING, IS_NULL]); - tpInteger : Result := (ztype in [IS_LONG, IS_BOOL, IS_NULL, IS_RESOURCE]); - tpFloat : Result := (ztype in [IS_NULL, IS_DOUBLE, IS_LONG]); - tpBoolean : Result := (ztype in [IS_NULL, IS_BOOL]); - tpArray : Result := (ztype in [IS_NULL, IS_ARRAY]); - tpUnknown : Result := True; - else - Result := False; - end; -end; - -{ TPHPFunctions } - -function TPHPFunctions.Add: TPHPFunction; -begin - Result := TPHPFunction(inherited Add); -end; - -constructor TPHPFunctions.Create(Owner: TPersistent; ItemClass: TCollectionItemClass); -begin - inherited Create(ItemClass); - FOwner := Owner; -end; - -function TPHPFunctions.FunctionByName(const AName: string): TPHPFunction; -var - cnt : integer; -begin - Result := nil; - for cnt := 0 to Count -1 do - begin - if SameText(AName, Items[cnt].FunctionName) then - begin - Result := Items[cnt]; - break; - end; - end; -end; - -function TPHPFunctions.GetItem(Index: Integer): TPHPFunction; -begin - Result := TPHPFunction(inherited GetItem(Index)); -end; - -function TPHPFunctions.GetOwner: TPersistent; -begin - Result := FOwner; -end; - -procedure TPHPFunctions.SetItem(Index: Integer; Value: TPHPFunction); -begin - inherited SetItem(Index, TCollectionItem(Value)); -end; - - -procedure TPHPFunctions.SetItemName(Item: TCollectionItem); -var - I, J: Integer; - ItemName: string; - CurItem: TPHPFunction; -begin - J := 1; - while True do - begin - ItemName := Format('phpfunction%d', [J]); - I := 0; - while I < Count do - begin - CurItem := Items[I] as TPHPFunction; - if (CurItem <> Item) and (CompareText(CurItem.FunctionName, ItemName) = 0) then - begin - Inc(J); - Break; - end; - Inc(I); - end; - if I >= Count then - begin - (Item as TPHPFunction).FunctionName := ItemName; - Break; - end; - end; -end; - -{ TPHPFunction } - -procedure TPHPFunction.AssignTo(Dest: TPersistent); -begin - if Dest is TPHPFunction then - begin - if Assigned(Collection) then Collection.BeginUpdate; - try - with TPHPFunction(Dest) do - begin - Tag := Self.Tag; - end; - finally - if Assigned(Collection) then Collection.EndUpdate; - end; - end else inherited AssignTo(Dest); -end; - -constructor TPHPFunction.Create(Collection: TCollection); -begin - inherited; - FFunctionParams := TFunctionParams.Create(TPHPFunctions(Self.Collection).GetOwner, TFunctionParam); - FZendVar := TZendVariable.Create; -end; - -destructor TPHPFunction.Destroy; -begin - FFunctionParams.Free; - FZendVar.Free; - inherited; -end; - -function TPHPFunction.GetDisplayName: string; -begin - if FFunctionName = '' then - result := inherited GetDisplayName else - Result := FFunctionName; -end; - - - -procedure TPHPFunction.SetDisplayName(const Value: string); -var - I: Integer; - F: TPHPFunction; -begin - if AnsiCompareText(Value, FFunctionName) <> 0 then - begin - if Collection <> nil then - for I := 0 to Collection.Count - 1 do - begin - F := TPHPFunctions(Collection).Items[I]; - if (F <> Self) and (F is TPHPFunction) and - (AnsiCompareText(Value, F.FunctionName) = 0) then - raise Exception.Create('Duplicate function name'); - end; - FFunctionName := LowerCase(Value); - Changed(False); - end; -end; - - -procedure TPHPFunction.SetFunctionParams(const Value: TFunctionParams); -begin - FFunctionParams.Assign(Value); -end; - - -{ TFunctionParams } - -function TFunctionParams.Add: TFunctionParam; -begin - Result := TFunctionParam(inherited Add); -end; - -constructor TFunctionParams.Create(Owner: TPersistent; - ItemClass: TCollectionItemClass); -begin - inherited Create(ItemClass); - FOwner := Owner; -end; - -function TFunctionParams.GetItem(Index: Integer): TFunctionParam; -begin - Result := TFunctionParam(inherited GetItem(Index)); -end; - -function TFunctionParams.GetOwner: TPersistent; -begin - Result := FOwner; -end; - -function TFunctionParams.ParamByName(AName: string): TFunctionParam; -var - i : integer; -begin - Result := nil; - for i := 0 to Count - 1 do - begin - if SameText(AName, Items[i].Name) then - begin - Result := Items[i]; - Break; - end; - end; -end; - -procedure TFunctionParams.SetItem(Index: Integer; Value: TFunctionParam); -begin - inherited SetItem(Index, TCollectionItem(Value)); -end; - -procedure TFunctionParams.SetItemName(Item: TCollectionItem); -var - I, J: Integer; - ItemName: string; - CurItem: TFunctionParam; -begin - J := 1; - while True do - begin - ItemName := Format('Param%d', [J]); - I := 0; - while I < Count do - begin - CurItem := Items[I] as TFunctionParam; - if (CurItem <> Item) and (CompareText(CurItem.Name, ItemName) = 0) then - begin - Inc(J); - Break; - end; - Inc(I); - end; - if I >= Count then - begin - (Item as TFunctionParam).Name := ItemName; - Break; - end; - end; -end; - -function TFunctionParams.Values(AName: string): Variant; -var - P : TFunctionParam; -begin - Result := NULL; - P := ParamByName(AName); - if Assigned(P) then - Result := P.Value; -end; - -{ TFunctionParam } - -procedure TFunctionParam.AssignTo(Dest: TPersistent); -begin - if Dest is TFunctionParam then - begin - if Assigned(Collection) then Collection.BeginUpdate; - try - with TFunctionParam(Dest) do - begin - ParamType := Self.ParamType; - end; - finally - if Assigned(Collection) then Collection.EndUpdate; - end; - end else inherited AssignTo(Dest); -end; - -constructor TFunctionParam.Create(Collection: TCollection); -begin - inherited; - FZendVariable := TZendVariable.Create; -end; - -destructor TFunctionParam.Destroy; -begin - FZendVariable.Free; - inherited; -end; - -function TFunctionParam.GetDisplayName: string; -begin - if FName = '' then - result := inherited GetDisplayName else - Result := FName; -end; - -function TFunctionParam.GetValue: variant; -begin - Result := FZendVariable.AsVariant; -end; - -function TFunctionParam.GetZendValue: PZVal; -begin - Result := FZendVariable.FValue; -end; - -procedure TFunctionParam.SetDisplayName(const Value: string); -var - I: Integer; - F: TFunctionParam; -begin - if AnsiCompareText(Value, FName) <> 0 then - begin - if Collection <> nil then - for I := 0 to Collection.Count - 1 do - begin - F := TFunctionParams(Collection).Items[I]; - if ((F <> Self) and (F is TFunctionParam) and - (AnsiCompareText(Value, F.Name) = 0)) then - raise Exception.Create('Duplicate parameter name'); - end; - FName := Value; - Changed(False); - end; -end; - - -procedure TFunctionParam.SetValue(const Value: variant); -begin - FZendVariable.AsVariant := Value; -end; - -procedure TFunctionParam.SetZendValue(const Value: PZVal); -begin - FZendVariable.AsZendVariable := Value; -end; - -{ TZendVariable } - -constructor TZendVariable.Create; -begin - inherited Create; - FValue := nil; -end; - - - -function TZendVariable.GetAsBoolean: boolean; -begin - if not Assigned(FValue) then - begin - Result := false; - Exit; - end; - - case FValue^._type of - IS_STRING : - begin - if SameText(GetAsString, 'True') then - Result := true - else - Result := false; - end; - IS_BOOL : Result := (FValue^.value.lval = 1); - IS_LONG, IS_RESOURCE : Result := (FValue^.value.lval = 1); - else - Result := false; - end; -end; - -function TZendVariable.GetAsDate: TDateTime; -begin - if not Assigned(FValue) then - begin - Result := 0; - Exit; - end; - - case FValue^._type of - IS_STRING : Result := StrToDate(GetAsString); - IS_DOUBLE : Result := FValue^.value.dval; - else - Result := 0; - end; -end; - -function TZendVariable.GetAsDateTime: TDateTime; -begin - if not Assigned(FValue) then - begin - Result := 0; - Exit; - end; - - case FValue^._type of - IS_STRING : Result := StrToDateTime(GetAsString); - IS_DOUBLE : Result := FValue^.value.dval; - else - Result := 0; - end; -end; - -{$IFDEF VERSION5} -function StrToFloatDef(const S: string; const Default: Extended): Extended; -begin - if not TextToFloat(PChar(S), Result, fvExtended) then - Result := Default; -end; -{$ENDIF} - -function TZendVariable.GetAsFloat: double; -begin - if not Assigned(FValue) then - begin - Result := 0; - Exit; - end; - - case FValue^._type of - IS_STRING : Result := StrToFloatDef(GetAsString,0.0); - IS_DOUBLE : Result := FValue^.value.dval; - else - Result := 0; - end; -end; - -function TZendVariable.GetAsInteger: integer; -begin - if not Assigned(FValue) then - begin - Result := 0; - Exit; - end; - - case FValue^._type of - IS_STRING : result := StrToIntDef(GetAsString, 0); - IS_DOUBLE : result := Round(FValue^.value.dval); - IS_NULL : result := 0; - IS_LONG : result := FValue^.value.lval; - IS_BOOL : result := FValue^.value.lval; - IS_RESOURCE : result := FValue^.value.lval; - else - Result := 0; - end; -end; - -function TZendVariable.GetAsString: string; -begin - if not Assigned(FValue) then - begin - Result := ''; - Exit; - end; - - case FValue^._type of - IS_STRING : begin - try - SetLength(Result, FValue^.value.str.len); - Move(FValue^.value.str.val^, Result[1], FValue^.value.str.len); - except - Result := ''; - end; - end; - IS_DOUBLE : result := FloatToStr(FValue^.value.dval); - IS_LONG : result := IntToStr(FValue^.value.lval); - IS_NULL : result := ''; - IS_RESOURCE : result := IntToStr(FValue^.value.lval); - IS_BOOL : - begin - if FValue^.value.lval = 1 then - Result := 'True' - else - result := 'False'; - end; - else - Result := ''; - end; -end; - -function TZendVariable.GetAsTime: TDateTime; -begin - if not Assigned(FValue) then - begin - Result := 0; - Exit; - end; - - case FValue^._type of - IS_STRING : Result := StrToTime(GetAsString); - IS_DOUBLE : Result := FValue^.value.dval; - else - Result := 0; - end; -end; - -function TZendVariable.GetAsVariant: variant; -begin - if not Assigned(FValue) then - begin - Result := NULL; - Exit; - end; - - result := zval2variant(FValue^); -end; - -function TZendVariable.GetDataType: integer; -begin - if not Assigned(FValue) then - begin - Result := IS_NULL; - Exit; - end; - - Result := FValue^._type; -end; - -function TZendVariable.GetIsNull: boolean; -begin - if not Assigned(FValue) then - begin - Result := true; - Exit; - end; - Result := FValue^._type = IS_NULL; -end; - -function TZendVariable.GetTypeName: string; -begin - if not Assigned(FValue) then - begin - Result := 'null'; - Exit; - end; - - case FValue^._type of - IS_NULL: result := 'null'; - IS_LONG: result := 'integer'; - IS_DOUBLE: result := 'double'; - IS_STRING: result := 'string'; - IS_ARRAY: result := 'array'; - IS_OBJECT: result := 'object'; - IS_BOOL: result := 'boolean'; - IS_RESOURCE: result := 'resource'; - else - result := 'unknown'; - end; -end; - -procedure TZendVariable.SetAsBoolean(const Value: boolean); -begin - if not Assigned(FValue) then - begin - Exit; - end; - ZVAL_BOOL(FValue, Value); -end; - -procedure TZendVariable.SetAsDate(const Value: TDateTime); -begin - if not Assigned(FValue) then - begin - Exit; - end; - ZVAL_DOUBLE(FValue, Value); -end; - -procedure TZendVariable.SetAsDateTime(const Value: TDateTime); -begin - if not Assigned(FValue) then - begin - Exit; - end; - ZVAL_DOUBLE(FValue, Value); -end; - -procedure TZendVariable.SetAsFloat(const Value: double); -begin - if not Assigned(FValue) then - begin - Exit; - end; - ZVAL_DOUBLE(FValue, Value); -end; - -procedure TZendVariable.SetAsInteger(const Value: integer); -begin - if not Assigned(FValue) then - begin - Exit; - end; - ZVAL_LONG(FValue, Value); -end; - -procedure TZendVariable.SetAsString(const Value: string); -begin - if not Assigned(FValue) then - begin - Exit; - end; - ZVAL_STRINGL(FValue, PChar(Value), Length(Value), true); -end; - -procedure TZendVariable.SetAsTime(const Value: TDateTime); -begin - if not Assigned(FValue) then - begin - Exit; - end; - ZVAL_DOUBLE(FValue, Value); -end; - -procedure TZendVariable.SetAsVariant(const Value: variant); -begin - if not Assigned(FValue) then - begin - Exit; - end; - variant2zval(Value, FValue); -end; - - -procedure TZendVariable.UnAssign; -begin - if not Assigned(FValue) then - begin - Exit; - end; - ZVAL_NULL(FValue); -end; - - -end. - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: PHPFunctions.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit phpFunctions; + +{$ifdef fpc} + {$mode delphi} +{$endif} + +interface + uses + Windows, SysUtils, Classes, {$IFDEF VERSION6} Variants, + {$ENDIF} ZendTypes, PHPTypes, ZendAPI, PHPAPI ; + +type + TParamType = (tpString, tpInteger, tpFloat, tpBoolean, tpArray, tpUnknown); + + TZendVariable = class + private + FValue : PZval; + function GetAsBoolean: boolean; + procedure SetAsBoolean(const Value: boolean); + function GetAsFloat: double; + function GetAsInteger: integer; + function GetAsString: AnsiString; + procedure SetAsFloat(const Value: double); + procedure SetAsInteger(const Value: integer); + procedure SetAsString(const Value: AnsiString); + function GetAsDate: TDateTime; + function GetAsDateTime: TDateTime; + function GetAsTime: TDateTime; + procedure SetAsDate(const Value: TDateTime); + procedure SetAsDateTime(const Value: TDateTime); + procedure SetAsTime(const Value: TDateTime); + function GetAsVariant: variant; + procedure SetAsVariant(const Value: variant); + function GetDataType: integer; + function GetIsNull: boolean; + function GetTypeName: string; + public + constructor Create; virtual; + procedure UnAssign; + property IsNull : boolean read GetIsNull; + property AsZendVariable : Pzval read FValue write FValue; + property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; + property AsInteger : integer read GetAsInteger write SetAsInteger; + property AsString : AnsiString read GetAsString write SetAsString; + property AsFloat : double read GetAsFloat write SetAsFloat; + property AsDate : TDateTime read GetAsDate write SetAsDate; + property AsTime : TDateTime read GetAsTime write SetAsTime; + property AsDateTime : TDateTime read GetAsDateTime write SetAsDateTime; + property AsVariant : variant read GetAsVariant write SetAsVariant; + property DataType : integer read GetDataType; + property TypeName : string read GetTypeName; + end; + + + TFunctionParam = class(TCollectionItem) + private + FName : string; + FParamType : TParamType; + FZendVariable : TZendVariable; + function GetZendValue: PZVal; + procedure SetZendValue(const Value: PZVal); + function GetValue: variant; + procedure SetValue(const Value: variant); + public + constructor Create(Collection : TCollection); override; + destructor Destroy; override; + function GetDisplayName: string; override; + procedure SetDisplayName(const Value: string); override; + procedure AssignTo(Dest: TPersistent); override; + property Value : variant read GetValue write SetValue; + property ZendValue : PZVal read GetZendValue write SetZendValue; + property ZendVariable : TZendVariable read FZendVariable write FZendVariable; + published + property Name : string read FName write SetDisplayName; + property ParamType : TParamType read FParamType write FParamType; + end; + + TFunctionParams = class(TCollection) + private + FOwner: TPersistent; + function GetItem(Index: Integer): TFunctionParam; + procedure SetItem(Index: Integer; Value: TFunctionParam); + protected + function GetOwner: TPersistent; override; + procedure SetItemName(Item: TCollectionItem); override; + public + constructor Create(Owner: TPersistent; ItemClass: TCollectionItemClass); + function ParamByName(AName : string) : TFunctionParam; + function Values(AName : string) : Variant; + function Add : TFunctionParam; + property Items[Index: Integer]: TFunctionParam read GetItem write SetItem; default; + end; + + + TPHPExecute = procedure(Sender : TObject; Parameters : TFunctionParams ; var ReturnValue : Variant; + ZendVar : TZendVariable; TSRMLS_DC : pointer) of object; + + TPHPFunction = class(TCollectionItem) + private + FOnExecute : TPHPExecute; + FFunctionName : AnsiString; + FTag : integer; + FFunctionParams: TFunctionParams; + FDescription: AnsiString; + procedure SetFunctionParams(const Value: TFunctionParams); + procedure _SetDisplayName(const value : AnsiString); + public + constructor Create(Collection : TCollection); override; + destructor Destroy; override; + function GetDisplayName: string; override; + procedure SetDisplayName(const Value: string); override; + procedure AssignTo(Dest: TPersistent); override; + published + property FunctionName : AnsiString read FFunctionName write _SetDisplayName; + property Tag : integer read FTag write FTag; + property Parameters: TFunctionParams read FFunctionParams write SetFunctionParams; + property OnExecute : TPHPExecute read FOnExecute write FOnExecute; + property Description : AnsiString read FDescription write FDescription; + end; + + TPHPFunctions = class(TCollection) + private + FOwner: TPersistent; + protected + function GetItem(Index: Integer): TPHPFunction; + procedure SetItem(Index: Integer; Value: TPHPFunction); + function GetOwner: TPersistent; override; + procedure SetItemName(Item: TCollectionItem); override; + public + constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass); virtual; + function Add : TPHPFunction; + function FunctionByName(const AName : AnsiString) : TPHPFunction; + property Items[Index: Integer]: TPHPFunction read GetItem write SetItem; default; + end; + + +function IsParamTypeCorrect(AParamType : TParamType; z : Pzval) : boolean; + +function ZendTypeToString(_type : integer) : string; + +implementation + +function ZendTypeToString(_type : integer) : string; +begin + case _type of + IS_NULL : Result := 'IS_NULL'; + IS_LONG : Result := 'IS_LONG'; + IS_DOUBLE : Result := 'IS_DOUBLE'; + IS_STRING : Result := 'IS_STRING'; + IS_ARRAY : Result := 'IS_ARRAY'; + IS_OBJECT : Result := 'IS_OBJECT'; + IS_BOOL : Result := 'IS_BOOL'; + IS_RESOURCE : Result := 'IS_RESOURCE'; + IS_CONSTANT : Result := 'IS_CONSTANT'; + IS_CONSTANT_ARRAY : Result := 'IS_CONSTANT_ARRAY'; + end; +end; + +function IsParamTypeCorrect(AParamType : TParamType; z : Pzval) : boolean; +var + ZType : integer; +begin + ZType := Z^._type; + case AParamType Of + tpString : Result := (ztype in [IS_STRING, IS_NULL]); + tpInteger : Result := (ztype in [IS_LONG, IS_BOOL, IS_NULL, IS_RESOURCE]); + tpFloat : Result := (ztype in [IS_NULL, IS_DOUBLE, IS_LONG]); + tpBoolean : Result := (ztype in [IS_NULL, IS_BOOL]); + tpArray : Result := (ztype in [IS_NULL, IS_ARRAY]); + tpUnknown : Result := True; + else + Result := False; + end; +end; + +{ TPHPFunctions } + +function TPHPFunctions.Add: TPHPFunction; +begin + Result := TPHPFunction(inherited Add); +end; + +constructor TPHPFunctions.Create(AOwner: TPersistent; ItemClass: TCollectionItemClass); +begin + inherited Create(ItemClass); + FOwner := AOwner; +end; + +function TPHPFunctions.FunctionByName(const AName: AnsiString): TPHPFunction; +var + cnt : integer; +begin + Result := nil; + for cnt := 0 to Count -1 do + begin + if SameText(AName, Items[cnt].FunctionName) then + begin + Result := Items[cnt]; + break; + end; + end; +end; + +function TPHPFunctions.GetItem(Index: Integer): TPHPFunction; +begin + Result := TPHPFunction(inherited GetItem(Index)); +end; + +function TPHPFunctions.GetOwner: TPersistent; +begin + Result := FOwner; +end; + +procedure TPHPFunctions.SetItem(Index: Integer; Value: TPHPFunction); +begin + inherited SetItem(Index, TCollectionItem(Value)); +end; + + +procedure TPHPFunctions.SetItemName(Item: TCollectionItem); +var + I, J: Integer; + ItemName: string; + CurItem: TPHPFunction; +begin + J := 1; + while True do + begin + ItemName := Format('phpfunction%d', [J]); + I := 0; + while I < Count do + begin + CurItem := Items[I] as TPHPFunction; + if (CurItem <> Item) and (CompareText(CurItem.FunctionName, ItemName) = 0) then + begin + Inc(J); + Break; + end; + Inc(I); + end; + if I >= Count then + begin + (Item as TPHPFunction).FunctionName := ItemName; + Break; + end; + end; +end; + +{ TPHPFunction } + + +procedure TPHPFunction.AssignTo(Dest: TPersistent); +begin + if Dest is TPHPFunction then + begin + if Assigned(Collection) then Collection.BeginUpdate; + try + with TPHPFunction(Dest) do + begin + Tag := Self.Tag; + Parameters.Assign(Self.Parameters); + Description := Self.Description; + FunctionName := Self.FunctionName; + end; + finally + if Assigned(Collection) then Collection.EndUpdate; + end; + end else inherited AssignTo(Dest); +end; + + +constructor TPHPFunction.Create(Collection: TCollection); +begin + inherited Create(Collection); + FFunctionParams := TFunctionParams.Create(TPHPFunctions(Self.Collection).GetOwner, TFunctionParam); +end; + +destructor TPHPFunction.Destroy; +begin + FOnExecute := nil; + FFunctionParams.Free; + inherited; +end; + +function TPHPFunction.GetDisplayName: string; +begin + if FFunctionName = '' then + result := inherited GetDisplayName else + Result := FFunctionName; +end; + + + +procedure TPHPFunction.SetDisplayName(const Value: string); +var + I: Integer; + F: TPHPFunction; + NameValue : AnsiString; +begin + NameValue := Value; + if AnsiCompareText(NameValue, FFunctionName) <> 0 then + begin + if Collection <> nil then + for I := 0 to Collection.Count - 1 do + begin + F := TPHPFunctions(Collection).Items[I]; + if (F <> Self) and (F is TPHPFunction) and + (AnsiCompareText(NameValue, F.FunctionName) = 0) then + raise Exception.CreateFmt('Duplicate function name: %s', [Value]); + end; + FFunctionName := AnsiLowerCase(Value); + Changed(False); + end; +end; + +procedure TPHPFunction._SetDisplayName(const Value: AnsiString); +var + NewName : string; +begin + NewName := value; + SetDisplayName(NewName); +end; + +procedure TPHPFunction.SetFunctionParams(const Value: TFunctionParams); +begin + FFunctionParams.Assign(Value); +end; + + +{ TFunctionParams } + +function TFunctionParams.Add: TFunctionParam; +begin + Result := TFunctionParam(inherited Add); +end; + +constructor TFunctionParams.Create(Owner: TPersistent; + ItemClass: TCollectionItemClass); +begin + inherited Create(ItemClass); + FOwner := Owner; +end; + +function TFunctionParams.GetItem(Index: Integer): TFunctionParam; +begin + Result := TFunctionParam(inherited GetItem(Index)); +end; + +function TFunctionParams.GetOwner: TPersistent; +begin + Result := FOwner; +end; + +function TFunctionParams.ParamByName(AName: string): TFunctionParam; +var + i : integer; +begin + Result := nil; + for i := 0 to Count - 1 do + begin + if SameText(AName, Items[i].Name) then + begin + Result := Items[i]; + Break; + end; + end; +end; + +procedure TFunctionParams.SetItem(Index: Integer; Value: TFunctionParam); +begin + inherited SetItem(Index, TCollectionItem(Value)); +end; + +procedure TFunctionParams.SetItemName(Item: TCollectionItem); +var + I, J: Integer; + ItemName: string; + CurItem: TFunctionParam; +begin + J := 1; + while True do + begin + ItemName := Format('Param%d', [J]); + I := 0; + while I < Count do + begin + CurItem := Items[I] as TFunctionParam; + if (CurItem <> Item) and (CompareText(CurItem.Name, ItemName) = 0) then + begin + Inc(J); + Break; + end; + Inc(I); + end; + if I >= Count then + begin + (Item as TFunctionParam).Name := ItemName; + Break; + end; + end; +end; + +function TFunctionParams.Values(AName: string): Variant; +var + P : TFunctionParam; +begin + Result := NULL; + P := ParamByName(AName); + if Assigned(P) then + Result := P.Value; +end; + +{ TFunctionParam } + +procedure TFunctionParam.AssignTo(Dest: TPersistent); +begin + if Dest is TFunctionParam then + begin + if Assigned(Collection) then Collection.BeginUpdate; + try + with TFunctionParam(Dest) do + begin + ParamType := Self.ParamType; + Name := Self.Name; + end; + finally + if Assigned(Collection) then Collection.EndUpdate; + end; + end else inherited AssignTo(Dest); +end; + +constructor TFunctionParam.Create(Collection: TCollection); +begin + inherited; + FZendVariable := TZendVariable.Create; +end; + +destructor TFunctionParam.Destroy; +begin + FZendVariable.Free; + inherited; +end; + +function TFunctionParam.GetDisplayName: string; +begin + if FName = '' then + result := inherited GetDisplayName else + Result := FName; +end; + +function TFunctionParam.GetValue: variant; +begin + Result := FZendVariable.AsVariant; +end; + +function TFunctionParam.GetZendValue: PZVal; +begin + Result := FZendVariable.FValue; +end; + +procedure TFunctionParam.SetDisplayName(const Value: string); +var + I: Integer; + F: TFunctionParam; +begin + if AnsiCompareText(Value, FName) <> 0 then + begin + if Collection <> nil then + for I := 0 to Collection.Count - 1 do + begin + F := TFunctionParams(Collection).Items[I]; + if ((F <> Self) and (F is TFunctionParam) and + (AnsiCompareText(Value, F.Name) = 0)) then + raise Exception.Create('Duplicate parameter name'); + end; + FName := Value; + Changed(False); + end; +end; + + +procedure TFunctionParam.SetValue(const Value: variant); +begin + FZendVariable.AsVariant := Value; +end; + +procedure TFunctionParam.SetZendValue(const Value: PZVal); +begin + FZendVariable.AsZendVariable := Value; +end; + +{ TZendVariable } + +constructor TZendVariable.Create; +begin + inherited Create; + FValue := nil; +end; + + + +function TZendVariable.GetAsBoolean: boolean; +begin + if not Assigned(FValue) then + begin + Result := false; + Exit; + end; + + case FValue^._type of + IS_STRING : + begin + if SameText(GetAsString, 'True') then + Result := true + else + Result := false; + end; + IS_BOOL : Result := (FValue^.value.lval = 1); + IS_LONG, IS_RESOURCE : Result := (FValue^.value.lval = 1); + else + Result := false; + end; +end; + +function TZendVariable.GetAsDate: TDateTime; +begin + if not Assigned(FValue) then + begin + Result := 0; + Exit; + end; + + case FValue^._type of + IS_STRING : Result := StrToDate(GetAsString); + IS_DOUBLE : Result := FValue^.value.dval; + else + Result := 0; + end; +end; + +function TZendVariable.GetAsDateTime: TDateTime; +begin + if not Assigned(FValue) then + begin + Result := 0; + Exit; + end; + + case FValue^._type of + IS_STRING : Result := StrToDateTime(GetAsString); + IS_DOUBLE : Result := FValue^.value.dval; + else + Result := 0; + end; +end; + +{$IFDEF VERSION5} +function StrToFloatDef(const S: string; const Default: Extended): Extended; +begin + if not TextToFloat(PAnsiChar(S), Result, fvExtended) then + Result := Default; +end; +{$ENDIF} + +function TZendVariable.GetAsFloat: double; +begin + if not Assigned(FValue) then + begin + Result := 0; + Exit; + end; + + case FValue^._type of + IS_STRING : Result := StrToFloatDef(GetAsString,0.0); + IS_DOUBLE : Result := FValue^.value.dval; + else + Result := 0; + end; +end; + +function TZendVariable.GetAsInteger: integer; +begin + if not Assigned(FValue) then + begin + Result := 0; + Exit; + end; + + case FValue^._type of + IS_STRING : result := StrToIntDef(GetAsString, 0); + IS_DOUBLE : result := Round(FValue^.value.dval); + IS_NULL : result := 0; + IS_LONG : result := FValue^.value.lval; + IS_BOOL : result := FValue^.value.lval; + IS_RESOURCE : result := FValue^.value.lval; + else + Result := 0; + end; +end; + +function TZendVariable.GetAsString: AnsiString; +begin + if not Assigned(FValue) then + begin + Result := ''; + Exit; + end; + + case FValue^._type of + IS_STRING : begin + try + SetLength(Result, FValue^.value.str.len); + Move(FValue^.value.str.val^, Result[1], FValue^.value.str.len); + except + Result := ''; + end; + end; + IS_DOUBLE : result := FloatToStr(FValue^.value.dval); + IS_LONG : result := IntToStr(FValue^.value.lval); + IS_NULL : result := ''; + IS_RESOURCE : result := IntToStr(FValue^.value.lval); + IS_BOOL : + begin + if FValue^.value.lval = 1 then + Result := 'True' + else + result := 'False'; + end; + else + Result := ''; + end; +end; + +function TZendVariable.GetAsTime: TDateTime; +begin + if not Assigned(FValue) then + begin + Result := 0; + Exit; + end; + + case FValue^._type of + IS_STRING : Result := StrToTime(GetAsString); + IS_DOUBLE : Result := FValue^.value.dval; + else + Result := 0; + end; +end; + +function TZendVariable.GetAsVariant: variant; +begin + if not Assigned(FValue) then + begin + Result := NULL; + Exit; + end; + + result := zval2variant(FValue^); +end; + +function TZendVariable.GetDataType: integer; +begin + if not Assigned(FValue) then + begin + Result := IS_NULL; + Exit; + end; + + Result := FValue^._type; +end; + +function TZendVariable.GetIsNull: boolean; +begin + if not Assigned(FValue) then + begin + Result := true; + Exit; + end; + Result := FValue^._type = IS_NULL; +end; + +function TZendVariable.GetTypeName: string; +begin + if not Assigned(FValue) then + begin + Result := 'null'; + Exit; + end; + + case FValue^._type of + IS_NULL: result := 'null'; + IS_LONG: result := 'integer'; + IS_DOUBLE: result := 'double'; + IS_STRING: result := 'string'; + IS_ARRAY: result := 'array'; + IS_OBJECT: result := 'object'; + IS_BOOL: result := 'boolean'; + IS_RESOURCE: result := 'resource'; + else + result := 'unknown'; + end; +end; + +procedure TZendVariable.SetAsBoolean(const Value: boolean); +begin + if not Assigned(FValue) then + begin + Exit; + end; + ZVAL_BOOL(FValue, Value); +end; + +procedure TZendVariable.SetAsDate(const Value: TDateTime); +begin + if not Assigned(FValue) then + begin + Exit; + end; + ZVAL_DOUBLE(FValue, Value); +end; + +procedure TZendVariable.SetAsDateTime(const Value: TDateTime); +begin + if not Assigned(FValue) then + begin + Exit; + end; + ZVAL_DOUBLE(FValue, Value); +end; + +procedure TZendVariable.SetAsFloat(const Value: double); +begin + if not Assigned(FValue) then + begin + Exit; + end; + ZVAL_DOUBLE(FValue, Value); +end; + +procedure TZendVariable.SetAsInteger(const Value: integer); +begin + if not Assigned(FValue) then + begin + Exit; + end; + ZVAL_LONG(FValue, Value); +end; + +procedure TZendVariable.SetAsString(const Value: AnsiString); +begin + if not Assigned(FValue) then + begin + Exit; + end; + ZVAL_STRINGL(FValue, PAnsiChar(Value), Length(Value), true); +end; + +procedure TZendVariable.SetAsTime(const Value: TDateTime); +begin + if not Assigned(FValue) then + begin + Exit; + end; + ZVAL_DOUBLE(FValue, Value); +end; + +procedure TZendVariable.SetAsVariant(const Value: variant); +begin + if not Assigned(FValue) then + begin + Exit; + end; + variant2zval(Value, FValue); +end; + + +procedure TZendVariable.UnAssign; +begin + if not Assigned(FValue) then + begin + Exit; + end; + ZVAL_NULL(FValue); +end; + + +end. + diff --git a/PHPLibrary.pas b/PHPLibrary.pas index 5103487..bf02a6b 100644 --- a/PHPLibrary.pas +++ b/PHPLibrary.pas @@ -1,492 +1,202 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: PHPLibrary.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit phpLibrary; - -interface - uses - Windows, SysUtils, Classes, - {$IFDEF VERSION6} - Variants, - {$ENDIF} - ZendTypes, ZendAPI, PHPTypes, PHPAPI, phpCustomLibrary, phpFunctions; - -type - TPHPLibrary = class(TCustomPHPLibrary) - published - property Executor; - property LibraryName; - property Functions; - end; - - TDispatchProc = procedure of object; - - TDispatchObject = class - Proc : TDispatchProc; - end; - - TPHPSimpleLibrary = class(TCustomPHPLibrary) - private - FRetValue : variant; - FParams : TFunctionParams; - FMethods : TStringList; - protected - procedure _Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); - procedure ReturnOutputArg(AValue:variant); - function GetInputArg(AIndex:integer):variant; - function GetInputArgAsString(AIndex:integer):string; - function GetInputArgAsInteger(AIndex:integer):integer; - function GetInputArgAsBoolean(AIndex:integer):boolean; - function GetInputArgAsFloat(AIndex:integer):double; - function GetInputArgAsDateTime(AIndex:integer):TDateTime; - public - procedure RegisterMethod(AName : string; AProc : TDispatchProc; AParams : array of TParamType); virtual; - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - end; - - TPHPSystemLibrary = class(TPHPSimpleLibrary) - protected - {System procedures} - procedure RoundProc; - procedure TruncProc; - procedure CopyProc; - procedure PosProc; - procedure LengthProc; - {SysUtils procedures} - procedure UpperCaseProc; - procedure LowerCaseProc; - procedure CompareStrProc; - procedure CompareTextProc; - procedure AnsiUpperCaseProc; - procedure AnsiLowerCaseProc; - procedure AnsiCompareStrProc; - procedure AnsiCompareTextProc; - procedure IsValidIdentProc; - procedure IntToStrProc; - procedure IntToHexProc; - procedure StrToIntProc; - procedure StrToIntDefProc; - procedure FloatToStrProc; - procedure FormatFloatProc; - procedure StrToFloatProc; - procedure EncodeDateProc; - procedure EncodeTimeProc; - procedure DayOfWeekProc; - procedure DateProc; - procedure TimeProc; - procedure NowProc; - procedure IncMonthProc; - procedure IsLeapYearProc; - procedure DateToStrProc; - procedure TimeToStrProc; - procedure DateTimeToStrProc; - procedure StrToDateProc; - procedure StrToTimeProc; - procedure StrToDateTimeProc; - procedure BeepProc; - procedure RandomProc; - public - procedure Refresh; override; - published - property Executor; - end; - -implementation -{ TPHPSimpleLibrary } - -function VarToInteger(v:variant):integer; -begin - case VarType(v) of - varSmallint, varInteger, varByte, varError: result:=v; - varSingle, varDouble, varCurrency, varDate: result:=round(v); - varBoolean: if v=true then result:=1 else result:=0; - varString, varOleStr: result:=round(StrToFloat (v)); - varUnknown, varDispatch : result := 0; - else - if VarIsNull(v) then - result := 0 - else - result := VarAsType(v,varInteger); - end; -end; - -function VarToFloat(v:variant):double; -begin - case VarType(v) of - varSmallint, - varInteger, - varByte, - varError, - varSingle, - varDouble, - varCurrency, - varDate: Result:=v; - varBoolean: if v=true then result:=1 else result:=0; - varString,varOleStr: result:= StrToFloat(v); - varUnknown, varDispatch : result := 0; - else - if VarIsNull(v) then - result := 0 - else - result := VarAsType(v,varDouble); - end; -end; - -function VarToBoolean(v:variant):boolean; -begin - result:=(VarToInteger(v)<>0); -end; - -procedure TPHPSimpleLibrary._Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; - TSRMLS_DC: Pointer); -begin - if not VarIsEmpty(FRetValue) then - VarClear(FRetValue); - FParams := Parameters; - TDispatchObject(FMethods.Objects[FMethods.IndexOf(ActiveFunctionName)]).Proc; - if not VarIsEmpty(FRetValue) then - ReturnValue := FRetValue; -end; - -procedure TPHPSimpleLibrary.RegisterMethod(AName: string; - AProc: TDispatchProc; AParams: array of TParamType); -var - Func : TPHPFunction; - Param : TFunctionParam; - cnt : integer; - O : TDispatchObject; -begin - Func := TPHPFunction(Functions.Add); - Func.FunctionName := LowerCase(AName); - - for cnt := 0 to Length(AParams) - 1 do - begin - Param := TFunctionparam(Func.Parameters.Add); - Param.ParamType := AParams[cnt]; - end; - - Func.OnExecute := _Execute; - - O := TDispatchObject.Create; - O.Proc := Aproc; - - FMethods.AddObject(AName, O); -end; - -procedure TPHPSimpleLibrary.ReturnOutputArg(AValue: variant); -begin - FRetValue := AValue; -end; - -function TPHPSimpleLibrary.GetInputArg(AIndex: integer): variant; -begin - Result := FParams[AIndex].Value; -end; - -function TPHPSimpleLibrary.GetInputArgAsBoolean(AIndex: integer): boolean; -begin - Result := VarToBoolean(GetInputArg(AIndex)); -end; - -function TPHPSimpleLibrary.GetInputArgAsDateTime( - AIndex: integer): TDateTime; -begin - Result := VarToDateTime(GetInputArg(AIndex)); -end; - -function TPHPSimpleLibrary.GetInputArgAsFloat(AIndex: integer): double; -begin - Result := VarToFloat(GetInputArg(AIndex)); -end; - -function TPHPSimpleLibrary.GetInputArgAsInteger(AIndex: integer): integer; -begin - Result := VarToInteger(GetInputArg(AIndex)); -end; - -function TPHPSimpleLibrary.GetInputArgAsString(AIndex: integer): string; -begin - Result := VarToStr(GetInputArg(AIndex)); -end; - -constructor TPHPSimpleLibrary.Create(AOwner: TComponent); -begin - inherited; - FMethods := TStringList.Create; - LibraryName := 'delphi_system'; -end; - -destructor TPHPSimpleLibrary.Destroy; -var - cnt : integer; -begin - for cnt := 0 to FMethods.Count - 1 do - Fmethods.Objects[cnt].Free; - FMethods.Free; - inherited; -end; - -procedure TPHPSystemLibrary.Refresh; -begin - Functions.Clear; - RegisterMethod( 'sys_UpperCase', UpperCaseProc, [tpString] ) ; - RegisterMethod( 'sys_LowerCase', LowerCaseProc, [tpString] ); - RegisterMethod( 'sys_CompareStr', CompareStrProc, [tpString, tpString] ); - RegisterMethod( 'sys_CompareText', CompareTextProc, [tpString, tpString] ); - RegisterMethod( 'sys_AnsiUpperCase', AnsiUpperCaseProc, [tpString] ); - RegisterMethod( 'sys_AnsiLowerCase', AnsiLowerCaseProc, [tpString] ); - RegisterMethod( 'sys_AnsiCompareStr', AnsiCompareStrProc, [tpString, tpString] ); - RegisterMethod( 'sys_AnsiCompareText', AnsiCompareTextProc, [tpString, tpString] ); - RegisterMethod( 'sys_IsValidIdent', IsValidIdentProc, [tpString] ); - RegisterMethod( 'sys_IntToStr', IntToStrProc, [tpInteger] ); - RegisterMethod( 'sys_IntToHex', IntToHexProc, [tpInteger, tpInteger] ); - RegisterMethod( 'sys_StrToInt', StrToIntProc, [tpString] ); - RegisterMethod( 'sys_StrToIntDef', StrToIntDefProc, [tpString, tpInteger] ); - RegisterMethod( 'sys_FloatToStr', FloatToStrProc, [tpFloat] ); - RegisterMethod( 'sys_FormatFloat', FormatFloatProc, [tpString, tpFloat] ); - RegisterMethod( 'sys_StrToFloat', StrToFloatProc, [tpString] ); - RegisterMethod( 'sys_EncodeDate', EncodeDateProc, [tpInteger, tpInteger, tpInteger] ); - RegisterMethod( 'sys_EncodeTime', EncodeTimeProc, [tpInteger, tpInteger, tpInteger, tpInteger] ); - RegisterMethod( 'sys_DayOfWeek', DayOfWeekProc, [tpFloat] ); - RegisterMethod( 'sys_Date', DateProc, [] ); - RegisterMethod( 'sys_Time', TimeProc, [] ); - RegisterMethod( 'sys_Now', NowProc, [] ); - RegisterMethod( 'sys_IncMonth', IncMonthProc, [tpFloat, tpInteger] ); - RegisterMethod( 'sys_IsLeapYear', IsLeapYearProc, [tpInteger] ); - RegisterMethod( 'sys_DateToStr', DateToStrProc, [tpFloat] ); - RegisterMethod( 'sys_TimeToStr', TimeToStrProc, [tpFloat] ); - RegisterMethod( 'sys_DateTimeToStr', DateTimeToStrProc, [tpFloat] ); - RegisterMethod( 'sys_StrToDate', StrToDateProc, [tpString] ); - RegisterMethod( 'sys_StrToTime', StrToTimeProc, [tpString] ); - RegisterMethod( 'sys_StrToDateTime', StrToDateTimeProc, [tpString] ); - RegisterMethod( 'sys_Beep', BeepProc, [] ); - RegisterMethod( 'sys_Round', RoundProc, [tpFloat] ); - RegisterMethod( 'sys_Trunc', TruncProc, [tpFloat] ); - RegisterMethod( 'sys_Copy', CopyProc, [tpString, tpInteger, tpInteger] ); - RegisterMethod( 'sys_Pos', PosProc, [tpString, tpString] ); - RegisterMethod( 'sys_Length', LengthProc, [tpString] ); - RegisterMethod( 'sys_Random', RandomProc, [] ); - - inherited; - -end; - -{ TPHPSystemLibrary } - -procedure TPHPSystemLibrary.UpperCaseProc; -begin - ReturnOutputArg( UpperCase( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.LowerCaseProc; -begin - ReturnOutputArg( LowerCase( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.CompareStrProc; -begin - ReturnOutputArg( CompareStr( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); -end; - -procedure TPHPSystemLibrary.CompareTextProc; -begin - ReturnOutputArg( CompareText( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); -end; - -procedure TPHPSystemLibrary.AnsiUpperCaseProc; -begin - ReturnOutputArg( AnsiUpperCase( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.AnsiLowerCaseProc; -begin - ReturnOutputArg( AnsiLowerCase( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.AnsiCompareStrProc; -begin - ReturnOutputArg( AnsiCompareStr( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); -end; - -procedure TPHPSystemLibrary.AnsiCompareTextProc; -begin - ReturnOutputArg( AnsiCompareText( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); -end; - - -procedure TPHPSystemLibrary.IsValidIdentProc; -begin - ReturnOutputArg( IsValidIdent( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.IntToStrProc; -begin - ReturnOutputArg( IntToStr( GetInputArgAsInteger( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.IntToHexProc; -begin - ReturnOutputArg( IntToHex( GetInputArgAsInteger( 0 ),GetInputArgAsInteger( 1 ) ) ); -end; - -procedure TPHPSystemLibrary.StrToIntProc; -begin - ReturnOutputArg( StrToInt( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.StrToIntDefProc; -begin - ReturnOutputArg( StrToIntDef( GetInputArgAsString( 0 ),GetInputArgAsInteger( 1 ) ) ); -end; - -procedure TPHPSystemLibrary.FloatToStrProc; -begin - ReturnOutputArg( FloatToStr( GetInputArgAsFloat( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.FormatFloatProc; -begin - ReturnOutputArg( FormatFloat( GetInputArgAsString( 0 ),GetInputArgAsFloat( 1 ) ) ); -end; - -procedure TPHPSystemLibrary.StrToFloatProc; -begin - ReturnOutputArg( StrToFloat( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.EncodeDateProc; -begin - ReturnOutputArg( EncodeDate( - GetInputArgAsInteger( 0 ), - GetInputArgAsInteger( 1 ), - GetInputArgAsInteger( 2 ) ) ); -end; - -procedure TPHPSystemLibrary.EncodeTimeProc; -begin - ReturnOutputArg( EncodeTime( - GetInputArgAsInteger( 0 ), - GetInputArgAsInteger( 1 ), - GetInputArgAsInteger( 2 ), - GetInputArgAsInteger( 3 ) ) ); -end; - - - -procedure TPHPSystemLibrary.DayOfWeekProc; -begin - ReturnOutputArg( DayOfWeek( GetInputArgAsDateTime( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.DateProc; -begin - ReturnOutputArg( Date ); -end; - -procedure TPHPSystemLibrary.TimeProc; -begin - ReturnOutputArg( Time ); -end; - -procedure TPHPSystemLibrary.NowProc; -begin - ReturnOutputArg( Now ); -end; - -procedure TPHPSystemLibrary.IncMonthProc; -begin - ReturnOutputArg( IncMonth( GetInputArgAsDateTime( 0 ),GetInputArgAsInteger( 1 ) ) ); -end; - -procedure TPHPSystemLibrary.IsLeapYearProc; -begin - ReturnOutputArg( IsLeapYear( GetInputArgAsInteger( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.DateToStrProc; -begin - ReturnOutputArg( DateToStr( GetInputArgAsDateTime( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.TimeToStrProc; -begin - ReturnOutputArg( TimeToStr( GetInputArgAsDateTime( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.DateTimeToStrProc; -begin - ReturnOutputArg( DateTimeToStr( GetInputArgAsDateTime( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.StrToDateProc; -begin - ReturnOutputArg( StrToDate( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.StrToTimeProc; -begin - ReturnOutputArg( StrToTime( GetInputArgAsString( 0 ) ) ); -end; - -procedure TPHPSystemLibrary.StrToDateTimeProc; -begin - ReturnOutputArg( StrToDateTime( GetInputArgAsString( 0 ) ) ); -end; - - -procedure TPHPSystemLibrary.BeepProc; -begin - Beep; -end; - - -procedure TPHPSystemLibrary.RoundProc; -begin - ReturnOutputArg( Integer(Round( GetInputArgAsFloat( 0 ) )) ); -end; - -procedure TPHPSystemLibrary.TruncProc; -begin - ReturnOutputArg( Integer(Trunc( GetInputArgAsFloat( 0 ) )) ); -end; - -procedure TPHPSystemLibrary.CopyProc; -begin - ReturnOutputArg( Copy( - GetInputArgAsString( 0 ), - GetInputArgAsInteger( 1 ), - GetInputArgAsInteger( 2 ) ) ); -end; - - -procedure TPHPSystemLibrary.PosProc; -begin - ReturnOutputArg( pos(GetInputArgAsString( 0 ),GetInputArgAsString( 1 )) ); -end; - -procedure TPHPSystemLibrary.LengthProc; -begin - ReturnOutputArg( Length( GetInputArgAsString( 0 ) ) ); -end; - - -procedure TPHPSystemLibrary.RandomProc; -begin - ReturnOutputArg( Random ); -end; - - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: PHPLibrary.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit phpLibrary; + +interface + uses + Windows, SysUtils, Classes, + {$IFDEF VERSION6} + Variants, + {$ENDIF} + ZendTypes, ZendAPI, + PHPTypes, + PHPAPI, + phpCustomLibrary, + phpFunctions; + +type + TPHPLibrary = class(TCustomPHPLibrary) + published + property LibraryName; + property Functions; + end; + + TDispatchProc = procedure of object; + + TDispatchObject = class + Proc : TDispatchProc; + end; + + TPHPSimpleLibrary = class(TCustomPHPLibrary) + private + FRetValue : variant; + FParams : TFunctionParams; + FMethods : TStringList; + protected + procedure _Execute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); + procedure ReturnOutputArg(AValue:variant); + function GetInputArg(AIndex:integer):variant; + function GetInputArgAsString(AIndex:integer):string; + function GetInputArgAsInteger(AIndex:integer):integer; + function GetInputArgAsBoolean(AIndex:integer):boolean; + function GetInputArgAsFloat(AIndex:integer):double; + function GetInputArgAsDateTime(AIndex:integer):TDateTime; + public + procedure RegisterMethod(AName : AnsiString; ADescription : AnsiString; AProc : TDispatchProc; AParams : array of TParamType); virtual; + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + end; + +implementation + +{ TPHPSimpleLibrary } + +function VarToInteger(v:variant):integer; +begin + case VarType(v) of + varSmallint, varInteger, varByte, varError: result:=v; + varSingle, varDouble, varCurrency, varDate: result:=round(v); + varBoolean: if v=true then result:=1 else result:=0; + varString, varOleStr: result:=round(StrToFloat (v)); + varUnknown, varDispatch : result := 0; + else + if VarIsNull(v) then + result := 0 + else + result := VarAsType(v,varInteger); + end; +end; + +function VarToFloat(v:variant):double; +begin + case VarType(v) of + varSmallint, + varInteger, + varByte, + varError, + varSingle, + varDouble, + varCurrency, + varDate: Result:=v; + varBoolean: if v=true then result:=1 else result:=0; + varString,varOleStr: result:= StrToFloat(v); + varUnknown, varDispatch : result := 0; + else + if VarIsNull(v) then + result := 0 + else + result := VarAsType(v,varDouble); + end; +end; + +function VarToBoolean(v:variant):boolean; +begin + result:=(VarToInteger(v)<>0); +end; + +procedure TPHPSimpleLibrary._Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + ActiveFunctionName : string; +begin + if not VarIsEmpty(FRetValue) then + VarClear(FRetValue); + FParams := Parameters; + ActiveFunctionName := get_active_function_name(TSRMLS_DC); + TDispatchObject(FMethods.Objects[FMethods.IndexOf(ActiveFunctionName)]).Proc; + if not VarIsEmpty(FRetValue) then + ReturnValue := FRetValue; +end; + +procedure TPHPSimpleLibrary.RegisterMethod(AName: AnsiString; ADescription : AnsiString; + AProc: TDispatchProc; AParams: array of TParamType); +var + Func : TPHPFunction; + Param : TFunctionParam; + cnt : integer; + O : TDispatchObject; +begin + Func := TPHPFunction(Functions.Add); + Func.FunctionName := AnsiLowerCase(AName); + Func.Description := ADescription; + + for cnt := 0 to Length(AParams) - 1 do + begin + Param := TFunctionparam(Func.Parameters.Add); + Param.ParamType := AParams[cnt]; + end; + + Func.OnExecute := _Execute; + + O := TDispatchObject.Create; + O.Proc := Aproc; + + FMethods.AddObject(AName, O); +end; + +procedure TPHPSimpleLibrary.ReturnOutputArg(AValue: variant); +begin + FRetValue := AValue; +end; + +function TPHPSimpleLibrary.GetInputArg(AIndex: integer): variant; +begin + Result := FParams[AIndex].Value; +end; + +function TPHPSimpleLibrary.GetInputArgAsBoolean(AIndex: integer): boolean; +begin + Result := VarToBoolean(GetInputArg(AIndex)); +end; + +function TPHPSimpleLibrary.GetInputArgAsDateTime( + AIndex: integer): TDateTime; +begin + Result := VarToDateTime(GetInputArg(AIndex)); +end; + +function TPHPSimpleLibrary.GetInputArgAsFloat(AIndex: integer): double; +begin + Result := VarToFloat(GetInputArg(AIndex)); +end; + +function TPHPSimpleLibrary.GetInputArgAsInteger(AIndex: integer): integer; +begin + Result := VarToInteger(GetInputArg(AIndex)); +end; + +function TPHPSimpleLibrary.GetInputArgAsString(AIndex: integer): string; +begin + Result := VarToStr(GetInputArg(AIndex)); +end; + +constructor TPHPSimpleLibrary.Create(AOwner: TComponent); +begin + inherited; + FMethods := TStringList.Create; +end; + +destructor TPHPSimpleLibrary.Destroy; +var + cnt : integer; +begin + for cnt := 0 to FMethods.Count - 1 do + Fmethods.Objects[cnt].Free; + FMethods.Free; + inherited; +end; + end. \ No newline at end of file diff --git a/PHPProjectWizard.pas b/PHPProjectWizard.pas index 4580361..5033554 100644 --- a/PHPProjectWizard.pas +++ b/PHPProjectWizard.pas @@ -1,583 +1,583 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: PHPProjectWizard.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit PHPProjectWizard; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ToolsAPI, - {$IFDEF VERSION6} - DesignIntf, - DesignEditors, - DMForm, - {$ELSE} - dsgnintf, - dmdesigner, - {$ENDIF} - PHPModules; - -type - TPHPProjectWizard = class(TNotifierObject, IOTAWizard, - {$IFDEF VERSION10}IOTAREpositoryWizard, IOTARepositoryWizard60, - IOTARepositoryWizard80, {$ELSE}IOTARepositoryWizard, {$ENDIF} IOTAProjectWizard) - public - // IOTAWizard - function GetIDString: string; - function GetName: string; - function GetState: TWizardState; - procedure Execute; - // IOTARepositoryWizard - function GetAuthor: string; - function GetComment: string; - function GetPage: string; - {$IFDEF VERSION10} - function GetGalleryCategory: IOTAGalleryCategory; - function GetPersonality: string; - function GetDesigner: string; - {$ENDIF} - {$IFDEF VERSION6} - function GetGlyph : cardinal; - {$ELSE} - function GetGlyph: HICON; - {$ENDIF} - end; - - TPHPProjectCreator = class(TInterfacedObject, IOTACreator, IOTAProjectCreator {$IFDEF VERSION9},IOTAProjectCreator80{$ENDIF}) - public - // IOTACreator - function GetCreatorType: string; - function GetExisting: Boolean; - function GetFileSystem: string; - function GetOwner: IOTAModule; - function GetUnnamed: Boolean; - // IOTAProjectCreator - function GetFileName: string; - function GetOptionFileName: string; - function GetShowSource: Boolean; - procedure NewDefaultModule; - function NewOptionSource(const ProjectName: string): IOTAFile; - procedure NewProjectResource(const Project: IOTAProject); - function NewProjectSource(const ProjectName: string): IOTAFile; - {$IFDEF VERSION9} - function GetProjectPersonality: string; - procedure NewDefaultProjectModule(const Project: IOTAProject); - {$ENDIF} - end; - - TPHPProjectSourceFile = class(TInterfacedObject, IOTAFile) - private - FSource: string; - FProjectName : string; - public - function GetSource: string; - function GetAge: TDateTime; - constructor Create(const Source: string); - constructor CreateNamedProject(AProjectName : string); - end; - - - TPHPModuleCreator = class(TInterfacedObject, IOTACreator, IOTAModuleCreator) - public - // IOTACreator - function GetCreatorType: string; - function GetExisting: Boolean; - function GetFileSystem: string; - function GetOwner: IOTAModule; - function GetUnnamed: Boolean; - // IOTAModuleCreator - function GetAncestorName: string; - function GetImplFileName: string; - function GetIntfFileName: string; - function GetFormName: string; - function GetMainForm: Boolean; - function GetShowForm: Boolean; - function GetShowSource: Boolean; - function NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile; - function NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; - function NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; - procedure FormCreated(const FormEditor: IOTAFormEditor); - end; - - - TPHPExtensionSourceFile = class(TInterfacedObject, IOTAFile) - private - FSource: string; - public - function GetSource: string; - function GetAge: TDateTime; - constructor Create(const Source: string); - end; - -procedure Register; - -implementation - -{$R PHPProjectwizard.RES} - -const - CRLF = #13#10; - -procedure Register; -begin - RegisterPackageWizard(TPHPProjectWizard.Create); -end; - - -function GetActiveProjectGroup: IOTAProjectGroup; -var - ModuleServices: IOTAModuleServices; - i: Integer; - -begin - Result := nil; - ModuleServices := BorlandIDEServices as IOTAModuleServices; - for i := 0 to ModuleServices.ModuleCount - 1 do - if Succeeded(ModuleServices.Modules[i].QueryInterface(IOTAProjectGroup, Result)) then - Break; -end; - - -{ TPHPProjectWizard } - -{$IFDEF VERSION10} -function TPHPProjectWizard.GetGalleryCategory: IOTAGalleryCategory; -begin - Result := (BorlandIDEServices as IOTAGalleryCategoryManager).FindCategory(sCategoryDelphiNew); -end; - -function TPHPProjectWizard.GetPersonality: string; -begin - Result := sDelphiPersonality; -end; - -function TPHPProjectWizard.GetDesigner : string; -begin - Result := dVCL; -end; - -{$ENDIF} - -procedure TPHPProjectWizard.Execute; - -begin - try - (BorlandIDEServices as IOTAModuleServices).CreateModule(TPHPProjectCreator.Create as {$IFDEF VERSION9}IOTAProjectCreator80{$ELSE}IOTAProjectCreator{$ENDIF}); - (BorlandIDEServices as IOTAModuleServices).CreateModule(TPHPModuleCreator.Create as IOTAModuleCreator ); - except - MessageDlg('PHP Project Wizard error while generate'+#13+#10+'project''s sources.', mtError, [mbOK], 0); - end; -end; - -function TPHPProjectWizard.GetAuthor: string; -begin - Result := 'Perevoznyk'; -end; - -function TPHPProjectWizard.GetComment: string; -begin - Result := 'PHP Project Creator'; -end; - -{$IFDEF VERSION6} -function TPHPProjectWizard.GetGlyph: cardinal; -{$ELSE} -function TPHPProjectWizard.GetGlyph: HICON; -{$ENDIF} -begin - Result := LoadIcon(hInstance, 'PHPWIZARDICO'); -end; - -function TPHPProjectWizard.GetIDString: string; -begin - Result := '{74D480FC-0608-4D34-AEA6-643728BD3CB9}'; -end; - -function TPHPProjectWizard.GetName: string; -begin - Result := 'PHP Extension'; -end; - -function TPHPProjectWizard.GetPage: string; -begin - {$IFDEF VERSION10} - Result := 'Delphi Files'; - {$ELSE} - Result := 'New'; - {$ENDIF} -end; - -function TPHPProjectWizard.GetState: TWizardState; -begin - Result := [wsEnabled]; -end; - - - -{ TPHPProjectCreator } - -function TPHPProjectCreator.GetCreatorType: string; -begin - Result := sLibrary; -end; - -function TPHPProjectCreator.GetExisting: Boolean; -begin - Result := False; // Create a new project -end; - -function TPHPProjectCreator.GetFileName: string; -{$IFNDEF VERSION9} -var - i: Integer; - j: Integer; - ProjGroup: IOTAProjectGroup; - Found: Boolean; - TempFileName: string; - TempFileName2: string; -{$ENDIF} -begin -{$IFDEF VERSION9} - Result := ''; -{$ELSE} - - - Result := GetCurrentDir + '\' + 'Project%d' + '.dpr'; { do not localize } - - ProjGroup := GetActiveProjectGroup; - - if ProjGroup <> nil then - begin - for j := 0 to ProjGroup.ProjectCount-1 do - begin - Found := False; - TempFileName2 := Format(Result, [j+1]); - - for i := 0 to ProjGroup.ProjectCount-1 do - begin - try - TempFileName := ProjGroup.Projects[i].FileName; - if AnsiCompareFileName(ExtractFileName(TempFileName), ExtractFileName(TempFileName2)) = 0 then - begin - Found := True; - Break; - end; - except on E: Exception do - if not (E is EIntfCastError) then - raise; - end; - end; - - if not Found then - begin - Result := TempFileName2; - Exit; - end; - end; - Result := Format(Result, [ProjGroup.ProjectCount+1]); - end - else - Result := Format(Result, [1]); -{$ENDIF} -end; - -function TPHPProjectCreator.GetFileSystem: string; -begin - Result := ''; // Default -end; - -function TPHPProjectCreator.GetOptionFileName: string; -begin - Result := ''; // Default -end; - - -function TPHPProjectCreator.GetOwner: IOTAModule; -begin - Result := GetActiveProjectGroup; -end; - - -{$IFDEF VERSION9} -function TPHPProjectCreator.GetProjectPersonality: string; -begin - Result := sDelphiPersonality; -end; -{$ENDIF} - -function TPHPProjectCreator.GetShowSource: Boolean; -begin - Result := True; // Show the source in the editor -end; - -function TPHPProjectCreator.GetUnnamed: Boolean; -begin - Result := True; // Project needs to be named/saved -end; - -procedure TPHPProjectCreator.NewDefaultModule; -begin -end; - - -{$IFDEF VERSION9} -procedure TPHPProjectCreator.NewDefaultProjectModule( - const Project: IOTAProject); -begin - NewDefaultModule; -end; -{$ENDIF} - -function TPHPProjectCreator.NewOptionSource(const ProjectName: string): IOTAFile; -begin - Result := nil; // For BCB only -end; - -procedure TPHPProjectCreator.NewProjectResource(const Project: IOTAProject); -begin - // No resources needed -end; - -function TPHPProjectCreator.NewProjectSource(const ProjectName: string): IOTAFile; -begin - Result := TPHPProjectSourceFile.CreateNamedProject(ProjectName) as IOTAFile; -end; - - -{ TPHPProjectSourceFile } - -constructor TPHPProjectSourceFile.Create(const Source: string); -begin - FSource := Source; -end; - -constructor TPHPProjectSourceFile.CreateNamedProject(AProjectName: string); -begin - inherited Create; - FProjectName := AProjectName; -end; - -function TPHPProjectSourceFile.GetAge: TDateTime; -begin - Result := -1; -end; - -function TPHPProjectSourceFile.GetSource: string; -var - ProjectSource : string; -begin - ProjectSource := - 'library '+FProjectName+';' + CRLF + - CRLF + - 'uses' + CRLF + - ' Windows,'+ CRLF + - ' SysUtils,'+ CRLF + - ' phpApp,' + CRLF + - ' phpModules;'+ CRLF; - - ProjectSource := ProjectSource + - CRLF+ - '{$R *.RES}' + CRLF + - CRLF + - 'begin' + CRLF + - ' Application.Initialize;' + CRLF + - ' Application.Run;' + CRLF + - 'end.'; - Result := ProjectSource; -end; - -{ TPHPModuleCreator } - -procedure TPHPModuleCreator.FormCreated(const FormEditor: IOTAFormEditor); -begin - // Nothing -end; - -function TPHPModuleCreator.GetAncestorName: string; -begin - Result := 'PHPExtension'; -end; - -function TPHPModuleCreator.GetCreatorType: string; -begin - // Return sUnit or sText as appropriate - Result := sForm; -end; - -function TPHPModuleCreator.GetExisting: Boolean; -begin - Result := False; -end; - -function TPHPModuleCreator.GetFileSystem: string; -begin - Result := ''; -end; - -function TPHPModuleCreator.GetFormName: string; -begin - Result := ''; -end; - -function TPHPModuleCreator.GetImplFileName: string; -begin - Result := ''; -end; - -function TPHPModuleCreator.GetIntfFileName: string; -begin - Result := ''; -end; - -function TPHPModuleCreator.GetMainForm: Boolean; -begin - Result := False; -end; - -function TPHPModuleCreator.GetOwner: IOTAModule; -{$IFNDEF VERSION9} -var - ModuleServices: IOTAModuleServices; - Module: IOTAModule; - NewModule: IOTAModule; -{$ENDIF} -begin -{$IFDEF VERSION9} - Result := nil; -{$ELSE} - - - // You may prefer to return the project group's ActiveProject instead - Result := nil; - ModuleServices := (BorlandIDEServices as IOTAModuleServices); - Module := ModuleServices.CurrentModule; - - if Module <> nil then - begin - if Module.QueryInterface(IOTAProject, NewModule) = S_OK then - Result := NewModule - - {$IFDEF VERSION5ONLY} // Delphi 5 - else if Module.GetOwnerCount > 0 then - begin - NewModule := Module.GetOwner(0); - {$ELSE} // Delphi 6+ - else if Module.OwnerModuleCount > 0 then - begin - NewModule := Module.OwnerModules[0]; - {$ENDIF} - if NewModule <> nil then - if NewModule.QueryInterface(IOTAProject, Result) <> S_OK then - Result := nil; - end; - end; -{$ENDIF} -end; - -function TPHPModuleCreator.GetShowForm: Boolean; -begin - Result := True; -end; - -function TPHPModuleCreator.GetShowSource: Boolean; -begin - Result := True; -end; - -function TPHPModuleCreator.GetUnnamed: Boolean; -begin - Result := True; -end; - -function TPHPModuleCreator.NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile; -begin - Result := nil; -end; - -function TPHPModuleCreator.NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; -var - Form, - Ancestor : string; - st : string; -begin - Form := FormIdent; - Ancestor := AncestorIdent; - - St:= 'unit ' + ModuleIdent + ';' + CRLF + CRLF + - 'interface' + CRLF + CRLF + - 'uses' + CRLF + - ' Windows,' + CRLF + - ' Messages,' + CRLF + - ' SysUtils,' + CRLF + - ' Classes,' + CRLF + - ' Forms,' + CRLF + - ' zendTypes,'+ CRLF + - ' zendAPI,' + CRLF + - ' phpTypes,' + CRLF + - ' phpAPI,' + CRLF + - ' phpFunctions,' + CRLF + - ' PHPModules;' + CRLF + CRLF + - 'type' + CRLF + CRLF + - ' T' + Form + ' = class(T' + Ancestor + ')' + CRLF + - ' private' + CRLF + - ' { Private declarations }' + CRLF + - ' public' + CRLF + - ' { Public declarations }' + CRLF + - ' end;' + CRLF + CRLF + - 'var' + CRLF + - ' ' +Form + ': T' + Form + ';'+ CRLF + CRLF + - 'implementation' + CRLF + CRLF + - '{$R *.DFM}' + CRLF + CRLF + - 'end.' ; - Result := TPHPExtensionSourceFile.Create(St); -end; - -function TPHPModuleCreator.NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; -begin - Result := nil; -end; - - -constructor TPHPExtensionSourceFile.Create(const Source: string); -begin - FSource := Source; -end; - -function TPHPExtensionSourceFile.GetAge: TDateTime; -begin - Result := -1; -end; - -function TPHPExtensionSourceFile.GetSource: string; -begin - Result := FSource; -end; - - -{ RegisterContainerModule } -procedure RegisterContainerModule; -begin - {$IFDEF VERSION5ONLY} - RegisterCustomModule(TPHPExtension, TDataModuleDesignerCustomModule); - {$ELSE} - RegisterCustomModule(TPHPExtension, TDataModuleCustomModule); - {$ENDIF} -end; - -Initialization - RegisterContainerModule(); - -Finalization - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: PHPProjectWizard.pas,v 7.4 10/2009 delphi32 Exp $ } +{$I PHP.inc} +unit PHPProjectWizard; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ToolsAPI, + {$IFDEF VERSION6} + DesignIntf, + DesignEditors, + DMForm, + {$ELSE} + dsgnintf, + dmdesigner, + {$ENDIF} + PHPModules; + +type + TPHPProjectWizard = class(TNotifierObject, IOTAWizard, + {$IFDEF VERSION10}IOTAREpositoryWizard, IOTARepositoryWizard60, + IOTARepositoryWizard80, {$ELSE}IOTARepositoryWizard, {$ENDIF} IOTAProjectWizard) + public + // IOTAWizard + function GetIDString: string; + function GetName: string; + function GetState: TWizardState; + procedure Execute; + // IOTARepositoryWizard + function GetAuthor: string; + function GetComment: string; + function GetPage: string; + {$IFDEF VERSION10} + function GetGalleryCategory: IOTAGalleryCategory; + function GetPersonality: string; + function GetDesigner: string; + {$ENDIF} + {$IFDEF VERSION6} + function GetGlyph : cardinal; + {$ELSE} + function GetGlyph: HICON; + {$ENDIF} + end; + + TPHPProjectCreator = class(TInterfacedObject, IOTACreator, IOTAProjectCreator {$IFDEF VERSION9},IOTAProjectCreator80{$ENDIF}) + public + // IOTACreator + function GetCreatorType: string; + function GetExisting: Boolean; + function GetFileSystem: string; + function GetOwner: IOTAModule; + function GetUnnamed: Boolean; + // IOTAProjectCreator + function GetFileName: string; + function GetOptionFileName: string; + function GetShowSource: Boolean; + procedure NewDefaultModule; + function NewOptionSource(const ProjectName: string): IOTAFile; + procedure NewProjectResource(const Project: IOTAProject); + function NewProjectSource(const ProjectName: string): IOTAFile; + {$IFDEF VERSION9} + function GetProjectPersonality: string; + procedure NewDefaultProjectModule(const Project: IOTAProject); + {$ENDIF} + end; + + TPHPProjectSourceFile = class(TInterfacedObject, IOTAFile) + private + FSource: string; + FProjectName : string; + public + function GetSource: string; + function GetAge: TDateTime; + constructor Create(const Source: string); + constructor CreateNamedProject(AProjectName : string); + end; + + + TPHPModuleCreator = class(TInterfacedObject, IOTACreator, IOTAModuleCreator) + public + // IOTACreator + function GetCreatorType: string; + function GetExisting: Boolean; + function GetFileSystem: string; + function GetOwner: IOTAModule; + function GetUnnamed: Boolean; + // IOTAModuleCreator + function GetAncestorName: string; + function GetImplFileName: string; + function GetIntfFileName: string; + function GetFormName: string; + function GetMainForm: Boolean; + function GetShowForm: Boolean; + function GetShowSource: Boolean; + function NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile; + function NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; + function NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; + procedure FormCreated(const FormEditor: IOTAFormEditor); + end; + + + TPHPExtensionSourceFile = class(TInterfacedObject, IOTAFile) + private + FSource: string; + public + function GetSource: string; + function GetAge: TDateTime; + constructor Create(const Source: string); + end; + +procedure Register; + +implementation + +{$R PHPProjectwizard.RES} + +const + CRLF = #13#10; + +procedure Register; +begin + RegisterPackageWizard(TPHPProjectWizard.Create); +end; + + +function GetActiveProjectGroup: IOTAProjectGroup; +var + ModuleServices: IOTAModuleServices; + i: Integer; + +begin + Result := nil; + ModuleServices := BorlandIDEServices as IOTAModuleServices; + for i := 0 to ModuleServices.ModuleCount - 1 do + if Succeeded(ModuleServices.Modules[i].QueryInterface(IOTAProjectGroup, Result)) then + Break; +end; + + +{ TPHPProjectWizard } + +{$IFDEF VERSION10} +function TPHPProjectWizard.GetGalleryCategory: IOTAGalleryCategory; +begin + Result := (BorlandIDEServices as IOTAGalleryCategoryManager).FindCategory(sCategoryDelphiNew); +end; + +function TPHPProjectWizard.GetPersonality: string; +begin + Result := sDelphiPersonality; +end; + +function TPHPProjectWizard.GetDesigner : string; +begin + Result := dVCL; +end; + +{$ENDIF} + +procedure TPHPProjectWizard.Execute; + +begin + try + (BorlandIDEServices as IOTAModuleServices).CreateModule(TPHPProjectCreator.Create as {$IFDEF VERSION9}IOTAProjectCreator80{$ELSE}IOTAProjectCreator{$ENDIF}); + (BorlandIDEServices as IOTAModuleServices).CreateModule(TPHPModuleCreator.Create as IOTAModuleCreator ); + except + MessageDlg('PHP Project Wizard error while generate'+#13+#10+'project''s sources.', mtError, [mbOK], 0); + end; +end; + +function TPHPProjectWizard.GetAuthor: string; +begin + Result := 'Perevoznyk'; +end; + +function TPHPProjectWizard.GetComment: string; +begin + Result := 'PHP Project Creator'; +end; + +{$IFDEF VERSION6} +function TPHPProjectWizard.GetGlyph: cardinal; +{$ELSE} +function TPHPProjectWizard.GetGlyph: HICON; +{$ENDIF} +begin + Result := LoadIcon(hInstance, 'PHPWIZARDICO'); +end; + +function TPHPProjectWizard.GetIDString: string; +begin + Result := '{74D480FC-0608-4D34-AEA6-643728BD3CB9}'; +end; + +function TPHPProjectWizard.GetName: string; +begin + Result := 'PHP Extension'; +end; + +function TPHPProjectWizard.GetPage: string; +begin + {$IFDEF VERSION10} + Result := 'Delphi Files'; + {$ELSE} + Result := 'New'; + {$ENDIF} +end; + +function TPHPProjectWizard.GetState: TWizardState; +begin + Result := [wsEnabled]; +end; + + + +{ TPHPProjectCreator } + +function TPHPProjectCreator.GetCreatorType: string; +begin + Result := sLibrary; +end; + +function TPHPProjectCreator.GetExisting: Boolean; +begin + Result := False; // Create a new project +end; + +function TPHPProjectCreator.GetFileName: string; +{$IFNDEF VERSION9} +var + i: Integer; + j: Integer; + ProjGroup: IOTAProjectGroup; + Found: Boolean; + TempFileName: string; + TempFileName2: string; +{$ENDIF} +begin +{$IFDEF VERSION9} + Result := ''; +{$ELSE} + + + Result := GetCurrentDir + '\' + 'Project%d' + '.dpr'; { do not localize } + + ProjGroup := GetActiveProjectGroup; + + if ProjGroup <> nil then + begin + for j := 0 to ProjGroup.ProjectCount-1 do + begin + Found := False; + TempFileName2 := Format(Result, [j+1]); + + for i := 0 to ProjGroup.ProjectCount-1 do + begin + try + TempFileName := ProjGroup.Projects[i].FileName; + if {$IF PHP560}CompareFileName{$ELSE}AnsiCompareFileName{$ENDIF}(ExtractFileName(TempFileName), ExtractFileName(TempFileName2)) = 0 then + begin + Found := True; + Break; + end; + except on E: Exception do + if not (E is EIntfCastError) then + raise; + end; + end; + + if not Found then + begin + Result := TempFileName2; + Exit; + end; + end; + Result := Format(Result, [ProjGroup.ProjectCount+1]); + end + else + Result := Format(Result, [1]); +{$ENDIF} +end; + +function TPHPProjectCreator.GetFileSystem: string; +begin + Result := ''; // Default +end; + +function TPHPProjectCreator.GetOptionFileName: string; +begin + Result := ''; // Default +end; + + +function TPHPProjectCreator.GetOwner: IOTAModule; +begin + Result := GetActiveProjectGroup; +end; + + +{$IFDEF VERSION9} +function TPHPProjectCreator.GetProjectPersonality: string; +begin + Result := sDelphiPersonality; +end; +{$ENDIF} + +function TPHPProjectCreator.GetShowSource: Boolean; +begin + Result := True; // Show the source in the editor +end; + +function TPHPProjectCreator.GetUnnamed: Boolean; +begin + Result := True; // Project needs to be named/saved +end; + +procedure TPHPProjectCreator.NewDefaultModule; +begin +end; + + +{$IFDEF VERSION9} +procedure TPHPProjectCreator.NewDefaultProjectModule( + const Project: IOTAProject); +begin + NewDefaultModule; +end; +{$ENDIF} + +function TPHPProjectCreator.NewOptionSource(const ProjectName: string): IOTAFile; +begin + Result := nil; // For BCB only +end; + +procedure TPHPProjectCreator.NewProjectResource(const Project: IOTAProject); +begin + // No resources needed +end; + +function TPHPProjectCreator.NewProjectSource(const ProjectName: string): IOTAFile; +begin + Result := TPHPProjectSourceFile.CreateNamedProject(ProjectName) as IOTAFile; +end; + + +{ TPHPProjectSourceFile } + +constructor TPHPProjectSourceFile.Create(const Source: string); +begin + FSource := Source; +end; + +constructor TPHPProjectSourceFile.CreateNamedProject(AProjectName: string); +begin + inherited Create; + FProjectName := AProjectName; +end; + +function TPHPProjectSourceFile.GetAge: TDateTime; +begin + Result := -1; +end; + +function TPHPProjectSourceFile.GetSource: string; +var + ProjectSource : string; +begin + ProjectSource := + 'library '+FProjectName+';' + CRLF + + CRLF + + 'uses' + CRLF + + ' Windows,'+ CRLF + + ' SysUtils,'+ CRLF + + ' phpApp,' + CRLF + + ' phpModules;'+ CRLF; + + ProjectSource := ProjectSource + + CRLF+ + '{$R *.RES}' + CRLF + + CRLF + + 'begin' + CRLF + + ' Application.Initialize;' + CRLF + + ' Application.Run;' + CRLF + + 'end.'; + Result := ProjectSource; +end; + +{ TPHPModuleCreator } + +procedure TPHPModuleCreator.FormCreated(const FormEditor: IOTAFormEditor); +begin + // Nothing +end; + +function TPHPModuleCreator.GetAncestorName: string; +begin + Result := 'PHPExtension'; +end; + +function TPHPModuleCreator.GetCreatorType: string; +begin + // Return sUnit or sText as appropriate + Result := sForm; +end; + +function TPHPModuleCreator.GetExisting: Boolean; +begin + Result := False; +end; + +function TPHPModuleCreator.GetFileSystem: string; +begin + Result := ''; +end; + +function TPHPModuleCreator.GetFormName: string; +begin + Result := ''; +end; + +function TPHPModuleCreator.GetImplFileName: string; +begin + Result := ''; +end; + +function TPHPModuleCreator.GetIntfFileName: string; +begin + Result := ''; +end; + +function TPHPModuleCreator.GetMainForm: Boolean; +begin + Result := False; +end; + +function TPHPModuleCreator.GetOwner: IOTAModule; +{$IFNDEF VERSION9} +var + ModuleServices: IOTAModuleServices; + Module: IOTAModule; + NewModule: IOTAModule; +{$ENDIF} +begin +{$IFDEF VERSION9} + Result := nil; +{$ELSE} + + + // You may prefer to return the project group's ActiveProject instead + Result := nil; + ModuleServices := (BorlandIDEServices as IOTAModuleServices); + Module := ModuleServices.CurrentModule; + + if Module <> nil then + begin + if Module.QueryInterface(IOTAProject, NewModule) = S_OK then + Result := NewModule + + {$IFDEF VERSION5ONLY} // Delphi 5 + else if Module.GetOwnerCount > 0 then + begin + NewModule := Module.GetOwner(0); + {$ELSE} // Delphi 6+ + else if Module.OwnerModuleCount > 0 then + begin + NewModule := Module.OwnerModules[0]; + {$ENDIF} + if NewModule <> nil then + if NewModule.QueryInterface(IOTAProject, Result) <> S_OK then + Result := nil; + end; + end; +{$ENDIF} +end; + +function TPHPModuleCreator.GetShowForm: Boolean; +begin + Result := True; +end; + +function TPHPModuleCreator.GetShowSource: Boolean; +begin + Result := True; +end; + +function TPHPModuleCreator.GetUnnamed: Boolean; +begin + Result := True; +end; + +function TPHPModuleCreator.NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile; +begin + Result := nil; +end; + +function TPHPModuleCreator.NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; +var + Form, + Ancestor : string; + st : string; +begin + Form := FormIdent; + Ancestor := AncestorIdent; + + St:= 'unit ' + ModuleIdent + ';' + CRLF + CRLF + + 'interface' + CRLF + CRLF + + 'uses' + CRLF + + ' Windows,' + CRLF + + ' Messages,' + CRLF + + ' SysUtils,' + CRLF + + ' Classes,' + CRLF + + ' Forms,' + CRLF + + ' zendTypes,'+ CRLF + + ' zendAPI,' + CRLF + + ' phpTypes,' + CRLF + + ' phpAPI,' + CRLF + + ' phpFunctions,' + CRLF + + ' PHPModules;' + CRLF + CRLF + + 'type' + CRLF + CRLF + + ' T' + Form + ' = class(T' + Ancestor + ')' + CRLF + + ' private' + CRLF + + ' { Private declarations }' + CRLF + + ' public' + CRLF + + ' { Public declarations }' + CRLF + + ' end;' + CRLF + CRLF + + 'var' + CRLF + + ' ' +Form + ': T' + Form + ';'+ CRLF + CRLF + + 'implementation' + CRLF + CRLF + + '{$R *.DFM}' + CRLF + CRLF + + 'end.' ; + Result := TPHPExtensionSourceFile.Create(St); +end; + +function TPHPModuleCreator.NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; +begin + Result := nil; +end; + + +constructor TPHPExtensionSourceFile.Create(const Source: string); +begin + FSource := Source; +end; + +function TPHPExtensionSourceFile.GetAge: TDateTime; +begin + Result := -1; +end; + +function TPHPExtensionSourceFile.GetSource: string; +begin + Result := FSource; +end; + + +{ RegisterContainerModule } +procedure RegisterContainerModule; +begin + {$IFDEF VERSION5ONLY} + RegisterCustomModule(TPHPExtension, TDataModuleDesignerCustomModule); + {$ELSE} + RegisterCustomModule(TPHPExtension, TDataModuleCustomModule); + {$ENDIF} +end; + +Initialization + RegisterContainerModule(); + +Finalization + end. \ No newline at end of file diff --git a/PHPTypes.pas b/PHPTypes.pas index 6674f0f..6ee9d44 100644 --- a/PHPTypes.pas +++ b/PHPTypes.pas @@ -1,411 +1,441 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpTypes.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit PHPTypes; - -interface - -uses - Windows, ZENDTypes; - -{$IFDEF PHP4} -const - phpVersion = 4; -{$ELSE} -const - phpVersion = 5; -{$ENDIF} - -const - TRequestName : array [0..3] of string = - ('GET', - 'PUT', - 'POST', - 'HEAD'); - - -const - // connection status states - PHP_CONNECTION_NORMAL = 0; - PHP_CONNECTION_ABORTED = 1; - PHP_CONNECTION_TIMEOUT = 2; - - PARSE_POST = 0; - PARSE_GET = 1; - PARSE_COOKIE = 2; - PARSE_STRING = 3; - -const - SAPI_HEADER_ADD = (1 shl 0); - SAPI_HEADER_DELETE_ALL = (1 shl 1); - SAPI_HEADER_SEND_NOW = (1 shl 2); - SAPI_HEADER_SENT_SUCCESSFULLY = 1; - SAPI_HEADER_DO_SEND = 2; - SAPI_HEADER_SEND_FAILED = 3; - SAPI_DEFAULT_MIMETYPE = 'text/html'; - SAPI_DEFAULT_CHARSET = ''; - SAPI_PHP_VERSION_HEADER = 'X-Powered-By: PHP'; - - -const - short_track_vars_names : array [0..5] of string = - ('_POST', - '_GET', - '_COOKIE', - '_SERVER', - '_ENV', - '_FILES' ); - - -const - PHP_ENTRY_NAME_COLOR = '#ccccff'; - PHP_CONTENTS_COLOR = '#cccccc'; - PHP_HEADER_COLOR = '#9999cc'; - PHP_INFO_GENERAL = (1 shl 0); - PHP_INFO_CREDITS = (1 shl 1); - PHP_INFO_CONFIGURATION = (1 shl 2); - PHP_INFO_MODULES = (1 shl 3); - PHP_INFO_ENVIRONMENT = (1 shl 4); - PHP_INFO_VARIABLES = (1 shl 5); - PHP_INFO_LICENSE = (1 shl 6); - PHP_INFO_ALL = $FFFFFFFF; - PHP_CREDITS_GROUP = (1 shl 0); - PHP_CREDITS_GENERAL = (1 shl 1); - PHP_CREDITS_SAPI = (1 shl 2); - PHP_CREDITS_MODULES = (1 shl 3); - PHP_CREDITS_DOCS = (1 shl 4); - PHP_CREDITS_FULLPAGE = (1 shl 5); - PHP_CREDITS_QA = (1 shl 6); - PHP_CREDITS_WEB = (1 shl 7); - PHP_CREDITS_ALL = $FFFFFFFF; - PHP_LOGO_GUID = 'PHPE9568F34-D428-11d2-A769-00AA001ACF42'; - PHP_EGG_LOGO_GUID = 'PHPE9568F36-D428-11d2-A769-00AA001ACF42'; - ZEND_LOGO_GUID = 'PHPE9568F35-D428-11d2-A769-00AA001ACF42'; - PHP_CREDITS_GUID = 'PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000'; - - -const - ENT_HTML_QUOTE_NONE = 0; - ENT_HTML_QUOTE_SINGLE = 1; - ENT_HTML_QUOTE_DOUBLE = 2; - ENT_COMPAT = ENT_HTML_QUOTE_DOUBLE; - ENT_QUOTES = (ENT_HTML_QUOTE_DOUBLE or ENT_HTML_QUOTE_SINGLE); - ENT_NOQUOTES = ENT_HTML_QUOTE_NONE; - - -const - PHP_INI_USER = ZEND_INI_USER; - PHP_INI_PERDIR = ZEND_INI_PERDIR; - PHP_INI_SYSTEM = ZEND_INI_SYSTEM; - PHP_INI_ALL = ZEND_INI_ALL; - PHP_INI_DISPLAY_ORIG = ZEND_INI_DISPLAY_ORIG; - PHP_INI_DISPLAY_ACTIVE = ZEND_INI_DISPLAY_ACTIVE; - PHP_INI_STAGE_STARTUP = ZEND_INI_STAGE_STARTUP; - PHP_INI_STAGE_SHUTDOWN = ZEND_INI_STAGE_SHUTDOWN; - PHP_INI_STAGE_ACTIVATE = ZEND_INI_STAGE_ACTIVATE; - PHP_INI_STAGE_DEACTIVATE = ZEND_INI_STAGE_DEACTIVATE; - PHP_INI_STAGE_RUNTIME = ZEND_INI_STAGE_RUNTIME; - -const - TRACK_VARS_POST = 0; - TRACK_VARS_GET = 1; - TRACK_VARS_COOKIE = 2; - TRACK_VARS_SERVER = 3; - TRACK_VARS_ENV = 4; - TRACK_VARS_FILES = 5; - -type - error_handling_t = (EH_NORMAL, EH_SUPPRESS, EH_THROW); - - -type - TRequestType = (rtGet, rtPut, rtPost, rtHead); - -type - Psapi_header_struct = ^Tsapi_header_struct; - sapi_header_struct = - record - header : PChar; - header_len : uint; - replace : zend_bool; - end; - Tsapi_header_struct = sapi_header_struct; - - Psapi_headers_struct = ^Tsapi_headers_struct; - sapi_headers_struct = - record - headers : zend_llist; - http_response_code : Integer; - send_default_content_type : Byte; - mimetype : PChar; - http_status_line : PChar; - end; - Tsapi_headers_struct = sapi_headers_struct; - - - Psapi_post_entry = ^Tsapi_post_entry; - sapi_post_entry = - record - content_type : PChar; - content_type_len : uint; - post_reader : pointer; //void (*post_reader)(TSRMLS_D); - post_handler : pointer; //void (*post_handler)(char *content_type_dup, void *arg TSRMLS_DC); - end; - Tsapi_post_entry = sapi_post_entry; - -{* Some values in this structure needs to be filled in before - * calling sapi_activate(). We WILL change the `char *' entries, - * so make sure that you allocate a separate buffer for them - * and that you free them after sapi_deactivate(). - *} - - Psapi_request_info = ^Tsapi_request_info; - sapi_request_info = - record - request_method : PChar; - query_string : PChar; - post_data : PChar; - raw_post_data : PChar; - cookie_data : PChar; - content_length : Longint; - post_data_length : uint; - raw_post_data_length : uint; - path_translated : PChar; - request_uri : PChar; - content_type : PChar; - headers_only : zend_bool; - no_headers : zend_bool; - {$IFDEF PHP5} - headers_read : zend_bool; - {$ENDIF} - post_entry : PSapi_post_entry; - content_type_dup : PChar; - //for HTTP authentication - auth_user : PChar; - auth_password : PChar; - {$IFDEF PHP510} - auth_digest : PChar; - {$ENDIF} - //this is necessary for the CGI SAPI module - argv0 : PChar; - //this is necessary for Safe Mode - current_user : PChar; - current_user_length : Integer; - //this is necessary for CLI module - argc : Integer; - argv : ^PChar; - {$IFDEF PHP510} - proto_num : integer; - {$ENDIF} - end; - Tsapi_request_info = sapi_request_info; - - Psapi_header_line = ^Tsapi_header_line; - sapi_header_line = - record - line : PChar; - line_len : uint; - response_code : Longint; - end; - Tsapi_header_line = sapi_header_line; - - Psapi_globals_struct = ^Tsapi_globals_struct; - _sapi_globals_struct = - record - server_context : Pointer; - request_info : sapi_request_info; - sapi_headers : sapi_headers_struct; - read_post_bytes : Integer; - headers_sent : Byte; - global_stat : stat; - default_mimetype : PChar; - default_charset : PChar; - rfc1867_uploaded_files : PHashTable; - post_max_size : Longint; - options : Integer; - {$IFDEF PHP5} - sapi_started : zend_bool; - {$IFDEF PHP510} - global_request_time : longint; - known_post_content_types : THashTable; - {$ENDIF} - {$ENDIF} - end; - Tsapi_globals_struct = _sapi_globals_struct; - - - Psapi_module_struct = ^Tsapi_module_struct; - - TModuleShutdownFunc = function (globals : pointer) : Integer; cdecl; - TModuleStartupFunc = function (sapi_module : psapi_module_struct) : integer; cdecl; - - sapi_module_struct = - record - name : PChar; - pretty_name : PChar; - startup : TModuleStartupFunc; //int (*startup)(struct _sapi_module_struct *sapi_module); - shutdown : TModuleShutdownFunc; //int (*shutdown)(struct _sapi_module_struct *sapi_module); - activate : pointer; - deactivate : pointer; - ub_write : pointer; - flush : pointer; - stat : pointer; - getenv : pointer; - sapi_error : pointer; - header_handler : pointer; - send_headers : pointer; - send_header : pointer; - read_post : pointer; - read_cookies : pointer; - register_server_variables : pointer; - log_message : pointer; - {$IFDEF PHP5} - {$IFDEF PHP510} - get_request_time : pointer; - {$ENDIF} - {$ENDIF} - php_ini_path_override : PChar; - block_interruptions : pointer; - unblock_interruptions : pointer; - default_post_reader : pointer; - treat_data : pointer; - executable_location : PChar; - php_ini_ignore : Integer; - {******************************} - {IMPORTANT: } - {Please check your php version } - {******************************} - {$IFDEF PHP4} - {$IFDEF PHP433} - get_fd : pointer; - force_http_10 : pointer; - get_target_uid : pointer; - get_target_gid : pointer; - ini_defaults : pointer; - phpinfo_as_text : integer; - {$ENDIF} - {$ENDIF} - {$IFDEF PHP5} - get_fd : pointer; - force_http_10 : pointer; - get_target_uid : pointer; - get_target_gid : pointer; - input_filter : pointer; - ini_defaults : pointer; - phpinfo_as_text : integer; - {$ENDIF} - end; - Tsapi_module_struct = sapi_module_struct; - - -type - PPHP_URL = ^TPHP_URL; - Tphp_url = - record - scheme : PChar; - user : PChar; - pass : PChar; - host : PChar; - port : Smallint; - path : PChar; - query : PChar; - fragment : PChar; - end; - - -type - arg_separators = - record - output : PChar; - input : PChar; - end; - -type - Pphp_Core_Globals = ^TPHP_core_globals; - Tphp_core_globals = - record - magic_quotes_gpc : zend_bool; - magic_quotes_runtime : zend_bool; - magic_quotes_sybase : zend_bool; - safe_mode : zend_bool; - allow_call_time_pass_reference : boolean; - implicit_flush : boolean; - output_buffering : Integer; - safe_mode_include_dir : PChar; - safe_mode_gid : boolean; - sql_safe_mode : boolean; - enable_dl :boolean; - output_handler : PChar; - unserialize_callback_func : PChar; - safe_mode_exec_dir : PChar; - memory_limit : Longint; - max_input_time : Longint; - track_errors : boolean; - display_errors : boolean; - display_startup_errors : boolean; - log_errors : boolean; - log_errors_max_len : Longint; - ignore_repeated_errors : boolean; - ignore_repeated_source : boolean; - report_memleaks : boolean; - error_log : PChar; - doc_root : PChar; - user_dir : PChar; - include_path : PChar; - open_basedir : PChar; - extension_dir : PChar; - upload_tmp_dir : PChar; - upload_max_filesize : Longint; - error_append_string : PChar; - error_prepend_string : PChar; - auto_prepend_file : PChar; - auto_append_file : PChar; - arg_separator : arg_separators; - gpc_order : PChar; - variables_order : PChar; - rfc1867_protected_variables : THashTable; - connection_status : Smallint; - ignore_user_abort : Smallint; - header_is_being_sent : Byte; - tick_functions : zend_llist; - http_globals : array[0..5] of pzval; - expose_php : boolean; - register_globals : boolean; - register_argc_argv : boolean; - y2k_compliance : boolean; - docref_root : PChar; - docref_ext : PChar; - html_errors : boolean; - xmlrpc_errors : boolean; - xmlrpc_error_number : Longint; - modules_activated : boolean; - file_uploads : boolean; - during_request_startup : boolean; - allow_url_fopen : boolean; - always_populate_raw_post_data : boolean; - {$IFDEF PHP510} - report_zend_debug : boolean; - last_error_message : PChar; - last_error_file : pchar; - last_error_lineno : integer; - error_handling : error_handling_t; - exception_class : Pointer; - disable_functions : PChar; - disable_classes : PChar; - {$ENDIF} - end; - -implementation - -end. - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: phpTypes.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit PHPTypes; + +interface + +uses + Windows, ZENDTypes; + +{$IFDEF PHP4} +const + phpVersion = 4; +{$ELSE} +const + phpVersion = 5; +{$ENDIF} + +const + TRequestName : array [0..3] of AnsiString = + ('GET', + 'PUT', + 'POST', + 'HEAD'); + + +const + // connection status states + PHP_CONNECTION_NORMAL = 0; + PHP_CONNECTION_ABORTED = 1; + PHP_CONNECTION_TIMEOUT = 2; + + PARSE_POST = 0; + PARSE_GET = 1; + PARSE_COOKIE = 2; + PARSE_STRING = 3; + +const + SAPI_HEADER_ADD = (1 shl 0); + SAPI_HEADER_DELETE_ALL = (1 shl 1); + SAPI_HEADER_SEND_NOW = (1 shl 2); + SAPI_HEADER_SENT_SUCCESSFULLY = 1; + SAPI_HEADER_DO_SEND = 2; + SAPI_HEADER_SEND_FAILED = 3; + SAPI_DEFAULT_MIMETYPE = 'text/html'; + SAPI_DEFAULT_CHARSET = ''; + SAPI_PHP_VERSION_HEADER = 'X-Powered-By: PHP'; + + +const + short_track_vars_names : array [0..5] of AnsiString = + ('_POST', + '_GET', + '_COOKIE', + '_SERVER', + '_ENV', + '_FILES' ); + + +const + PHP_ENTRY_NAME_COLOR = '#ccccff'; + PHP_CONTENTS_COLOR = '#cccccc'; + PHP_HEADER_COLOR = '#9999cc'; + PHP_INFO_GENERAL = (1 shl 0); + PHP_INFO_CREDITS = (1 shl 1); + PHP_INFO_CONFIGURATION = (1 shl 2); + PHP_INFO_MODULES = (1 shl 3); + PHP_INFO_ENVIRONMENT = (1 shl 4); + PHP_INFO_VARIABLES = (1 shl 5); + PHP_INFO_LICENSE = (1 shl 6); + PHP_INFO_ALL = $FFFFFFFF; + PHP_CREDITS_GROUP = (1 shl 0); + PHP_CREDITS_GENERAL = (1 shl 1); + PHP_CREDITS_SAPI = (1 shl 2); + PHP_CREDITS_MODULES = (1 shl 3); + PHP_CREDITS_DOCS = (1 shl 4); + PHP_CREDITS_FULLPAGE = (1 shl 5); + PHP_CREDITS_QA = (1 shl 6); + PHP_CREDITS_WEB = (1 shl 7); + PHP_CREDITS_ALL = $FFFFFFFF; + PHP_LOGO_GUID = 'PHPE9568F34-D428-11d2-A769-00AA001ACF42'; + PHP_EGG_LOGO_GUID = 'PHPE9568F36-D428-11d2-A769-00AA001ACF42'; + ZEND_LOGO_GUID = 'PHPE9568F35-D428-11d2-A769-00AA001ACF42'; + PHP_CREDITS_GUID = 'PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000'; + + +const + ENT_HTML_QUOTE_NONE = 0; + ENT_HTML_QUOTE_SINGLE = 1; + ENT_HTML_QUOTE_DOUBLE = 2; + ENT_COMPAT = ENT_HTML_QUOTE_DOUBLE; + ENT_QUOTES = (ENT_HTML_QUOTE_DOUBLE or ENT_HTML_QUOTE_SINGLE); + ENT_NOQUOTES = ENT_HTML_QUOTE_NONE; + + +const + PHP_INI_USER = ZEND_INI_USER; + PHP_INI_PERDIR = ZEND_INI_PERDIR; + PHP_INI_SYSTEM = ZEND_INI_SYSTEM; + PHP_INI_ALL = ZEND_INI_ALL; + PHP_INI_DISPLAY_ORIG = ZEND_INI_DISPLAY_ORIG; + PHP_INI_DISPLAY_ACTIVE = ZEND_INI_DISPLAY_ACTIVE; + PHP_INI_STAGE_STARTUP = ZEND_INI_STAGE_STARTUP; + PHP_INI_STAGE_SHUTDOWN = ZEND_INI_STAGE_SHUTDOWN; + PHP_INI_STAGE_ACTIVATE = ZEND_INI_STAGE_ACTIVATE; + PHP_INI_STAGE_DEACTIVATE = ZEND_INI_STAGE_DEACTIVATE; + PHP_INI_STAGE_RUNTIME = ZEND_INI_STAGE_RUNTIME; + +const + TRACK_VARS_POST = 0; + TRACK_VARS_GET = 1; + TRACK_VARS_COOKIE = 2; + TRACK_VARS_SERVER = 3; + TRACK_VARS_ENV = 4; + TRACK_VARS_FILES = 5; + +type + error_handling_t = (EH_NORMAL, EH_SUPPRESS, EH_THROW); + + +type + TRequestType = (rtGet, rtPut, rtPost, rtHead); + TPHPRequestType = (prtGet, prtPost); + +type + Psapi_header_struct = ^Tsapi_header_struct; + sapi_header_struct = + record + header : PAnsiChar; + header_len : uint; + {$IFNDEF PHP530} + replace : zend_bool; + {$ENDIF} + end; + Tsapi_header_struct = sapi_header_struct; + + Psapi_headers_struct = ^Tsapi_headers_struct; + sapi_headers_struct = + record + headers : zend_llist; + http_response_code : Integer; + send_default_content_type : Byte; + mimetype : PAnsiChar; + http_status_line : PAnsiChar; + end; + Tsapi_headers_struct = sapi_headers_struct; + + + Psapi_post_entry = ^Tsapi_post_entry; + sapi_post_entry = + record + content_type : PAnsiChar; + content_type_len : uint; + post_reader : pointer; //void (*post_reader)(TSRMLS_D); + post_handler : pointer; //void (*post_handler)(char *content_type_dup, void *arg TSRMLS_DC); + end; + Tsapi_post_entry = sapi_post_entry; + +{* Some values in this structure needs to be filled in before + * calling sapi_activate(). We WILL change the `char *' entries, + * so make sure that you allocate a separate buffer for them + * and that you free them after sapi_deactivate(). + *} + + Psapi_request_info = ^Tsapi_request_info; + sapi_request_info = + record + request_method : PAnsiChar; + query_string : PAnsiChar; + post_data : PAnsiChar; + raw_post_data : PAnsiChar; + cookie_data : PAnsiChar; + content_length : Longint; + post_data_length : uint; + raw_post_data_length : uint; + path_translated : PAnsiChar; + request_uri : PAnsiChar; + content_type : PAnsiChar; + headers_only : zend_bool; + no_headers : zend_bool; + {$IFDEF PHP5} + headers_read : zend_bool; + {$ENDIF} + post_entry : PSapi_post_entry; + content_type_dup : PAnsiChar; + //for HTTP authentication + auth_user : PAnsiChar; + auth_password : PAnsiChar; + {$IFDEF PHP510} + auth_digest : PAnsiChar; + {$ENDIF} + //this is necessary for the CGI SAPI module + argv0 : PAnsiChar; + //this is necessary for Safe Mode + current_user : PAnsiChar; + current_user_length : Integer; + //this is necessary for CLI module + argc : Integer; + argv : ^PAnsiChar; + {$IFDEF PHP510} + proto_num : integer; + {$ENDIF} + end; + Tsapi_request_info = sapi_request_info; + + Psapi_header_line = ^Tsapi_header_line; + sapi_header_line = + record + line : PAnsiChar; + line_len : uint; + response_code : Longint; + end; + Tsapi_header_line = sapi_header_line; + + Psapi_globals_struct = ^Tsapi_globals_struct; + _sapi_globals_struct = + record + server_context : Pointer; + request_info : sapi_request_info; + sapi_headers : sapi_headers_struct; + read_post_bytes : Integer; + headers_sent : Byte; + global_stat : stat; + default_mimetype : PAnsiChar; + default_charset : PAnsiChar; + rfc1867_uploaded_files : PHashTable; + post_max_size : Longint; + options : Integer; + {$IFDEF PHP5} + sapi_started : zend_bool; + {$IFDEF PHP510} + global_request_time : longint; + known_post_content_types : THashTable; + {$ENDIF} + {$ENDIF} + end; + Tsapi_globals_struct = _sapi_globals_struct; + + + Psapi_module_struct = ^Tsapi_module_struct; + + TModuleShutdownFunc = function (globals : pointer) : Integer; cdecl; + TModuleStartupFunc = function (sapi_module : psapi_module_struct) : integer; cdecl; + + sapi_module_struct = + record + name : PAnsiChar; + pretty_name : PAnsiChar; + + startup : TModuleStartupFunc; + //int (*startup)(struct _sapi_module_struct *sapi_module); + + shutdown : TModuleShutdownFunc; + //int (*shutdown)(struct _sapi_module_struct *sapi_module); + + activate : Pointer; + // int (*activate)(TSRMLS_D); + + deactivate : Pointer; + // int (*activate)(TSRMLS_D); + + ub_write : pointer; + flush : pointer; + stat : pointer; + getenv : pointer; + + sapi_error : pointer; + + header_handler : pointer; + send_headers : pointer; + send_header : pointer; + + read_post : pointer; + read_cookies : pointer; + + register_server_variables : pointer; + log_message : pointer; + get_request_time : pointer; + terminate_process : pointer; + + php_ini_path_override : PAnsiChar; + + block_interruptions : pointer; + unblock_interruptions : pointer; + + default_post_reader : pointer; + treat_data : pointer; + executable_location : PAnsiChar; + + php_ini_ignore : Integer; + + // PHP 5.4 + php_ini_ignore_cwd : Integer; + + get_fd : pointer; + force_http_10 : pointer; + get_target_uid : pointer; + get_target_gid : pointer; + + input_filter : pointer; + + ini_defaults : pointer; + + phpinfo_as_text : integer; + + ini_entries : PAnsiChar; + + additional_functions: Pointer; + input_filter_init : Pointer; + end; + + Tsapi_module_struct = sapi_module_struct; + + +type + PPHP_URL = ^TPHP_URL; + Tphp_url = + record + scheme : PAnsiChar; + user : PAnsiChar; + pass : PAnsiChar; + host : PAnsiChar; + port : Smallint; + path : PAnsiChar; + query : PAnsiChar; + fragment : PAnsiChar; + end; + + +type + arg_separators = + record + output : PAnsiChar; + input : PAnsiChar; + end; + +type + Pphp_Core_Globals = ^TPHP_core_globals; + Tphp_core_globals = + record + magic_quotes_gpc : zend_bool; + magic_quotes_runtime : zend_bool; + magic_quotes_sybase : zend_bool; + safe_mode : zend_bool; + allow_call_time_pass_reference : boolean; + implicit_flush : boolean; + output_buffering : Integer; + safe_mode_include_dir : PAnsiChar; + safe_mode_gid : boolean; + sql_safe_mode : boolean; + enable_dl :boolean; + output_handler : PAnsiChar; + unserialize_callback_func : PAnsiChar; + safe_mode_exec_dir : PAnsiChar; + memory_limit : Longint; + max_input_time : Longint; + track_errors : boolean; + display_errors : boolean; + display_startup_errors : boolean; + log_errors : boolean; + log_errors_max_len : Longint; + ignore_repeated_errors : boolean; + ignore_repeated_source : boolean; + report_memleaks : boolean; + error_log : PAnsiChar; + doc_root : PAnsiChar; + user_dir : PAnsiChar; + include_path : PAnsiChar; + open_basedir : PAnsiChar; + extension_dir : PAnsiChar; + upload_tmp_dir : PAnsiChar; + upload_max_filesize : Longint; + error_append_string : PAnsiChar; + error_prepend_string : PAnsiChar; + auto_prepend_file : PAnsiChar; + auto_append_file : PAnsiChar; + arg_separator : arg_separators; + gpc_order : PAnsiChar; + variables_order : PAnsiChar; + rfc1867_protected_variables : THashTable; + connection_status : Smallint; + ignore_user_abort : Smallint; + header_is_being_sent : Byte; + tick_functions : zend_llist; + http_globals : array[0..5] of pzval; + expose_php : boolean; + register_globals : boolean; + register_argc_argv : boolean; + y2k_compliance : boolean; + docref_root : PAnsiChar; + docref_ext : PAnsiChar; + html_errors : boolean; + xmlrpc_errors : boolean; + xmlrpc_error_number : Longint; + modules_activated : boolean; + file_uploads : boolean; + during_request_startup : boolean; + allow_url_fopen : boolean; + always_populate_raw_post_data : boolean; + {$IFDEF PHP510} + report_zend_debug : boolean; + last_error_message : PAnsiChar; + last_error_file : PAnsiChar; + last_error_lineno : integer; + {$IFNDEF PHP530} + error_handling : error_handling_t; + exception_class : Pointer; + {$ENDIF} + disable_functions : PAnsiChar; + disable_classes : PAnsiChar; + {$ENDIF} + {$IFDEF PHP520} + allow_url_include : zend_bool; + com_initialized : zend_bool; + max_input_nesting_level : longint; + in_user_include : zend_bool; + {$ENDIF} + + {$IFDEF PHP530} + user_ini_filename : PAnsiChar; + user_ini_cache_ttl : longint; + request_order : PAnsiChar; + mail_x_header : zend_bool; + mail_log : PAnsiChar; + {$ENDIF} + end; + +implementation + +end. + diff --git a/ProjectGroup1.groupproj b/ProjectGroup1.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/ProjectGroup1.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProjectGroup1.groupproj.local b/ProjectGroup1.groupproj.local new file mode 100644 index 0000000..eaa4e24 --- /dev/null +++ b/ProjectGroup1.groupproj.local @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ProjectGroup1_prjgroup.tvsconfig b/ProjectGroup1_prjgroup.tvsconfig new file mode 100644 index 0000000..d430780 --- /dev/null +++ b/ProjectGroup1_prjgroup.tvsconfig @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/ZENDAPI.pas b/ZENDAPI.pas index 1067be4..3e1bd39 100644 --- a/ZENDAPI.pas +++ b/ZENDAPI.pas @@ -1,2062 +1,3580 @@ -{*******************************************************} -{ PHP4Delphi } -{ ZEND - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: ZENDAPI.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit zendAPI; - -interface - -uses - Windows, SysUtils, ZendTypes; - -type - EPHP4DelphiException = class(Exception) - constructor Create(const Msg: string); - end; - - align_test = record - case Integer of - 1: (ptr: Pointer; ); - 2: (dbl: Double; ); - 3: (lng: Longint; ); - end; - -const - PLATFORM_ALIGNMENT = (SizeOf(align_test)); - -{$IFDEF PHP5} -function LoadZEND(const DllFilename: string = 'php5ts.dll') : boolean; -{$ELSE} -function LoadZEND(const DllFilename: string = 'php4ts.dll') : boolean; -{$ENDIF} - -procedure UnloadZEND; -function ZENDLoaded: boolean; - -{Memory management functions} -var - zend_strndup : function(s: PChar; length: Integer): PChar; cdecl; - _emalloc : function(size: size_t; __zend_filename: PChar; __zend_lineno: uint; __zend_orig_filename: PChar; __zend_orig_line_no: uint): pointer; cdecl; - _efree : procedure(ptr: pointer; __zend_filename: PChar; __zend_lineno: uint; __zend_orig_filename: PChar; __zend_orig_line_no: uint); cdecl; - _ecalloc : function(nmemb: size_t; size: size_t; __zend_filename: PChar; __zend_lineno: uint; __zend_orig_filename: PChar; __zend_orig_line_no: uint): pointer; cdecl; - _erealloc : function(ptr: pointer; size: size_t; allow_failure: integer; __zend_filename: PChar; __zend_lineno: uint; __zend_orig_filename: PChar; __zend_orig_line_no: uint): pointer; cdecl; - _estrdup : function(const s: PChar; __zend_filename: PChar; __zend_lineno: uint; __zend_orig_filename: PChar; __zend_orig_line_no: uint): pointer; cdecl; - _estrndup : function(s: PChar; Len: Cardinal; __zend_filename: PChar; __zend_lineno: uint; __zend_orig_filename: PChar; __zend_orig_line_no: uint): PChar; cdecl; - -function emalloc(size: size_t): pointer; -procedure efree(ptr: pointer); -function ecalloc(nmemb: size_t; size: size_t): pointer; -function erealloc(ptr: pointer; size: size_t; allow_failure: integer): pointer; -function estrdup(const s: PChar): PChar; -function estrndup(s: PChar; len: Cardinal): PChar; -function STR_EMPTY_ALLOC : PChar; - -var - zend_set_memory_limit : function(memory_limit: uint): integer; cdecl; - start_memory_manager : procedure(TSRMLS_D: pointer); cdecl; - shutdown_memory_manager : procedure(silent: integer; clean_cache: integer; TSRMLS_DC: pointer); cdecl; - - - { startup/shutdown } - -var - - zend_register_resource : function (rsrc_result : pzval; rsrc_pointer : pointer; rsrc_type : integer) : integer; cdecl; - zend_fetch_resource : function (passed_id : ppzval; TSRMLS_DC : pointer; default_id : integer; resource_type_name : PChar; found_resource_type : pointer; num_resource_types: integer; resource_type: integer) : pointer; cdecl; - zend_list_insert : function (ptr : pointer; _type: integer) : integer; cdecl; - _zend_list_addref : function (id : integer; TSRMLS_DC : pointer) : integer; cdecl; - _zend_list_delete : function (id : integer; TSRMLS_DC : pointer) : integer; cdecl; - _zend_list_find : function (id : integer; _type : pointer; TSRMLS_DC : pointer) : pointer; cdecl; - zend_rsrc_list_get_rsrc_type : function (resource: integer; TSRMLS_DC : pointer) : PChar; cdecl; - zend_fetch_list_dtor_id : function (type_name : PChar) : integer; cdecl; - zend_register_list_destructors_ex : function (ld : pointer; pld : pointer; type_name : pChar; module_number : integer) : integer; cdecl; - - - -{disable functions} - -var - zend_disable_function : function(function_name : pchar; function_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; - zend_disable_class : function(class_name : pchar; class_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; - - - zend_hash_add_or_update : function(ht: PHashTable; arKey: PChar; - nKeyLength: uint; pData: Pointer; nDataSize: uint; pDest: Pointer; - flag: Integer): Integer; cdecl; - -var - {$IFDEF PHP4} - zend_hash_init : function(ht: PHashTable; nSize: uint; - pHashFunction: pointer; pDestructor: pointer; - persistent: Integer): Integer; cdecl; - - zend_hash_init_ex : function(ht: PHashTable; nSize: uint; - pHashFunction: pointer; pDestructor: pointer; - persistent: Integer; bApplyProtection: boolean): Integer; cdecl; - - - zend_hash_quick_add_or_update : function(ht: PHashTable; arKey: PChar; - nKeyLength: uint; h: ulong; pData: Pointer; nDataSize: uint; - pDest: Pointer; flag: Integer): Integer; cdecl; - - zend_hash_index_update_or_next_insert : function(ht: PHashTable; h: ulong; - pData: Pointer; nDataSize: uint; pDest: Pointer; flag: Integer): Integer; cdecl; - - zend_hash_merge : procedure(target: PHashTable; source: PHashTable; - pCopyConstructor: pointer; tmp: Pointer; size: uint; overwrite: Integer); cdecl; - - {$ENDIF} - - - zend_hash_destroy : procedure(ht: PHashTable); cdecl; - zend_hash_clean : procedure(ht: PHashTable); cdecl; - - { additions/updates/changes } - - - - - zend_hash_add_empty_element : function(ht: PHashTable; arKey: PChar; - nKeyLength: uint): Integer; cdecl; - - - - -var - zend_hash_graceful_destroy : procedure(ht: PHashTable); cdecl; - zend_hash_graceful_reverse_destroy : zend_hash_graceful_reverse_destroy_t; - - zend_hash_apply : procedure(ht: PHashTable; apply_func: pointer; TSRMLS_DC: Pointer); cdecl; - - zend_hash_apply_with_argument : procedure(ht: PHashTable; - apply_func: pointer; _noname1: Pointer; TSRMLS_DC: Pointer); cdecl; - - { This function should be used with special care (in other words, - * it should usually not be used). When used with the ZEND_HASH_APPLY_STOP - * return value, it assumes things about the order of the elements in the hash. - * Also, it does not provide the same kind of reentrancy protection that - * the standard apply functions do. - } - - zend_hash_reverse_apply : procedure(ht: PHashTable; - apply_func: pointer; TSRMLS_DC: Pointer); cdecl; - - { Deletes } - - zend_hash_del_key_or_index : function(ht: PHashTable; arKey: PChar; - nKeyLength: uint; h: ulong; flag: Integer): Integer; cdecl; - - zend_get_hash_value : function(ht: PHashTable; arKey: PChar; - nKeyLength: uint): Longint; cdecl; - - { Data retreival } - - zend_hash_find : function(ht: PHashTable; arKey: PChar; nKeyLength: uint; - pData: Pointer): Integer; cdecl; - - zend_hash_quick_find : function(ht: PHashTable; arKey: PChar; - nKeyLength: uint; h: ulong; pData: Pointer): Integer; cdecl; - - zend_hash_index_find : function(ht: PHashTable; h: ulong; pData: Pointer): Integer; cdecl; - - { Misc } - - zend_hash_exists : function(ht: PHashTable; arKey: PChar; nKeyLength: uint): Integer; cdecl; - - zend_hash_index_exists : function(ht: PHashTable; h: ulong): Integer; cdecl; - - zend_hash_next_free_element : function(ht: PHashTable): Longint; cdecl; - - { traversing } - - zend_hash_move_forward_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; - - zend_hash_move_backwards_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; - - zend_hash_get_current_key_ex : function(ht: PHashTable; - var str_index: PChar; var str_length: uint; var num_index: ulong; - duplicate: boolean; pos: HashPosition): Integer; cdecl; - - zend_hash_get_current_key_type_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; - - zend_hash_get_current_data_ex : function(ht: PHashTable; pData: Pointer; pos: HashPosition): Integer; cdecl; - - zend_hash_internal_pointer_reset_ex : procedure(ht: PHashTable; pos: HashPosition); cdecl; - - zend_hash_internal_pointer_end_ex : procedure(ht: PHashTable; pos: HashPosition); cdecl; - - { Copying, merging and sorting } - - zend_hash_copy : procedure(target: PHashTable; source: PHashTable; - pCopyConstructor: pointer; tmp: Pointer; size: uint); cdecl; - - - zend_hash_sort : function(ht: PHashTable; sort_func: pointer; - compare_func: pointer; renumber: Integer; TSRMLS_DC: Pointer): Integer; cdecl; - - zend_hash_compare : function(ht1: PHashTable; ht2: PHashTable; - compar: pointer; ordered: boolean; TSRMLS_DC: Pointer): Integer; cdecl; - - zend_hash_minmax : function(ht: PHashTable; compar: pointer; - flag: Integer; pData: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; - - zend_hash_num_elements : function(ht: PHashTable): Integer; cdecl; - - zend_hash_rehash : function(ht: PHashTable): Integer; cdecl; - - zend_hash_func : function(arKey: PChar; nKeyLength: uint): Longint; cdecl; - - -function zend_hash_get_current_data(ht: PHashTable; pData: Pointer): Integer; cdecl; -procedure zend_hash_internal_pointer_reset(ht: PHashTable); cdecl; - - -var - zend_get_constant : function(name: PChar; name_len: uint; var result: zval; - TSRMLS_DC: Pointer): Integer; cdecl; - - zend_register_long_constant : procedure(name: PChar; name_len: uint; - lval: Longint; flags: Integer; module_number: Integer; TSRMLS_DC: Pointer); cdecl; - - zend_register_double_constant : procedure(name: PChar; name_len: uint; dval: Double; flags: Integer; module_number: Integer; - TSRMLS_DC: Pointer); cdecl; - - zend_register_string_constant : procedure(name: PChar; name_len: uint; strval: PChar; flags: Integer; module_number: Integer; - TSRMLS_DC: Pointer); cdecl; - - zend_register_stringl_constant : procedure(name: PChar; name_len: uint; - strval: PChar; strlen: uint; flags: Integer; module_number: Integer; - TSRMLS_DC: Pointer); cdecl; - - zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): Integer; cdecl; - -procedure REGISTER_MAIN_LONG_CONSTANT(name: PChar; lval: longint; flags: integer; TSRMLS_DC: Pointer); -procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: PChar; dval: double; flags: integer; TSRMLS_DC: Pointer); -procedure REGISTER_MAIN_STRING_CONSTANT(name: PChar; str: PChar; flags: integer; TSRMLS_DC: Pointer); -procedure REGISTER_MAIN_STRINGL_CONSTANT(name: PChar; str: PChar; len: uint; flags: integer; TSRMLS_DC: Pointer); - - -var - tsrm_startup : function(expected_threads: integer; - expected_resources: integer; debug_level: integer; debug_filename: pchar): integer; cdecl; - - ts_allocate_id : function(rsrc_id: pts_rsrc_id; size: size_t; ctor: pointer; dtor: pointer): ts_rsrc_id; cdecl; - // deallocates all occurrences of a given id - ts_free_id : procedure(id: ts_rsrc_id); cdecl; - - tsrm_shutdown : procedure(); cdecl; - ts_resource_ex : function(id: integer; p: pointer): pointer; cdecl; - ts_free_thread : procedure; cdecl; - - zend_error : procedure(ErrType: integer; ErrText: PChar); cdecl; - zend_error_cb : procedure; cdecl; - - zend_eval_string : function(str: pchar; val: pointer; strname: pchar; tsrm: pointer): integer; cdecl; - zend_make_compiled_string_description : function(a: Pchar; tsrm: pointer): PChar; cdecl; - _zval_dtor : procedure(val: pzval; __zend_filename: PChar; __zend_lineno: uint); cdecl; - _zval_copy_ctor : function(val: pzval; __zend_filename: PChar; __zend_lineno: uint): integer; cdecl; - zend_print_variable : function(val: pzval): integer; cdecl; - - - zend_get_compiled_filename : function(TSRMLS_DC: Pointer): PChar; cdecl; - zend_get_compiled_lineno : function(TSRMLS_DC: Pointer): integer; cdecl; - - -function zval_copy_ctor(val : pzval) : integer; -function ts_resource(id : integer) : pointer; - -procedure zenderror(Error : PChar); - -var - zend_stack_init : function(stack: Pzend_stack): Integer; cdecl; - - zend_stack_push : function(stack: Pzend_stack; element: Pointer; size: Integer): Integer; cdecl; - - zend_stack_top : function(stack: Pzend_stack; element: Pointer): Integer; cdecl; - - zend_stack_del_top : function(stack: Pzend_stack): Integer; cdecl; - - zend_stack_int_top : function(stack: Pzend_stack): Integer; cdecl; - - zend_stack_is_empty : function(stack: Pzend_stack): Integer; cdecl; - - zend_stack_destroy : function(stack: Pzend_stack): Integer; cdecl; - - zend_stack_base : function(stack: Pzend_stack): Pointer; cdecl; - - zend_stack_count : function(stack: Pzend_stack): Integer; cdecl; - - zend_stack_apply : procedure(stack: Pzend_stack; _type: Integer; apply_function: Integer); cdecl; - - zend_stack_apply_with_argument : procedure(stack: Pzend_stack; _type: Integer; apply_function: Integer; arg: Pointer); cdecl; - - - //zend_operators.h - -var - _convert_to_string : procedure(op: pzval; __zend_filename: PChar; __zend_lineno: uint); cdecl; - -procedure convert_to_string(op: pzval); - -var - add_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - sub_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - mul_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - div_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - mod_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - boolean_xor_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - boolean_not_function : function(_result: Pzval; op1: Pzval): Integer; cdecl; - - bitwise_not_function : function(_result: Pzval; op1: Pzval): Integer; cdecl; - - bitwise_or_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - bitwise_and_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - bitwise_xor_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - shift_left_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - shift_right_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - concat_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - is_equal_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - is_identical_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - is_not_identical_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - is_not_equal_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - is_smaller_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - is_smaller_or_equal_function : function(_result: Pzval; op1: Pzval; var op2: zval; TSRMLS_DC: Pointer): Integer; cdecl; - - increment_function : function(op1: Pzval): Integer; cdecl; - - decrement_function : function(op2: Pzval): Integer; cdecl; - - convert_scalar_to_number : procedure(op: Pzval; TSRMLS_DC: Pointer); cdecl; - - convert_to_long : procedure(op: Pzval); cdecl; - - convert_to_double : procedure(op: Pzval); cdecl; - - convert_to_long_base : procedure(op: Pzval; base: Integer); cdecl; - - convert_to_null : procedure(op: Pzval); cdecl; - - convert_to_boolean : procedure(op: Pzval); cdecl; - - convert_to_array : procedure(op: Pzval); cdecl; - - convert_to_object : procedure(op: Pzval); cdecl; - - add_char_to_string : function(_result: Pzval; op1: Pzval; op2: Pzval): Integer; cdecl; - - add_string_to_string : function(_result: Pzval; op1: Pzval; op2: Pzval): Integer; cdecl; - - zend_string_to_double : function(number: PChar; length: zend_uint): Double; cdecl; - - zval_is_true : function(op: Pzval): Integer; cdecl; - - compare_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - numeric_compare_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - string_compare_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - - zend_str_tolower : procedure(str: PChar; length: Integer); cdecl; - - zend_binary_zval_strcmp : function(s1: Pzval; s2: Pzval): Integer; cdecl; - - zend_binary_zval_strncmp : function(s1: Pzval; s2: Pzval; s3: Pzval): Integer; cdecl; - - zend_binary_zval_strcasecmp : function(s1: Pzval; s2: Pzval): Integer; cdecl; - - zend_binary_zval_strncasecmp : function(s1: Pzval; s2: Pzval; s3: Pzval): Integer; cdecl; - - zend_binary_strcmp : function(s1: PChar; len1: uint; s2: PChar; len2: uint): Integer; cdecl; - - zend_binary_strncmp : function(s1: PChar; len1: uint; s2: PChar; len2: uint; length: uint): Integer; cdecl; - - zend_binary_strcasecmp : function(s1: PChar; len1: uint; s2: PChar; len2: uint): Integer; cdecl; - - zend_binary_strncasecmp : function(s1: PChar; len1: uint; s2: PChar; len2: uint; length: uint): Integer; cdecl; - - zendi_smart_strcmp : procedure(_result: zval; s1: Pzval; s2: Pzval); cdecl; - - zend_compare_symbol_tables : procedure(_result: Pzval; ht1: PHashTable; ht2: PHashTable; TSRMLS_DC: Pointer); cdecl; - - zend_compare_arrays : procedure(_result: zval; a1: Pzval; a2: Pzval; TSRMLS_DC: Pointer); cdecl; - - zend_compare_objects : procedure(_result: Pzval; o1: Pzval; o2: Pzval; TSRMLS_DC: Pointer); cdecl; - - zend_atoi : function(str: PChar; str_len: Integer): Integer; cdecl; - - //zend_execute.h - get_active_function_name : function(TSRMLS_D: pointer): PChar; cdecl; - - zend_get_executed_filename : function(TSRMLS_D: pointer): PChar; cdecl; - - zend_set_timeout : procedure(seconds: Longint); cdecl; - - zend_unset_timeout : procedure(TSRMLS_D: pointer); cdecl; - - zend_timeout : procedure(dummy: Integer); cdecl; - - -var - zend_highlight : procedure(syntax_highlighter_ini: Pzend_syntax_highlighter_ini; TSRMLS_DC: Pointer); cdecl; - - zend_strip : procedure(TSRMLS_D: pointer); cdecl; - - highlight_file : function(filename: PChar; syntax_highlighter_ini: Pzend_syntax_highlighter_ini; TSRMLS_DC: Pointer): Integer; cdecl; - - highlight_string : function(str: Pzval; syntax_highlighter_ini: Pzend_syntax_highlighter_ini; str_name: PChar; TSRMLS_DC: Pointer): Integer; cdecl; - - zend_html_putc : procedure(c: Char); cdecl; - - zend_html_puts : procedure(s: PChar; len: uint; TSRMLS_DC: Pointer); cdecl; - - zend_indent : procedure; cdecl; - - ZendGetParameters : function: integer; cdecl; - -function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; - -function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; - -var - _zend_get_parameters_array_ex : function(param_count: integer; argument_array: pppointer; TSRMLS_CC: pointer): integer; cdecl; - -procedure dispose_pzval_array(Params: pzval_array); - -var - zend_ini_refresh_caches : procedure(stage: Integer; TSRMLS_DC: Pointer); cdecl; - - -var - _zend_bailout : procedure (filename : PChar; lineno : uint); cdecl; - - zend_alter_ini_entry : function(name: PChar; name_length: uint; new_value: PChar; new_value_length: uint; modify_type: Integer; stage: Integer): Integer; cdecl; - - zend_restore_ini_entry : function(name: PChar; name_length: uint; stage: Integer): Integer; cdecl; - - zend_ini_long : function(name: PChar; name_length: uint; orig: Integer): Longint; cdecl; - - zend_ini_double : function(name: PChar; name_length: uint; orig: Integer): Double; cdecl; - - zend_ini_string : function(name: PChar; name_length: uint; orig: Integer): PChar; cdecl; - - compile_string : function(source_string: pzval; filename: PChar; TSRMLS_DC: Pointer): pointer; cdecl; - - execute : procedure(op_array: pointer; TSRMLS_DC: Pointer); cdecl; - - zend_wrong_param_count : procedure(TSRMLS_D: pointer); cdecl; - - {$IFDEF PHP4} - add_property_long_ex : function(arg: pzval; key: PChar; key_len: uint; l: longint): integer; cdecl; - {$ELSE} - add_property_long_ex : function(arg: pzval; key: PChar; key_len: uint; l: longint; TSRMLS_DC : pointer): integer; cdecl; - {$ENDIF} - - {$IFDEF PHP4} - add_property_null_ex : function(arg: pzval; key: PChar; key_len: uint): integer; cdecl; - add_property_bool_ex : function(arg: pzval; key: PChar; key_len: uint; b: integer): integer; cdecl; - add_property_resource_ex : function(arg: pzval; key: PChar; key_len: uint; r: integer): integer; cdecl; - add_property_double_ex : function(arg: pzval; key: PChar; key_len: uint; d: double): integer; cdecl; - add_property_string_ex : function(arg: pzval; key: PChar; key_len: uint; str: PChar; duplicate: integer): integer; cdecl; - add_property_stringl_ex : function(arg: pzval; key: PChar; key_len: uint; str: PChar; len: uint; duplicate: integer): integer; cdecl; - add_property_zval_ex : function(arg: pzval; key: PChar; key_len: uint; value: pzval): integer; cdecl; - {$ELSE} - add_property_null_ex : function(arg: pzval; key: PChar; key_len: uint; TSRMLS_DC: Pointer): integer; cdecl; - add_property_bool_ex : function(arg: pzval; key: PChar; key_len: uint; b: integer; TSRMLS_DC: Pointer): integer; cdecl; - add_property_resource_ex : function(arg: pzval; key: PChar; key_len: uint; r: integer; TSRMLS_DC: Pointer): integer; cdecl; - add_property_double_ex : function(arg: pzval; key: PChar; key_len: uint; d: double; TSRMLS_DC: Pointer): integer; cdecl; - add_property_string_ex : function(arg: pzval; key: PChar; key_len: uint; str: PChar; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; - add_property_stringl_ex : function(arg: pzval; key: PChar; key_len: uint; str: PChar; len: uint; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; - add_property_zval_ex : function(arg: pzval; key: PChar; key_len: uint; value: pzval; TSRMLS_DC: Pointer): integer; cdecl; - {$ENDIF} - - add_assoc_long_ex : function(arg: pzval; key: PChar; key_len: uint; n: longint): integer; cdecl; - add_assoc_null_ex : function(arg: pzval; key: PChar; key_len: uint): integer; cdecl; - add_assoc_bool_ex : function(arg: pzval; key: PChar; key_len: uint; b: integer): integer; cdecl; - add_assoc_resource_ex : function(arg: pzval; key: PChar; key_len: uint; r: integer): integer; cdecl; - add_assoc_double_ex : function(arg: pzval; key: PChar; key_len: uint; d: double): integer; cdecl; - add_assoc_string_ex : function(arg: pzval; key: PChar; key_len: uint; str: PChar; duplicate: integer): integer; cdecl; - add_assoc_stringl_ex : function(arg: pzval; key: PChar; key_len: uint; str: PChar; len: uint; duplicate: integer): integer; cdecl; - add_assoc_zval_ex : function(arg: pzval; key: PChar; key_len: uint; value: pzval): integer; cdecl; - - add_index_long : function(arg: pzval; idx: uint; n: longint): integer; cdecl; - add_index_null : function(arg: pzval; idx: uint): integer; cdecl; - add_index_bool : function(arg: pzval; idx: uint; b: integer): integer; cdecl; - add_index_resource : function(arg: pzval; idx: uint; r: integer): integer; cdecl; - add_index_double : function(arg: pzval; idx: uint; d: double): integer; cdecl; - add_index_string : function(arg: pzval; idx: uint; str: PChar; duplicate: integer): integer; cdecl; - add_index_stringl : function(arg: pzval; idx: uint; str: PChar; len: uint; duplicate: integer): integer; cdecl; - add_index_zval : function(arg: pzval; index: uint; value: pzval): integer; cdecl; - - add_next_index_long : function(arg: pzval; n: longint): integer; cdecl; - add_next_index_null : function(arg: pzval): integer; cdecl; - add_next_index_bool : function(arg: pzval; b: integer): integer; cdecl; - add_next_index_resource : function(arg: pzval; r: integer): integer; cdecl; - add_next_index_double : function(arg: pzval; d: double): integer; cdecl; - add_next_index_string : function(arg: pzval; str: PChar; duplicate: integer): integer; cdecl; - add_next_index_stringl : function(arg: pzval; str: PChar; len: uint; duplicate: integer): integer; cdecl; - add_next_index_zval : function(arg: pzval; value: pzval): integer; cdecl; - - add_get_assoc_string_ex : function(arg: pzval; key: PChar; key_len: uint; str: PChar; dest: pointer; duplicate: integer): integer; cdecl; - add_get_assoc_stringl_ex : function(arg: pzval; key: PChar; key_len: uint; str: PChar; len: uint; dest: pointer; duplicate: integer): integer; cdecl; - - add_get_index_long : function(arg: pzval; idx: uint; l: longint; dest: pointer): integer; cdecl; - add_get_index_double : function(arg: pzval; idx: uint; d: double; dest: pointer): integer; cdecl; - add_get_index_string : function(arg: pzval; idx: uint; str: PChar; dest: pointer; duplicate: integer): integer; cdecl; - add_get_index_stringl : function(arg: pzval; idx: uint; str: PChar; len: uint; dest: pointer; duplicate: integer): integer; cdecl; - - _array_init : function(arg: pzval; __zend_filename: pchar; __zend_lineno: uint): integer; cdecl; - - {$IFDEF PHP4} - _object_init : function(arg: pzval; __zend_filename: PChar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; - {$ELSE} - _object_init : function(arg: pzval;TSRMLS_DC: pointer): integer; cdecl; - {$ENDIF} - - {$IFDEF PHP4} - _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_filename: pchar; __zend_lineno: uint; TSRMLS_DC: pointer) : integer; cdecl; - {$ELSE} - _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_lineno : integer; TSRMLS_DC : pointer) : integer; cdecl; - {$ENDIF} - - _object_and_properties_init : function(arg: pzval; ce: pointer; properties: phashtable; __zend_filename: pchar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; - - - {$IFDEF PHP5} - zend_destroy_file_handle : procedure(file_handle : PZendFileHandle; TSRMLS_DC : pointer); cdecl; - {$ENDIF} - -var - zend_write : zend_write_t; - -procedure ZEND_PUTS(str: PChar); - - -var - zend_register_internal_class : function(class_entry: pzend_class_entry; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; - zend_register_internal_class_ex : function(class_entry: pzend_class_entry; parent_ce: pzend_class_entry; parent_name: Pchar; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; - -procedure ZVAL_RESOURCE(value: pzval; l: longint); -procedure ZVAL_BOOL(z: pzval; b: boolean); -procedure ZVAL_NULL(z: pzval); -procedure ZVAL_LONG(z: pzval; l: longint); -procedure ZVAL_DOUBLE(z: pzval; d: double); -procedure ZVAL_STRING(z: pzval; s: pchar; duplicate: boolean); -procedure ZVAL_STRINGL(z: pzval; s: pchar; l: integer; duplicate: boolean); -procedure ZVAL_EMPTY_STRING(z: pzval); -procedure ZVAL_TRUE(z: pzval); -procedure ZVAL_FALSE(z: pzval); - - -procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: pchar; functions: pointer); - - -var - get_zend_version : function(): PChar; cdecl; - zend_make_printable_zval : procedure(expr: pzval; expr_copy: pzval; use_copy: pint); cdecl; - zend_print_zval : function(expr: pzval; indent: integer): integer; cdecl; - zend_print_zval_r : procedure(expr: pzval; indent: integer); cdecl; - zend_output_debug_string : procedure(trigger_break: boolean; Msg: PChar); cdecl; - -{$IFDEF PHP5} - zend_objects_new : function (_object : pointer; class_type : pointer; TSRMLS_DC : pointer) : _zend_object_value; cdecl; -{$ENDIF} - - -//Microsoft C++ functions -function setjmp(buf : jump_buf) : integer; cdecl; external 'msvcrt.dll' name '_setjmp3'; -function pipe(phandles : pointer; psize : uint; textmode : integer) : integer; cdecl; external 'msvcrt.dll' name '_pipe'; -procedure close(AHandle : THandle); cdecl; external 'msvcrt.dll' name '_close'; -function _write(AHandle : integer; ABuffer : pointer; count : uint) : integer; cdecl; external 'msvcrt.dll' name '_write'; - - -function ZEND_FAST_ALLOC: pzval; -function ALLOC_ZVAL: pzval; -procedure INIT_PZVAL(p: pzval); -function MAKE_STD_ZVAL: pzval; - -{$IFNDEF QUIET_LOAD} -procedure CheckZendErrors; -{$ENDIF} - -var - PHPLib : THandle = 0; - -var - zend_ini_deactivate : function(TSRMLS_D : pointer) : integer; cdecl; - -function GetGlobalResource(resource_name: string; TSRMLS_DC : pointer) : pointer; - -function GetCompilerGlobals(TSRMLS_DC : pointer) : Pzend_compiler_globals; -function GetExecutorGlobals(TSRMLS_DC : pointer) : pzend_executor_globals; -function GetAllocGlobals(TSRMLS_DC : pointer) : pointer; - -function zend_register_functions(functions : pzend_function_entry; function_table : PHashTable; _type: integer; TSRMLS_DC : pointer) : integer; -function zend_unregister_functions(functions : pzend_function_entry; count : integer; function_table : PHashTable; TSRMLS_DC : pointer) : integer; - -{$IFDEF PHP5} - -var - zend_get_std_object_handlers : function() : pzend_object_handlers; - zend_objects_get_address : function (_object : pzval; TSRMLS_DC : pointer) : pzend_object; cdecl; - zend_is_true : function(z : pzval) : integer; cdecl; - -function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : integer; cdecl; assembler; - -function Z_LVAL(z : zval) : longint; -function Z_BVAL(z : zval) : boolean; -function Z_DVAL(z : zval) : double; -function Z_STRVAL(z : zval) : string; -function Z_STRLEN(z : zval) : longint; -function Z_ARRVAL(z : zval ) : PHashTable; -function Z_OBJ_HANDLE(z :zval) : zend_object_handle; -function Z_OBJ_HT(z : zval) : pzend_object_handlers; -function Z_OBJPROP(z : zval) : PHashtable; - - -{$ENDIF} - -implementation - -function STR_EMPTY_ALLOC : PChar; -begin - Result := estrndup('', 0); -end; - -function estrndup(s: PChar; len: Cardinal): PChar; -begin - if assigned(s) then - Result := _estrndup(s, len, nil, 0, nil, 0) - else - Result := nil; -end; - -function emalloc(size: size_t): pointer; -begin - Result := _emalloc(size, nil, 0, nil, 0); -end; - -procedure efree(ptr: pointer); -begin - _efree(ptr, nil, 0, nil, 0); -end; - -function ecalloc(nmemb: size_t; size: size_t): pointer; -begin - Result := _ecalloc(nmemb, size, nil, 0, nil, 0); -end; - -function erealloc(ptr: pointer; size: size_t; allow_failure: integer): pointer; -begin - Result := _erealloc(ptr, size, allow_failure, nil, 0, nil, 0); -end; - -function estrdup(const s: PChar): PChar; -begin - if assigned(s) then - Result := _estrdup(s, nil, 0, nil, 0) - else - Result := nil; -end; - -procedure REGISTER_MAIN_LONG_CONSTANT(name: PChar; lval: longint; flags: integer; TSRMLS_DC: Pointer); -begin - zend_register_long_constant(name, length(name) + 1, lval, flags, 0, TSRMLS_DC); -end; - -procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: PChar; dval: double; flags: integer; TSRMLS_DC: Pointer); -begin - zend_register_double_constant(name, length(name) + 1, dval, flags, 0, TSRMLS_DC); -end; - -procedure REGISTER_MAIN_STRING_CONSTANT(name: PChar; str: PChar; flags: integer; TSRMLS_DC: Pointer); -begin - zend_register_string_constant(name, length(name) + 1, str, flags, 0, TSRMLS_DC); -end; - -procedure REGISTER_MAIN_STRINGL_CONSTANT(name: PChar; str: PChar; len: uint; flags: integer; TSRMLS_DC: Pointer); -begin - zend_register_stringl_constant(name, length(name) + 1, str, len, flags, 0, TSRMLS_DC); -end; - -procedure ZVAL_RESOURCE(value: pzval; l: longint); -begin - value^._type := IS_RESOURCE; - value^.value.lval := l; -end; - -procedure ZVAL_BOOL(z: pzval; b: boolean); -begin - z^._type := IS_BOOL; - z^.value.lval := integer(b); -end; - -procedure ZVAL_NULL(z: pzval); -begin - z^._type := IS_NULL; -end; - -procedure ZVAL_LONG(z: pzval; l: longint); -begin - z^._type := IS_LONG; - z^.value.lval := l; -end; - -procedure ZVAL_DOUBLE(z: pzval; d: double); -begin - z^._type := IS_DOUBLE; - z^.value.dval := d; -end; - -procedure ZVAL_STRING(z: pzval; s: pchar; duplicate: boolean); -var - __s : pchar; -begin - if not assigned(s) then - __s := '' - else - __s := s; - - z^.value.str.len := strlen(__s); - if duplicate then - - z^.value.str.val := estrndup(__s, z^.value.str.len) - else - z^.value.str.val := __s; - z^._type := IS_STRING; -end; - -procedure ZVAL_STRINGL(z: pzval; s: pchar; l: integer; duplicate: boolean); -var - __s : pchar; - __l : integer; -begin - if not assigned(s) then - __s := '' - else - __s := s; - __l := l; - z^.value.str.len := __l; - if duplicate then - z^.value.str.val := estrndup(__s, __l) - else - z^.value.str.val := __s; - z^._type := IS_STRING; -end; - -procedure ZVAL_EMPTY_STRING(z: pzval); -begin - z^.value.str.len := 0; - {$IFDEF PHP510} - z^.value.str.val := STR_EMPTY_ALLOC; - {$ELSE} - z^.value.str.val := ''; - {$ENDIF} - z^._type := IS_STRING; -end; - -procedure ZVAL_TRUE(z: pzval); -begin - z^._type := IS_BOOL; - z^.value.lval := 1; -end; - -procedure ZVAL_FALSE(z: pzval); -begin - z^._type := IS_BOOL; - z^.value.lval := 0; -end; - -function ZENDLoaded: boolean; -begin - Result := PHPLib <> 0; -end; - -procedure UnloadZEND; -var - H : THandle; -begin - H := InterlockedExchange(Integer(PHPLib), 0); - if H > 0 then - begin - FreeLibrary(H); - end; -end; - - -function LoadZEND(const DllFilename: string) : boolean; -var - WriteFuncPtr : pointer; -begin - Result := false; - PHPLib := LoadLibrary(PChar(DllFileName)); -{$IFNDEF QUIET_LOAD} - if PHPLib = 0 then raise Exception.CreateFmt('%s not found', [DllFileName]); -{$ELSE} - if PHPLib = 0 then Exit; -{$ENDIF} - - {$IFDEF PHP5} - zend_objects_new := GetProcAddress(PHPLib, 'zend_objects_new'); - zend_get_std_object_handlers := GetProcAddress(PHPLib, 'zend_get_std_object_handlers'); - zend_objects_get_address := GetProcAddress(PHPLib, 'zend_objects_get_address'); - zend_is_true := GetProcAddress(PHPLib, 'zend_is_true'); -{$ENDIF} - - _zend_bailout := GetProcAddress(PHPLib, '_zend_bailout'); - - zend_disable_function := GetProcAddress(PHPLib, 'zend_disable_function'); - zend_disable_class := GetProcAddress(PHPLib, 'zend_disable_class'); - zend_register_list_destructors_ex := GetProcAddress(PHPLib, 'zend_register_list_destructors_ex'); - zend_register_resource := GetProcAddress(PHPLib, 'zend_register_resource'); - zend_fetch_resource := GetProcAddress(PHPLib, 'zend_fetch_resource'); - zend_list_insert := GetProcAddress(PHPLib, 'zend_list_insert'); - _zend_list_addref := GetProcAddress(PHPLib, '_zend_list_addref'); - _zend_list_delete := GetProcAddress(PHPLib, '_zend_list_delete'); - _zend_list_find := GetProcAddress(PHPLib, '_zend_list_find'); - zend_rsrc_list_get_rsrc_type := GetProcAddress(PHPLib, 'zend_rsrc_list_get_rsrc_type'); - zend_fetch_list_dtor_id := GetProcAddress(PHPLib, 'zend_fetch_list_dtor_id'); - - zend_get_compiled_filename := GetProcAddress(PHPLib, 'zend_get_compiled_filename'); - - zend_get_compiled_lineno := GetProcAddress(PHPLib, 'zend_get_compiled_lineno'); - - zend_ini_deactivate := GetProcAddress(PHPLib, 'zend_ini_deactivate'); - - // -- tsrm_startup - tsrm_startup := GetProcAddress(PHPLib, 'tsrm_startup'); - - // -- ts_allocate_id - ts_allocate_id := GetProcAddress(PHPLib, 'ts_allocate_id'); - - // -- ts_free_id - ts_free_id := GetProcAddress(PHPLib, 'ts_free_id'); - - - // -- zend_strndup - zend_strndup := GetProcAddress(PHPLib, 'zend_strndup'); - - - // -- _emalloc - _emalloc := GetProcAddress(PHPLib, '_emalloc'); - - - // -- _efree - _efree := GetProcAddress(PHPLib, '_efree'); - - - // -- _ecalloc - _ecalloc := GetProcAddress(PHPLib, '_ecalloc'); - - - // -- _erealloc - _erealloc := GetProcAddress(PHPLib, '_erealloc'); - - - // -- _estrdup - _estrdup := GetProcAddress(PHPLib, '_estrdup'); - - // -- _estrndup - _estrndup := GetProcAddress(PHPLib, '_estrndup'); - - // -- zend_set_memory_limit - zend_set_memory_limit := GetProcAddress(PHPLib, 'zend_set_memory_limit'); - - // -- start_memory_manager - start_memory_manager := GetProcAddress(PHPLib, 'start_memory_manager'); - - // -- shutdown_memory_manager - shutdown_memory_manager := GetProcAddress(PHPLib, 'shutdown_memory_manager'); - - {$IFDEF PHP4} - // -- zend_hash_init - zend_hash_init := GetProcAddress(PHPLib, 'zend_hash_init'); - // -- zend_hash_init_ex - zend_hash_init_ex := GetProcAddress(PHPLib, 'zend_hash_init_ex'); - - // -- zend_hash_quick_add_or_update - zend_hash_quick_add_or_update := GetProcAddress(PHPLib, 'zend_hash_quick_add_or_update'); - - // -- zend_hash_index_update_or_next_insert - zend_hash_index_update_or_next_insert := GetProcAddress(PHPLib, 'zend_hash_index_update_or_next_insert'); - - // -- zend_hash_merge - zend_hash_merge := GetProcAddress(PHPLib, 'zend_hash_merge'); - {$ENDIF} - - {$IFDEF PHP4} - // -- zend_hash_add_or_update - zend_hash_add_or_update := GetProcAddress(PHPLib, 'zend_hash_add_or_update'); - {$ELSE} - // -- zend_hash_add_or_update - zend_hash_add_or_update := GetProcAddress(PHPLib, '_zend_hash_add_or_update'); - {$ENDIF} - - // -- zend_hash_destroy - zend_hash_destroy := GetProcAddress(PHPLib, 'zend_hash_destroy'); - - // -- zend_hash_clean - zend_hash_clean := GetProcAddress(PHPLib, 'zend_hash_clean'); - - // -- zend_hash_add_empty_element - zend_hash_add_empty_element := GetProcAddress(PHPLib, 'zend_hash_add_empty_element'); - - // -- zend_hash_graceful_destroy - zend_hash_graceful_destroy := GetProcAddress(PHPLib, 'zend_hash_graceful_destroy'); - - // -- zend_hash_graceful_reverse_destroy - zend_hash_graceful_reverse_destroy := GetProcAddress(PHPLib, 'zend_hash_graceful_reverse_destroy'); - - // -- zend_hash_apply - zend_hash_apply := GetProcAddress(PHPLib, 'zend_hash_apply'); - - // -- zend_hash_apply_with_argument - zend_hash_apply_with_argument := GetProcAddress(PHPLib, 'zend_hash_apply_with_argument'); - - // -- zend_hash_reverse_apply - zend_hash_reverse_apply := GetProcAddress(PHPLib, 'zend_hash_reverse_apply'); - - // -- zend_hash_del_key_or_index - zend_hash_del_key_or_index := GetProcAddress(PHPLib, 'zend_hash_del_key_or_index'); - - // -- zend_get_hash_value - zend_get_hash_value := GetProcAddress(PHPLib, 'zend_get_hash_value'); - - // -- zend_hash_find - zend_hash_find := GetProcAddress(PHPLib, 'zend_hash_find'); - - // -- zend_hash_quick_find - zend_hash_quick_find := GetProcAddress(PHPLib, 'zend_hash_quick_find'); - - // -- zend_hash_index_find - zend_hash_index_find := GetProcAddress(PHPLib, 'zend_hash_index_find'); - - // -- zend_hash_exists - zend_hash_exists := GetProcAddress(PHPLib, 'zend_hash_exists'); - - // -- zend_hash_index_exists - zend_hash_index_exists := GetProcAddress(PHPLib, 'zend_hash_index_exists'); - - // -- zend_hash_next_free_element - zend_hash_next_free_element := GetProcAddress(PHPLib, 'zend_hash_next_free_element'); - - // -- zend_hash_move_forward_ex - zend_hash_move_forward_ex := GetProcAddress(PHPLib, 'zend_hash_move_forward_ex'); - - // -- zend_hash_move_backwards_ex - zend_hash_move_backwards_ex := GetProcAddress(PHPLib, 'zend_hash_move_backwards_ex'); - - // -- zend_hash_get_current_key_ex - zend_hash_get_current_key_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_key_ex'); - - // -- zend_hash_get_current_key_type_ex - zend_hash_get_current_key_type_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_key_type_ex'); - - // -- zend_hash_get_current_data_ex - zend_hash_get_current_data_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_data_ex'); - - // -- zend_hash_internal_pointer_reset_ex - zend_hash_internal_pointer_reset_ex := GetProcAddress(PHPLib, 'zend_hash_internal_pointer_reset_ex'); - - // -- zend_hash_internal_pointer_end_ex - zend_hash_internal_pointer_end_ex := GetProcAddress(PHPLib, 'zend_hash_internal_pointer_end_ex'); - - // -- zend_hash_copy - zend_hash_copy := GetProcAddress(PHPLib, 'zend_hash_copy'); - - - // -- zend_hash_sort - zend_hash_sort := GetProcAddress(PHPLib, 'zend_hash_sort'); - - // -- zend_hash_compare - zend_hash_compare := GetProcAddress(PHPLib, 'zend_hash_compare'); - - // -- zend_hash_minmax - zend_hash_minmax := GetProcAddress(PHPLib, 'zend_hash_minmax'); - - // -- zend_hash_num_elements - zend_hash_num_elements := GetProcAddress(PHPLib, 'zend_hash_num_elements'); - - // -- zend_hash_rehash - zend_hash_rehash := GetProcAddress(PHPLib, 'zend_hash_rehash'); - - // -- zend_hash_func - zend_hash_func := GetProcAddress(PHPLib, 'zend_hash_func'); - - // -- zend_get_constant - zend_get_constant := GetProcAddress(PHPLib, 'zend_get_constant'); - - // -- zend_register_long_constant - zend_register_long_constant := GetProcAddress(PHPLib, 'zend_register_long_constant'); - - // -- zend_register_double_constant - zend_register_double_constant := GetProcAddress(PHPLib, 'zend_register_double_constant'); - - // -- zend_register_string_constant - zend_register_string_constant := GetProcAddress(PHPLib, 'zend_register_string_constant'); - - // -- zend_register_stringl_constant - zend_register_stringl_constant := GetProcAddress(PHPLib, 'zend_register_stringl_constant'); - - // -- zend_register_constant - zend_register_constant := GetProcAddress(PHPLib, 'zend_register_constant'); - - // -- tsrm_shutdown - tsrm_shutdown := GetProcAddress(PHPLib, 'tsrm_shutdown'); - - // -- ts_resource_ex - ts_resource_ex := GetProcAddress(PHPLib, 'ts_resource_ex'); - - // -- ts_free_thread - ts_free_thread := GetProcAddress(PHPLib, 'ts_free_thread'); - - // -- zend_error - zend_error := GetProcAddress(PHPLib, 'zend_error'); - - // -- zend_error_cb - zend_error_cb := GetProcAddress(PHPLib, 'zend_error_cb'); - - // -- zend_eval_string - zend_eval_string := GetProcAddress(PHPLib, 'zend_eval_string'); - - // -- zend_make_compiled_string_description - zend_make_compiled_string_description := GetProcAddress(PHPLib, 'zend_make_compiled_string_description'); - - // -- _zval_dtor - _zval_dtor := GetProcAddress(PHPLib, '_zval_dtor'); - - // -- _zval_copy_ctor - _zval_copy_ctor := GetProcAddress(PHPLib, '_zval_copy_ctor'); - - // -- zend_print_variable - zend_print_variable := GetProcAddress(PHPLib, 'zend_print_variable'); - - // -- zend_stack_init - zend_stack_init := GetProcAddress(PHPLib, 'zend_stack_init'); - - // -- zend_stack_push - zend_stack_push := GetProcAddress(PHPLib, 'zend_stack_push'); - - // -- zend_stack_top - zend_stack_top := GetProcAddress(PHPLib, 'zend_stack_top'); - - // -- zend_stack_del_top - zend_stack_del_top := GetProcAddress(PHPLib, 'zend_stack_del_top'); - - // -- zend_stack_int_top - zend_stack_int_top := GetProcAddress(PHPLib, 'zend_stack_int_top'); - - // -- zend_stack_is_empty - zend_stack_is_empty := GetProcAddress(PHPLib, 'zend_stack_is_empty'); - - // -- zend_stack_destroy - zend_stack_destroy := GetProcAddress(PHPLib, 'zend_stack_destroy'); - - // -- zend_stack_base - zend_stack_base := GetProcAddress(PHPLib, 'zend_stack_base'); - - // -- zend_stack_count - zend_stack_count := GetProcAddress(PHPLib, 'zend_stack_count'); - - // -- zend_stack_apply - zend_stack_apply := GetProcAddress(PHPLib, 'zend_stack_apply'); - - // -- zend_stack_apply_with_argument - zend_stack_apply_with_argument := GetProcAddress(PHPLib, 'zend_stack_apply_with_argument'); - - // -- _convert_to_string - _convert_to_string := GetProcAddress(PHPLib, '_convert_to_string'); - - // -- add_function - add_function := GetProcAddress(PHPLib, 'add_function'); - - // -- sub_function - sub_function := GetProcAddress(PHPLib, 'sub_function'); - - // -- mul_function - mul_function := GetProcAddress(PHPLib, 'mul_function'); - - // -- div_function - div_function := GetProcAddress(PHPLib, 'div_function'); - - // -- mod_function - mod_function := GetProcAddress(PHPLib, 'mod_function'); - - // -- boolean_xor_function - boolean_xor_function := GetProcAddress(PHPLib, 'boolean_xor_function'); - - // -- boolean_not_function - boolean_not_function := GetProcAddress(PHPLib, 'boolean_not_function'); - - // -- bitwise_not_function - bitwise_not_function := GetProcAddress(PHPLib, 'bitwise_not_function'); - - // -- bitwise_or_function - bitwise_or_function := GetProcAddress(PHPLib, 'bitwise_or_function'); - - // -- bitwise_and_function - bitwise_and_function := GetProcAddress(PHPLib, 'bitwise_and_function'); - - // -- bitwise_xor_function - bitwise_xor_function := GetProcAddress(PHPLib, 'bitwise_xor_function'); - - // -- shift_left_function - shift_left_function := GetProcAddress(PHPLib, 'shift_left_function'); - - // -- shift_right_function - shift_right_function := GetProcAddress(PHPLib, 'shift_right_function'); - - // -- concat_function - concat_function := GetProcAddress(PHPLib, 'concat_function'); - - // -- is_equal_function - is_equal_function := GetProcAddress(PHPLib, 'is_equal_function'); - - // -- is_identical_function - is_identical_function := GetProcAddress(PHPLib, 'is_identical_function'); - - // -- is_not_identical_function - is_not_identical_function := GetProcAddress(PHPLib, 'is_not_identical_function'); - - // -- is_not_equal_function - is_not_equal_function := GetProcAddress(PHPLib, 'is_not_equal_function'); - - // -- is_smaller_function - is_smaller_function := GetProcAddress(PHPLib, 'is_smaller_function'); - - // -- is_smaller_or_equal_function - is_smaller_or_equal_function := GetProcAddress(PHPLib, 'is_smaller_or_equal_function'); - - // -- increment_function - increment_function := GetProcAddress(PHPLib, 'increment_function'); - - // -- decrement_function - decrement_function := GetProcAddress(PHPLib, 'decrement_function'); - - // -- convert_scalar_to_number - convert_scalar_to_number := GetProcAddress(PHPLib, 'convert_scalar_to_number'); - - // -- convert_to_long - convert_to_long := GetProcAddress(PHPLib, 'convert_to_long'); - - // -- convert_to_double - convert_to_double := GetProcAddress(PHPLib, 'convert_to_double'); - - // -- convert_to_long_base - convert_to_long_base := GetProcAddress(PHPLib, 'convert_to_long_base'); - - // -- convert_to_null - convert_to_null := GetProcAddress(PHPLib, 'convert_to_null'); - - // -- convert_to_boolean - convert_to_boolean := GetProcAddress(PHPLib, 'convert_to_boolean'); - - // -- convert_to_array - convert_to_array := GetProcAddress(PHPLib, 'convert_to_array'); - - // -- convert_to_object - convert_to_object := GetProcAddress(PHPLib, 'convert_to_object'); - - // -- add_char_to_string - add_char_to_string := GetProcAddress(PHPLib, 'add_char_to_string'); - - // -- add_string_to_string - add_string_to_string := GetProcAddress(PHPLib, 'add_string_to_string'); - - // -- zend_string_to_double - zend_string_to_double := GetProcAddress(PHPLib, 'zend_string_to_double'); - - // -- zval_is_true - zval_is_true := GetProcAddress(PHPLib, 'zval_is_true'); - - // -- compare_function - compare_function := GetProcAddress(PHPLib, 'compare_function'); - - // -- numeric_compare_function - numeric_compare_function := GetProcAddress(PHPLib, 'numeric_compare_function'); - - // -- string_compare_function - string_compare_function := GetProcAddress(PHPLib, 'string_compare_function'); - - // -- zend_str_tolower - zend_str_tolower := GetProcAddress(PHPLib, 'zend_str_tolower'); - - // -- zend_binary_zval_strcmp - zend_binary_zval_strcmp := GetProcAddress(PHPLib, 'zend_binary_zval_strcmp'); - - // -- zend_binary_zval_strncmp - zend_binary_zval_strncmp := GetProcAddress(PHPLib, 'zend_binary_zval_strncmp'); - - // -- zend_binary_zval_strcasecmp - zend_binary_zval_strcasecmp := GetProcAddress(PHPLib, 'zend_binary_zval_strcasecmp'); - - // -- zend_binary_zval_strncasecmp - zend_binary_zval_strncasecmp := GetProcAddress(PHPLib, 'zend_binary_zval_strncasecmp'); - - // -- zend_binary_strcmp - zend_binary_strcmp := GetProcAddress(PHPLib, 'zend_binary_strcmp'); - - // -- zend_binary_strncmp - zend_binary_strncmp := GetProcAddress(PHPLib, 'zend_binary_strncmp'); - - // -- zend_binary_strcasecmp - zend_binary_strcasecmp := GetProcAddress(PHPLib, 'zend_binary_strcasecmp'); - - // -- zend_binary_strncasecmp - zend_binary_strncasecmp := GetProcAddress(PHPLib, 'zend_binary_strncasecmp'); - - // -- zendi_smart_strcmp - zendi_smart_strcmp := GetProcAddress(PHPLib, 'zendi_smart_strcmp'); - - // -- zend_compare_symbol_tables - zend_compare_symbol_tables := GetProcAddress(PHPLib, 'zend_compare_symbol_tables'); - - // -- zend_compare_arrays - zend_compare_arrays := GetProcAddress(PHPLib, 'zend_compare_arrays'); - - // -- zend_compare_objects - zend_compare_objects := GetProcAddress(PHPLib, 'zend_compare_objects'); - - // -- zend_atoi - zend_atoi := GetProcAddress(PHPLib, 'zend_atoi'); - - // -- get_active_function_name - get_active_function_name := GetProcAddress(PHPLib, 'get_active_function_name'); - - // -- zend_get_executed_filename - zend_get_executed_filename := GetProcAddress(PHPLib, 'zend_get_executed_filename'); - - // -- zend_set_timeout - zend_set_timeout := GetProcAddress(PHPLib, 'zend_set_timeout'); - - // -- zend_unset_timeout - zend_unset_timeout := GetProcAddress(PHPLib, 'zend_unset_timeout'); - - // -- zend_timeout - zend_timeout := GetProcAddress(PHPLib, 'zend_timeout'); - - // -- zend_highlight - zend_highlight := GetProcAddress(PHPLib, 'zend_highlight'); - - // -- zend_strip - zend_strip := GetProcAddress(PHPLib, 'zend_strip'); - - // -- highlight_file - highlight_file := GetProcAddress(PHPLib, 'highlight_file'); - - // -- highlight_string - highlight_string := GetProcAddress(PHPLib, 'highlight_string'); - - // -- zend_html_putc - zend_html_putc := GetProcAddress(PHPLib, 'zend_html_putc'); - - // -- zend_html_puts - zend_html_puts := GetProcAddress(PHPLib, 'zend_html_puts'); - - // -- zend_indent - zend_indent := GetProcAddress(PHPLib, 'zend_indent'); - - // -- _zend_get_parameters_array_ex - _zend_get_parameters_array_ex := GetProcAddress(PHPLib, '_zend_get_parameters_array_ex'); - - // -- zend_ini_refresh_caches - zend_ini_refresh_caches := GetProcAddress(PHPLib, 'zend_ini_refresh_caches'); - - // -- zend_alter_ini_entry - zend_alter_ini_entry := GetProcAddress(PHPLib, 'zend_alter_ini_entry'); - - // -- zend_restore_ini_entry - zend_restore_ini_entry := GetProcAddress(PHPLib, 'zend_restore_ini_entry'); - - // -- zend_ini_long - zend_ini_long := GetProcAddress(PHPLib, 'zend_ini_long'); - - // -- zend_ini_double - zend_ini_double := GetProcAddress(PHPLib, 'zend_ini_double'); - - // -- zend_ini_string - zend_ini_string := GetProcAddress(PHPLib, 'zend_ini_string'); - - // -- compile_string - compile_string := GetProcAddress(PHPLib, 'compile_string'); - - // -- execute - execute := GetProcAddress(PHPLib, 'execute'); - - // -- zend_wrong_param_count - zend_wrong_param_count := GetProcAddress(PHPLib, 'zend_wrong_param_count'); - - // -- add_property_long_ex - add_property_long_ex := GetProcAddress(PHPLib, 'add_property_long_ex'); - - // -- add_property_null_ex - add_property_null_ex := GetProcAddress(PHPLib, 'add_property_null_ex'); - - // -- add_property_bool_ex - add_property_bool_ex := GetProcAddress(PHPLib, 'add_property_bool_ex'); - - // -- add_property_resource_ex - add_property_resource_ex := GetProcAddress(PHPLib, 'add_property_resource_ex'); - - // -- add_property_double_ex - add_property_double_ex := GetProcAddress(PHPLib, 'add_property_double_ex'); - - // -- add_property_string_ex - add_property_string_ex := GetProcAddress(PHPLib, 'add_property_string_ex'); - - // -- add_property_stringl_ex - add_property_stringl_ex := GetProcAddress(PHPLib, 'add_property_stringl_ex'); - - // -- add_property_zval_ex - add_property_zval_ex := GetProcAddress(PHPLib, 'add_property_zval_ex'); - - // -- add_assoc_long_ex - add_assoc_long_ex := GetProcAddress(PHPLib, 'add_assoc_long_ex'); - - // -- add_assoc_null_ex - add_assoc_null_ex := GetProcAddress(PHPLib, 'add_assoc_null_ex'); - - // -- add_assoc_bool_ex - add_assoc_bool_ex := GetProcAddress(PHPLib, 'add_assoc_bool_ex'); - - // -- add_assoc_resource_ex - add_assoc_resource_ex := GetProcAddress(PHPLib, 'add_assoc_resource_ex'); - - // -- add_assoc_double_ex - add_assoc_double_ex := GetProcAddress(PHPLib, 'add_assoc_double_ex'); - - // -- add_assoc_string_ex - add_assoc_string_ex := GetProcAddress(PHPLib, 'add_assoc_string_ex'); - - // -- add_assoc_stringl_ex - add_assoc_stringl_ex := GetProcAddress(PHPLib, 'add_assoc_stringl_ex'); - - // -- add_assoc_zval_ex - add_assoc_zval_ex := GetProcAddress(PHPLib, 'add_assoc_zval_ex'); - - // -- add_index_long - add_index_long := GetProcAddress(PHPLib, 'add_index_long'); - - // -- add_index_null - add_index_null := GetProcAddress(PHPLib, 'add_index_null'); - - // -- add_index_bool - add_index_bool := GetProcAddress(PHPLib, 'add_index_bool'); - - // -- add_index_resource - add_index_resource := GetProcAddress(PHPLib, 'add_index_resource'); - - // -- add_index_double - add_index_double := GetProcAddress(PHPLib, 'add_index_double'); - - // -- add_index_string - add_index_string := GetProcAddress(PHPLib, 'add_index_string'); - - // -- add_index_stringl - add_index_stringl := GetProcAddress(PHPLib, 'add_index_stringl'); - - // -- add_index_zval - add_index_zval := GetProcAddress(PHPLib, 'add_index_zval'); - - // -- add_next_index_long - add_next_index_long := GetProcAddress(PHPLib, 'add_next_index_long'); - - // -- add_next_index_null - add_next_index_null := GetProcAddress(PHPLib, 'add_next_index_null'); - - // -- add_next_index_bool - add_next_index_bool := GetProcAddress(PHPLib, 'add_next_index_bool'); - - // -- add_next_index_resource - add_next_index_resource := GetProcAddress(PHPLib, 'add_next_index_resource'); - - // -- add_next_index_double - add_next_index_double := GetProcAddress(PHPLib, 'add_next_index_double'); - - // -- add_next_index_string - add_next_index_string := GetProcAddress(PHPLib, 'add_next_index_string'); - - // -- add_next_index_stringl - add_next_index_stringl := GetProcAddress(PHPLib, 'add_next_index_stringl'); - - // -- add_next_index_zval - add_next_index_zval := GetProcAddress(PHPLib, 'add_next_index_zval'); - - // -- add_get_assoc_string_ex - add_get_assoc_string_ex := GetProcAddress(PHPLib, 'add_get_assoc_string_ex'); - - // -- add_get_assoc_stringl_ex - add_get_assoc_stringl_ex := GetProcAddress(PHPLib, 'add_get_assoc_stringl_ex'); - - // -- add_get_index_long - add_get_index_long := GetProcAddress(PHPLib, 'add_get_index_long'); - - // -- add_get_index_double - add_get_index_double := GetProcAddress(PHPLib, 'add_get_index_double'); - - // -- add_get_index_string - add_get_index_string := GetProcAddress(PHPLib, 'add_get_index_string'); - - // -- add_get_index_stringl - add_get_index_stringl := GetProcAddress(PHPLib, 'add_get_index_stringl'); - - // -- _array_init - _array_init := GetProcAddress(PHPLib, '_array_init'); - - // -- _object_init - _object_init := GetProcAddress(PHPLib, '_object_init'); - - // -- _object_init_ex - _object_init_ex := GetProcAddress(PHPLib, '_object_init_ex'); - - // -- _object_and_properties_init - _object_and_properties_init := GetProcAddress(PHPLib, '_object_and_properties_init'); - - // -- zend_register_internal_class - zend_register_internal_class := GetProcAddress(PHPLib, 'zend_register_internal_class'); - - // -- zend_register_internal_class_ex - zend_register_internal_class_ex := GetProcAddress(PHPLib, 'zend_register_internal_class_ex'); - - // -- get_zend_version - get_zend_version := GetProcAddress(PHPLib, 'get_zend_version'); - - // -- zend_make_printable_zval - zend_make_printable_zval := GetProcAddress(PHPLib, 'zend_make_printable_zval'); - - // -- zend_print_zval - zend_print_zval := GetProcAddress(PHPLib, 'zend_print_zval'); - - // -- zend_print_zval_r - zend_print_zval_r := GetProcAddress(PHPLib, 'zend_print_zval_r'); - - // -- zend_output_debug_string - zend_output_debug_string := GetProcAddress(PHPLib, 'zend_output_debug_string'); - - // -- zend_get_parameters - ZendGetParameters := GetProcAddress(PHPLib, 'zend_get_parameters'); - - zend_destroy_file_handle := GetProcAddress(PHPLib, 'zend_destroy_file_handle'); - - {$IFNDEF QUIET_LOAD} - CheckZendErrors; - {$ENDIF} +{*******************************************************} +{ PHP4Delphi } +{ ZEND - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: ZENDAPI.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit zendAPI; + +{$ifdef fpc} + {$mode delphi} +{$endif} + +interface + +uses + Windows, SysUtils, + ZendTypes, Variants, + PHPTypes; +type +TArrayVariant = array of variant; + TWSDate = array of string; + PWSDate = ^TWSDate; + TASDate = array of AnsiString; + PASDate = ^TWSDate; +const +PHPWin = +{$IFDEF PHP_DEBUG} +{$IFDEF PHP700} + 'php7phpdbg.dll' +{$ELSE} + {$IFDEF PHP5} + 'php5ts_debug.dll' + {$ELSE} + 'php4ts_debug.dll' + {$ENDIF} + {$ENDIF} +{$ELSE} + {$IFDEF PHP5} + {$IFDEF PHP700} + {$IFDEF LINUX} + 'php7ts.so' + {$ENDIF} + {$IFDEF MSWINDOWS} + 'php7ts.dll' + {$ENDIF} + {$ELSE} + {$IFDEF LINUX} + 'php5ts.so' + {$ENDIF} + {$IFDEF MSWINDOWS} + 'php5ts.dll' + {$ENDIF} + {$ENDIF} + {$ELSE} + 'php4ts.dll' + {$ENDIF} +{$ENDIF}; + +type + EPHP4DelphiException = class(Exception) + constructor Create(const Msg: AnsiString); + end; + + align_test = record + case Integer of + 1: (ptr: Pointer; ); + 2: (dbl: Double; ); + 3: (lng: Longint; ); + end; +const + PLATFORM_ALIGNMENT = (SizeOf(align_test)); + +function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; + +function LoadZEND(const DllFilename: AnsiString = PHPWin) : boolean; + +procedure UnloadZEND; +function ZENDLoaded: boolean; + +{Memory management functions} +var + {$IFDEF PHP700} + zend_strndup : function(const s: PChar; length: integer): PChar; cdecl; + {$ELSE} + zend_strndup : function(s: PAnsiChar; length: Integer): PAnsiChar; cdecl; + {$ENDIF} + _emalloc : function(size: size_t; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; + _efree : procedure(ptr: pointer; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint); cdecl; + _ecalloc : function(nmemb: size_t; size: size_t; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; + _erealloc : function(ptr: pointer; size: size_t; allow_failure: integer; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; + _estrdup : function(const s: PAnsiChar; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; + _estrndup : function(s: PAnsiChar; Len: Cardinal; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): PAnsiChar; cdecl; + _estrndupu : function(s: PUTF8Char; Len: Cardinal; __zend_filename: PUTF8Char; + __zend_lineno: uint; __zend_orig_filename: PUTF8Char; + __zend_orig_line_no: uint): PUTF8Char; cdecl; +function emalloc(size: size_t): pointer; +procedure efree(ptr: pointer); +function ecalloc(nmemb: size_t; size: size_t): pointer; +function erealloc(ptr: pointer; size: size_t; allow_failure: integer): pointer; +function estrdup(const s: PAnsiChar): PAnsiChar; +function estrndup(s: PAnsiChar; len: Cardinal): PAnsiChar; +function STR_EMPTY_ALLOC : PAnsiChar; + +var + zend_set_memory_limit : function(memory_limit: uint): integer; cdecl; + start_memory_manager : procedure(TSRMLS_D: pointer); cdecl; + shutdown_memory_manager : procedure(silent: integer; clean_cache: integer; TSRMLS_DC: pointer); cdecl; + + + { startup/shutdown } + +var + + zend_register_resource : function (rsrc_result : pzval; rsrc_pointer : pointer; rsrc_type : integer) : integer; cdecl; + zend_fetch_resource : function (passed_id : ppzval; TSRMLS_DC : pointer; default_id : integer; resource_type_name : PAnsiChar; found_resource_type : pointer; num_resource_types: integer; resource_type: integer) : pointer; cdecl; + zend_list_insert : function (ptr : pointer; _type: integer) : integer; cdecl; + {$IFNDEF PHP700} + _zend_list_addref : function (id : integer; TSRMLS_DC : pointer) : integer; cdecl; + _zend_list_delete : function (id : integer; TSRMLS_DC : pointer) : integer; cdecl; + _zend_list_find : function (id : integer; _type : pointer; TSRMLS_DC : pointer) : pointer; cdecl; + {$ENDIF} + zend_rsrc_list_get_rsrc_type : function (resource: integer; TSRMLS_DC : pointer) : PAnsiChar; cdecl; + zend_fetch_list_dtor_id : function (type_name : PAnsiChar) : integer; cdecl; + zend_register_list_destructors_ex : function (ld : pointer; pld : pointer; type_name : PAnsiChar; module_number : integer) : integer; cdecl; + + + +{disable functions} + +var + zend_disable_function : function(function_name : PAnsiChar; function_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; + zend_disable_class : function(class_name : PAnsiChar; class_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; + + +{$IFDEF PHP4} + zend_hash_add_or_update : function(ht: PHashTable; arKey: PAnsiChar; + nKeyLength: uint; pData: Pointer; nDataSize: uint; pDest: Pointer; + flag: Integer): Integer; cdecl; +{$ELSE} +var + _zend_hash_add_or_update : function (ht : PHashTable; arKey : PAnsiChar; + nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; + flag : integer; __zend_filename: PAnsiChar; __zend_lineno: uint) : integer; cdecl; + + function zend_hash_add_or_update(ht : PHashTable; arKey : PAnsiChar; + nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; + flag : integer) : integer; cdecl; + +{$ENDIF} + +function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; + +var + {$IFDEF PHP4} + zend_hash_init : function(ht: PHashTable; nSize: uint; + pHashFunction: pointer; pDestructor: pointer; + persistent: Integer): Integer; cdecl; + + zend_hash_init_ex : function(ht: PHashTable; nSize: uint; + pHashFunction: pointer; pDestructor: pointer; + persistent: Integer; bApplyProtection: boolean): Integer; cdecl; + + + zend_hash_quick_add_or_update : function(ht: PHashTable; arKey: PAnsiChar; + nKeyLength: uint; h: ulong; pData: Pointer; nDataSize: uint; + pDest: Pointer; flag: Integer): Integer; cdecl; + + zend_hash_index_update_or_next_insert : function(ht: PHashTable; h: ulong; + pData: Pointer; nDataSize: uint; pDest: Pointer; flag: Integer): Integer; cdecl; + + zend_hash_merge : procedure(target: PHashTable; source: PHashTable; + pCopyConstructor: pointer; tmp: Pointer; size: uint; overwrite: Integer); cdecl; + + {$ELSE} + + _zend_hash_init : function (ht : PHashTable; nSize : uint; + pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool; + __zend_filename: PAnsiChar; __zend_lineno: uint) : integer; cdecl; + _zend_hash_init_ex : function (ht : PHashTable; nSize : uint; + pHashFunction : pointer; pDestructor : pointer; persistent : zend_bool; + bApplyProtection : zend_bool; __zend_filename: PAnsiChar; __zend_lineno: uint): integer; cdecl; + + function zend_hash_init (ht : PHashTable; nSize : uint; pHashFunction : pointer; + pDestructor : pointer; persistent: zend_bool) : integer; cdecl; + function zend_hash_init_ex (ht : PHashTable; nSize : uint; pHashFunction : pointer; + pDestructor : pointer; persistent : zend_bool; bApplyProtection : zend_bool): integer; cdecl; + + +{$ENDIF} + +var + zend_hash_destroy : procedure(ht: PHashTable); cdecl; + zend_hash_clean : procedure(ht: PHashTable); cdecl; + + { additions/updates/changes } + + + + + zend_hash_add_empty_element : function(ht: PHashTable; arKey: PAnsiChar; + nKeyLength: uint): Integer; cdecl; + + + + +var + zend_hash_graceful_destroy : procedure(ht: PHashTable); cdecl; + zend_hash_graceful_reverse_destroy : zend_hash_graceful_reverse_destroy_t; + + zend_hash_apply : procedure(ht: PHashTable; apply_func: pointer; TSRMLS_DC: Pointer); cdecl; + + zend_hash_apply_with_argument : procedure(ht: PHashTable; + apply_func: pointer; _noname1: Pointer; TSRMLS_DC: Pointer); cdecl; + + { This function should be used with special care (in other words, + * it should usually not be used). When used with the ZEND_HASH_APPLY_STOP + * return value, it assumes things about the order of the elements in the hash. + * Also, it does not provide the same kind of reentrancy protection that + * the standard apply functions do. + } + + zend_hash_reverse_apply : procedure(ht: PHashTable; + apply_func: pointer; TSRMLS_DC: Pointer); cdecl; + + { Deletes } + + zend_hash_del_key_or_index : function(ht: PHashTable; arKey: PAnsiChar; + nKeyLength: uint; h: ulong; flag: Integer): Integer; cdecl; + + zend_get_hash_value : function(ht: PHashTable; arKey: PAnsiChar; + nKeyLength: uint): Longint; cdecl; + + { Data retreival } + + zend_hash_find : function(ht: PHashTable; arKey: PAnsiChar; nKeyLength: uint; + pData: Pointer): Integer; cdecl; + + zend_hash_quick_find : function(ht: PHashTable; arKey: PAnsiChar; + nKeyLength: uint; h: ulong; pData: Pointer): Integer; cdecl; + + zend_hash_index_find : function(ht: PHashTable; h: ulong; pData: Pointer): Integer; cdecl; + + { Misc } + + zend_hash_exists : function(ht: PHashTable; arKey: PAnsiChar; nKeyLength: uint): Integer; cdecl; + + zend_hash_index_exists : function(ht: PHashTable; h: ulong): Integer; cdecl; + + zend_hash_next_free_element : function(ht: PHashTable): Longint; cdecl; + + { traversing } + + zend_hash_move_forward_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; + + zend_hash_move_backwards_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; + + zend_hash_get_current_key_ex : function(ht: PHashTable; + var str_index: PAnsiChar; var str_length: uint; var num_index: ulong; + duplicate: boolean; pos: HashPosition): Integer; cdecl; + + zend_hash_get_current_key_type_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; + + zend_hash_get_current_data_ex : function(ht: PHashTable; pData: Pointer; pos: HashPosition): Integer; cdecl; + + zend_hash_internal_pointer_reset_ex : procedure(ht: PHashTable; pos: HashPosition); cdecl; + + zend_hash_internal_pointer_end_ex : procedure(ht: PHashTable; pos: HashPosition); cdecl; + + { Copying, merging and sorting } + + zend_hash_copy : procedure(target: PHashTable; source: PHashTable; + pCopyConstructor: pointer; tmp: Pointer; size: uint); cdecl; + + + zend_hash_sort : function(ht: PHashTable; sort_func: pointer; + compare_func: pointer; renumber: Integer; TSRMLS_DC: Pointer): Integer; cdecl; + + zend_hash_compare : function(ht1: PHashTable; ht2: PHashTable; + compar: pointer; ordered: boolean; TSRMLS_DC: Pointer): Integer; cdecl; + + zend_hash_minmax : function(ht: PHashTable; compar: pointer; + flag: Integer; pData: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; + + zend_hash_num_elements : function(ht: PHashTable): Integer; cdecl; + + zend_hash_rehash : function(ht: PHashTable): Integer; cdecl; + + zend_hash_func : function(arKey: PAnsiChar; nKeyLength: uint): Longint; cdecl; + + +function zend_hash_get_current_data(ht: PHashTable; pData: Pointer): Integer; cdecl; +procedure zend_hash_internal_pointer_reset(ht: PHashTable); cdecl; + + +var + zend_get_constant : function(name: PAnsiChar; name_len: uint; var result: zval; + TSRMLS_DC: Pointer): Integer; cdecl; + + zend_register_long_constant : procedure(name: PAnsiChar; name_len: uint; + lval: Longint; flags: Integer; module_number: Integer; TSRMLS_DC: Pointer); cdecl; + + zend_register_double_constant : procedure(name: PAnsiChar; name_len: uint; dval: Double; flags: Integer; module_number: Integer; + TSRMLS_DC: Pointer); cdecl; + + zend_register_string_constant : procedure(name: PAnsiChar; name_len: uint; strval: PAnsiChar; flags: Integer; module_number: Integer; + TSRMLS_DC: Pointer); cdecl; + + zend_register_stringl_constant : procedure(name: PAnsiChar; name_len: uint; + strval: PAnsiChar; strlen: uint; flags: Integer; module_number: Integer; + TSRMLS_DC: Pointer); cdecl; + + zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): Integer; cdecl; + + zend_register_auto_global : function(name: PAnsiChar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; + +procedure REGISTER_MAIN_LONG_CONSTANT(name: PAnsiChar; lval: longint; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: PAnsiChar; dval: double; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_STRING_CONSTANT(name: PAnsiChar; str: PAnsiChar; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_STRINGL_CONSTANT(name: PAnsiChar; str: PAnsiChar; len: uint; flags: integer; TSRMLS_DC: Pointer); + + +var + tsrm_startup : function(expected_threads: integer; + expected_resources: integer; debug_level: integer; debug_filename: PAnsiChar): integer; cdecl; + + ts_allocate_id : function(rsrc_id: pts_rsrc_id; size: size_t; ctor: pointer; dtor: pointer): ts_rsrc_id; cdecl; + // deallocates all occurrences of a given id + ts_free_id : procedure(id: ts_rsrc_id); cdecl; + + tsrm_shutdown : procedure(); cdecl; + ts_resource_ex : function(id: integer; p: pointer): pointer; cdecl; + ts_free_thread : procedure; cdecl; + + zend_error : procedure(ErrType: integer; ErrText: PAnsiChar); cdecl; + zend_error_cb : procedure; cdecl; + + zend_eval_string : function(str: PAnsiChar; val: pointer; strname: PAnsiChar; tsrm: pointer): integer; cdecl; + zend_make_compiled_string_description : function(a: PAnsiChar; tsrm: pointer): PAnsiChar; cdecl; + + {$IFDEF PHP4} + _zval_copy_ctor : function(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint): integer; cdecl; + _zval_dtor : procedure(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + {$ELSE} + _zval_copy_ctor_func : procedure(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + _zval_dtor_func : procedure(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + _zval_ptr_dtor: procedure(val: ppzval; __zend_filename: PAnsiChar); cdecl; + procedure _zval_copy_ctor (val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + procedure _zval_dtor(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + {$ENDIF} + +var + zend_print_variable : function(val: pzval): integer; cdecl; + + + zend_get_compiled_filename : function(TSRMLS_DC: Pointer): PAnsiChar; cdecl; + zend_get_compiled_lineno : function(TSRMLS_DC: Pointer): integer; cdecl; + + +{$IFDEF PHP4} +function zval_copy_ctor(val : pzval) : integer; +{$ENDIF} + +function ts_resource(id : integer) : pointer; +function tsrmls_fetch : pointer; + +//procedure zenderror(Error : PAnsiChar); + +var + zend_stack_init : function(stack: Pzend_stack): Integer; cdecl; + + zend_stack_push : function(stack: Pzend_stack; element: Pointer; size: Integer): Integer; cdecl; + + zend_stack_top : function(stack: Pzend_stack; element: Pointer): Integer; cdecl; + + zend_stack_del_top : function(stack: Pzend_stack): Integer; cdecl; + + zend_stack_int_top : function(stack: Pzend_stack): Integer; cdecl; + + zend_stack_is_empty : function(stack: Pzend_stack): Integer; cdecl; + + zend_stack_destroy : function(stack: Pzend_stack): Integer; cdecl; + + zend_stack_base : function(stack: Pzend_stack): Pointer; cdecl; + + zend_stack_count : function(stack: Pzend_stack): Integer; cdecl; + + zend_stack_apply : procedure(stack: Pzend_stack; _type: Integer; apply_function: Integer); cdecl; + + zend_stack_apply_with_argument : procedure(stack: Pzend_stack; _type: Integer; apply_function: Integer; arg: Pointer); cdecl; + + + //zend_operators.h + +var + _convert_to_string : procedure(op: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + +procedure convert_to_string(op: pzval); + +var + add_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + sub_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + mul_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + div_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + mod_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + boolean_xor_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + boolean_not_function : function(_result: Pzval; op1: Pzval): Integer; cdecl; + + bitwise_not_function : function(_result: Pzval; op1: Pzval): Integer; cdecl; + + bitwise_or_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + bitwise_and_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + bitwise_xor_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + shift_left_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + shift_right_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + concat_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + is_equal_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + is_identical_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + is_not_identical_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + is_not_equal_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + is_smaller_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + is_smaller_or_equal_function : function(_result: Pzval; op1: Pzval; var op2: zval; TSRMLS_DC: Pointer): Integer; cdecl; + + increment_function : function(op1: Pzval): Integer; cdecl; + + decrement_function : function(op2: Pzval): Integer; cdecl; + + convert_scalar_to_number : procedure(op: Pzval; TSRMLS_DC: Pointer); cdecl; + + convert_to_long : procedure(op: Pzval); cdecl; + + convert_to_double : procedure(op: Pzval); cdecl; + + convert_to_long_base : procedure(op: Pzval; base: Integer); cdecl; + + convert_to_null : procedure(op: Pzval); cdecl; + + convert_to_boolean : procedure(op: Pzval); cdecl; + + convert_to_array : procedure(op: Pzval); cdecl; + + convert_to_object : procedure(op: Pzval); cdecl; + + add_char_to_string : function(_result: Pzval; op1: Pzval; op2: Pzval): Integer; cdecl; + + add_string_to_string : function(_result: Pzval; op1: Pzval; op2: Pzval): Integer; cdecl; + + zend_string_to_double : function(number: PAnsiChar; length: zend_uint): Double; cdecl; + + zval_is_true : function(op: Pzval): Integer; cdecl; + + compare_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + numeric_compare_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + string_compare_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; + + zend_str_tolower : procedure(str: PAnsiChar; length: Integer); cdecl; + + zend_binary_zval_strcmp : function(s1: Pzval; s2: Pzval): Integer; cdecl; + + zend_binary_zval_strncmp : function(s1: Pzval; s2: Pzval; s3: Pzval): Integer; cdecl; + + zend_binary_zval_strcasecmp : function(s1: Pzval; s2: Pzval): Integer; cdecl; + + zend_binary_zval_strncasecmp : function(s1: Pzval; s2: Pzval; s3: Pzval): Integer; cdecl; + + zend_binary_strcmp : function(s1: PAnsiChar; len1: uint; s2: PAnsiChar; len2: uint): Integer; cdecl; + + zend_binary_strncmp : function(s1: PAnsiChar; len1: uint; s2: PAnsiChar; len2: uint; length: uint): Integer; cdecl; + + zend_binary_strcasecmp : function(s1: PAnsiChar; len1: uint; s2: PAnsiChar; len2: uint): Integer; cdecl; + + zend_binary_strncasecmp : function(s1: PAnsiChar; len1: uint; s2: PAnsiChar; len2: uint; length: uint): Integer; cdecl; + + zendi_smart_strcmp : procedure(_result: zval; s1: Pzval; s2: Pzval); cdecl; + + zend_compare_symbol_tables : procedure(_result: Pzval; ht1: PHashTable; ht2: PHashTable; TSRMLS_DC: Pointer); cdecl; + + zend_compare_arrays : procedure(_result: zval; a1: Pzval; a2: Pzval; TSRMLS_DC: Pointer); cdecl; + + zend_compare_objects : procedure(_result: Pzval; o1: Pzval; o2: Pzval; TSRMLS_DC: Pointer); cdecl; + + zend_atoi : function(str: PAnsiChar; str_len: Integer): Integer; cdecl; + + //zend_execute.h + get_active_function_name : function(TSRMLS_D: pointer): PAnsiChar; cdecl; + + zend_get_executed_filename : function(TSRMLS_D: pointer): PAnsiChar; cdecl; + + zend_get_executed_lineno : function(TSRMLS_DC: pointer): uint; cdecl; + + zend_set_timeout : procedure(seconds: Longint); cdecl; + + zend_unset_timeout : procedure(TSRMLS_D: pointer); cdecl; + + zend_timeout : procedure(dummy: Integer); cdecl; + + +var + zend_highlight : procedure(syntax_highlighter_ini: Pzend_syntax_highlighter_ini; TSRMLS_DC: Pointer); cdecl; + + zend_strip : procedure(TSRMLS_D: pointer); cdecl; + + highlight_file : function(filename: PAnsiChar; syntax_highlighter_ini: Pzend_syntax_highlighter_ini; TSRMLS_DC: Pointer): Integer; cdecl; + + highlight_string : function(str: Pzval; syntax_highlighter_ini: Pzend_syntax_highlighter_ini; str_name: PAnsiChar; TSRMLS_DC: Pointer): Integer; cdecl; + + zend_html_putc : procedure(c: AnsiChar); cdecl; + + zend_html_puts : procedure(s: PAnsiChar; len: uint; TSRMLS_DC: Pointer); cdecl; + + zend_indent : procedure; cdecl; + + ZendGetParameters : function: integer; cdecl; + zend_get_params_ex : function(param_count : Integer; Args : ppzval) :integer; cdecl varargs; +function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; +function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; + +function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; + +var + _zend_get_parameters_array_ex : function(param_count: integer; argument_array: pppzval; TSRMLS_CC: pointer): integer; cdecl; + +procedure dispose_pzval_array(Params: pzval_array); + +var + zend_ini_refresh_caches : procedure(stage: Integer; TSRMLS_DC: Pointer); cdecl; + + +var + _zend_bailout : procedure (filename : PAnsiChar; lineno : uint); cdecl; + + zend_alter_ini_entry : function(name: PAnsiChar; name_length: uint; new_value: PAnsiChar; new_value_length: uint; modify_type: Integer; stage: Integer): Integer; cdecl; + zend_alter_ini_entry_ex : function(name: PAnsiChar; name_length: uint; new_value: PAnsiChar; new_value_length: uint; modify_type: Integer; stage: Integer; force_change: integer): Integer; cdecl; + + zend_restore_ini_entry : function(name: PAnsiChar; name_length: uint; stage: Integer): Integer; cdecl; + + zend_ini_long : function(name: PAnsiChar; name_length: uint; orig: Integer): Longint; cdecl; + + zend_ini_double : function(name: PAnsiChar; name_length: uint; orig: Integer): Double; cdecl; + + zend_ini_string : function(name: PAnsiChar; name_length: uint; orig: Integer): PAnsiChar; cdecl; + + compile_string : function(source_string: pzval; filename: PAnsiChar; TSRMLS_DC: Pointer): pointer; cdecl; + + execute : procedure(op_array: pointer; TSRMLS_DC: Pointer); cdecl; + + zend_wrong_param_count : procedure(TSRMLS_D: pointer); cdecl; + _zend_hash_quick_add_or_update:function(ht: PHashTable; arKey: PAnsiChar; nKeyLength: uint; h: uint; out pData: pzval; nDataSize: uint; pDest: PPointer; flag: Integer) : Integer; cdecl; + {$IFDEF PHP4} + add_property_long_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; l: longint): integer; cdecl; + {$ELSE} + add_property_long_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; l: longint; TSRMLS_DC : pointer): integer; cdecl; + {$ENDIF} + + {$IFDEF PHP4} + add_property_null_ex : function(arg: pzval; key: PAnsiChar; key_len: uint): integer; cdecl; + add_property_bool_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; b: integer): integer; cdecl; + add_property_resource_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; r: integer): integer; cdecl; + add_property_double_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; d: double): integer; cdecl; + add_property_string_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; duplicate: integer): integer; cdecl; + add_property_stringl_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; len: uint; duplicate: integer): integer; cdecl; + add_property_zval_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; value: pzval): integer; cdecl; + {$ELSE} + add_property_null_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; TSRMLS_DC: Pointer): integer; cdecl; + add_property_bool_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; b: integer; TSRMLS_DC: Pointer): integer; cdecl; + add_property_resource_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; r: integer; TSRMLS_DC: Pointer): integer; cdecl; + add_property_double_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; d: double; TSRMLS_DC: Pointer): integer; cdecl; + add_property_string_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; + add_property_stringl_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; len: uint; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; + add_property_zval_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; value: pzval; TSRMLS_DC: Pointer): integer; cdecl; + {$ENDIF} + + + call_user_function : function(function_table: PHashTable; object_pp: pzval; + function_name: pzval; return_ptr: pzval; param_count: zend_uint; params: pzval_array_ex; + TSRMLS_DC: Pointer): integer; cdecl; + + call_user_function_ex : function(function_table: PHashTable; object_pp: pzval; + function_name: pzval; return_ptr_ptr: ppzval; param_count: zend_uint; + params: pzval_array; + no_separation: zend_uint; symbol_table: PHashTable; + TSRMLS_DC: Pointer): integer; cdecl; + +{ +call_user_function_ex(HashTable *function_table, + zval **object_pp, + zval *function_name, + zval **retval_ptr_ptr, + zend_uint param_count, + zval **params[], + int no_separation, + HashTable *symbol_table + TSRMLS_DC); +} + + + add_assoc_long_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; n: longint): integer; cdecl; + add_assoc_null_ex : function(arg: pzval; key: PAnsiChar; key_len: uint): integer; cdecl; + add_assoc_bool_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; b: integer): integer; cdecl; + add_assoc_resource_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; r: integer): integer; cdecl; + add_assoc_double_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; d: double): integer; cdecl; + add_assoc_string_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; duplicate: integer): integer; cdecl; + add_assoc_stringl_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; len: uint; duplicate: integer): integer; cdecl; + add_assoc_zval_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; value: pzval): integer; cdecl; + + add_index_long : function(arg: pzval; idx: uint; n: longint): integer; cdecl; + add_index_null : function(arg: pzval; idx: uint): integer; cdecl; + add_index_bool : function(arg: pzval; idx: uint; b: integer): integer; cdecl; + add_index_resource : function(arg: pzval; idx: uint; r: integer): integer; cdecl; + add_index_double : function(arg: pzval; idx: uint; d: double): integer; cdecl; + add_index_string : function(arg: pzval; idx: uint; str: PAnsiChar; duplicate: integer): integer; cdecl; + add_index_stringl : function(arg: pzval; idx: uint; str: PAnsiChar; len: uint; duplicate: integer): integer; cdecl; + add_index_zval : function(arg: pzval; index: uint; value: pzval): integer; cdecl; + + add_next_index_long : function(arg: pzval; n: longint): integer; cdecl; + add_next_index_null : function(arg: pzval): integer; cdecl; + add_next_index_bool : function(arg: pzval; b: integer): integer; cdecl; + add_next_index_resource : function(arg: pzval; r: integer): integer; cdecl; + add_next_index_double : function(arg: pzval; d: double): integer; cdecl; + add_next_index_string : function(arg: pzval; str: PAnsiChar; duplicate: integer): integer; cdecl; + add_next_index_stringl : function(arg: pzval; str: PAnsiChar; len: uint; duplicate: integer): integer; cdecl; + add_next_index_zval : function(arg: pzval; value: pzval): integer; cdecl; + + add_get_assoc_string_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; dest: pointer; duplicate: integer): integer; cdecl; + add_get_assoc_stringl_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; len: uint; dest: pointer; duplicate: integer): integer; cdecl; + + add_get_index_long : function(arg: pzval; idx: uint; l: longint; dest: pointer): integer; cdecl; + add_get_index_double : function(arg: pzval; idx: uint; d: double; dest: pointer): integer; cdecl; + add_get_index_string : function(arg: pzval; idx: uint; str: PAnsiChar; dest: pointer; duplicate: integer): integer; cdecl; + add_get_index_stringl : function(arg: pzval; idx: uint; str: PAnsiChar; len: uint; dest: pointer; duplicate: integer): integer; cdecl; + + _array_init : function(arg: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint): integer; cdecl; + + {$IFDEF PHP4} + _object_init : function(arg: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; + {$ELSE} + _object_init : function(arg: pzval;TSRMLS_DC: pointer): integer; cdecl; + {$ENDIF} + + {$IFDEF PHP4} + _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_filename: PAnsiChar; __zend_lineno: uint; TSRMLS_DC: pointer) : integer; cdecl; + {$ELSE} + _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_lineno : integer; TSRMLS_DC : pointer) : integer; cdecl; + {$ENDIF} + + _object_and_properties_init : function(arg: pzval; ce: pointer; properties: phashtable; __zend_filename: PAnsiChar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; + + + {$IFDEF PHP5} + zend_destroy_file_handle : procedure(file_handle : PZendFileHandle; TSRMLS_DC : pointer); cdecl; + {$ENDIF} + +var + zend_write : zend_write_t; + +procedure ZEND_PUTS(str: PAnsiChar); + + +var + zend_register_internal_class : function(class_entry: pzend_class_entry; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; + zend_register_internal_class_ex : function(class_entry: pzend_class_entry; parent_ce: pzend_class_entry; parent_name: PAnsiChar; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; + function ZvalInt(z:zval):Integer; + function ZvalDouble(z:zval):Double; + function ZvalBool(z:zval):Boolean; + + function ZvalStrS(z:zval) : string; + function ZvalStr(z:zval) : AnsiString; + function ZvalStrW(z:zval) : WideString; + + procedure ZvalVAL(z:pzval; v:Boolean) overload; + procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG) overload; + procedure ZvalVAL(z:pzval) overload; + procedure ZvalVAL(z:pzval; v:Double) overload; + procedure ZvalVAL(z: pzval; s: AnsiString; len: Integer = 0); overload; + procedure ZvalString(z:pzval) overload; + procedure ZvalString(z:pzval; s:PAnsiChar; len:Integer = 0) overload; + procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0) overload; + procedure ZvalString(z:pzval; s:string; len:Integer = 0) overload; + +function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; +function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) + : Integer; overload; +function ZvalArrayAdd(z: pzval; key: AnsiString; Args: array of const) + : Integer; overload; + +function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; +function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) + : Boolean; overload; +function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; +function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) + : Boolean; overload; +function ZValArrayKeyDel(v: pzval; key: AnsiString): Boolean; overload; +function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; + +function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) + : Boolean; overload; +function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) + : Boolean; overload; + + function GetArgPZval(Args: TVarRec; const _type: Integer = IS_LONG; + Make: Boolean = false): pzval; +procedure ZVAL_RESOURCE(value: pzval; l: longint); +procedure ZVAL_BOOL(z: pzval; b: boolean); +procedure ZVAL_NULL(z: pzval); +procedure ZVAL_LONG(z: pzval; l: longint); +procedure ZVAL_DOUBLE(z: pzval; d: double); +procedure ZVAL_EMPTY_STRING(z: pzval); +procedure ZVAL_TRUE(z: pzval); +procedure ZVAL_FALSE(z: pzval); +function add_next_index_variant(arg: pzval; value: variant): integer; +procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; +procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; +procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; +procedure ZVAL_ARRAY(z: pzval; arr: array of ansistring); overload; +procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; +procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; +procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; +procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of PAnsiChar; keyvals: Array of PAnsiChar); +procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of PWideChar); +procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array of AnsiString); overload; +procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; +procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overload; +procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of string); overload; +procedure HashToArray(HT: PHashTable; var AR: TArrayVariant); overload; +procedure ArrayToHash(AR: Array of Variant; var HT: pzval); overload; +procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; +function ToStrA(V: Variant): AnsiString; +function ToStr(V: Variant): String; +function toWChar(s: PAnsiChar): PWideChar; +function ZendToVariant(const Value: pppzval): Variant; overload; +function ZendToVariant(const Value: ppzval): Variant; overload; + +procedure ZVAL_STRING(z: pzval; s: PAnsiChar; duplicate: boolean); +procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); +procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); + +procedure ZVAL_STRINGL(z: pzval; s: PAnsiChar; l: integer; duplicate: boolean); +procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); + +procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: PAnsiChar; functions: pointer); + + +var + get_zend_version : function(): PAnsiChar; cdecl; + zend_make_printable_zval : procedure(expr: pzval; expr_copy: pzval; use_copy: pint); cdecl; + zend_print_zval : function(expr: pzval; indent: integer): integer; cdecl; + zend_print_zval_r : procedure(expr: pzval; indent: integer); cdecl; + zend_output_debug_string : procedure(trigger_break: boolean; Msg: PAnsiChar); cdecl; + +{$IFDEF PHP5} + zend_copy_constants: procedure(target: PHashTable; source: PHashTable); cdecl; + zend_objects_new : function (_object : pointer; class_type : pointer; TSRMLS_DC : pointer) : _zend_object_value; cdecl; + zend_objects_clone_obj: function(_object: pzval; TSRMLS_DC : pointer): _zend_object_value; cdecl; + zend_objects_store_add_ref: procedure (_object : pzval; TSRMLS_DC : pointer); cdecl; + zend_objects_store_del_ref: procedure (_object : pzval; TSRMLS_DC : pointer); cdecl; + + function_add_ref: procedure (func: PZendFunction); cdecl; + + zend_class_add_ref: procedure(aclass: Ppzend_class_entry); cdecl; + + +{$ENDIF} + + +const + MSCRT = 'msvcrt.dll'; + +//Microsoft C++ functions + +{$IFDEF PHP4} +function pipe(phandles : pointer; psize : uint; textmode : integer) : integer; cdecl; external MSCRT name '_pipe'; +procedure close(AHandle : THandle); cdecl; external MSCRT name '_close'; +function _write(AHandle : integer; ABuffer : pointer; count : uint) : integer; cdecl; external MSCRT name '_write'; +function setjmp(buf : jump_buf) : integer; cdecl; external MSCRT name '_setjmp3'; +{$ENDIF} + +{$IFNDEF COMPILER_VC9} +function strdup(strSource : PAnsiChar) : PAnsiChar; cdecl; external MSCRT name '_strdup'; +{$ELSE} +function DupStr(strSource : PAnsiChar) : PAnsiChar; cdecl; +{$ENDIF} + +function ZEND_FAST_ALLOC: pzval; +function ALLOC_ZVAL: pzval; overload; +procedure ALLOC_ZVAL(out Result: pzval); overload; +procedure INIT_PZVAL(p: pzval); +function MAKE_STD_ZVAL: pzval; overload; +procedure MAKE_STD_ZVAL(out Result: pzval); overload; + +{$IFNDEF QUIET_LOAD} +procedure CheckZendErrors; +{$ENDIF} + +var + PHPLib : THandle = 0; + +var + zend_ini_deactivate : function(TSRMLS_D : pointer) : integer; cdecl; + +function GetGlobalResource(resource_name: AnsiString) : pointer; + +function GetCompilerGlobals : Pzend_compiler_globals; +function GetExecutorGlobals : pzend_executor_globals; +function GetAllocGlobals : pointer; + +function zend_register_functions(functions : pzend_function_entry; function_table : PHashTable; _type: integer; TSRMLS_DC : pointer) : integer; +function zend_unregister_functions(functions : pzend_function_entry; count : integer; function_table : PHashTable; TSRMLS_DC : pointer) : integer; + +{$IFDEF PHP5} + +var + zend_get_std_object_handlers : function() : pzend_object_handlers; + zend_objects_get_address : function (_object : pzval; TSRMLS_DC : pointer) : pzend_object; cdecl; + zend_is_true : function(z : pzval) : integer; cdecl; + +function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : integer; cdecl; assembler; + +function Z_LVAL(z : Pzval) : longint; +function Z_BVAL(z : Pzval) : boolean; +function Z_DVAL(z : Pzval) : double; +function Z_STRVAL(z : Pzval) : AnsiString; +function Z_STRUVAL(z : PZval): UTF8String; +function Z_STRWVAL(z : pzval) : String; +function Z_STRLEN(z : Pzval) : longint; +function Z_ARRVAL(z : Pzval ) : PHashTable; +function Z_OBJ_HANDLE(z :Pzval) : zend_object_handle; +function Z_OBJ_HT(z : Pzval) : pzend_object_handlers; +function Z_OBJPROP(z : Pzval) : PHashtable; +function Z_VARREC(z: pzval): TVarRec; + + procedure zend_addref_p(z: pzval); cdecl; + procedure my_class_add_ref(aclass: Ppzend_class_entry); cdecl; + procedure copy_zend_constant(C: PZendConstant); cdecl; + + +{$ENDIF} + +implementation + + +function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; +begin + result := zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDest, HASH_ADD); +end; + +function STR_EMPTY_ALLOC : PAnsiChar; +begin + Result := estrndup('', 0); +end; + +function estrndup(s: PAnsiChar; len: Cardinal): PAnsiChar; +begin + if assigned(s) then + Result := _estrndup(s, len, nil, 0, nil, 0) + else + Result := nil; +end; +function estrndupu(s: PUtf8Char; len: Cardinal): PUTf8Char; +begin + if assigned(s) then + Result := _estrndupu(s, len, nil, 0, nil, 0) + else + Result := nil; +end; +function emalloc(size: size_t): pointer; +begin + Result := _emalloc(size, nil, 0, nil, 0); +end; + +procedure efree(ptr: pointer); +begin + _efree(ptr, nil, 0, nil, 0); +end; + +function ecalloc(nmemb: size_t; size: size_t): pointer; +begin + Result := _ecalloc(nmemb, size, nil, 0, nil, 0); +end; + +function erealloc(ptr: pointer; size: size_t; allow_failure: integer): pointer; +begin + Result := _erealloc(ptr, size, allow_failure, nil, 0, nil, 0); +end; + +function estrdup(const s: PAnsiChar): PAnsiChar; +begin + if assigned(s) then + begin + Result := _estrdup(s, nil, 0, nil, 0); + end + else + Result := nil; +end; + + +procedure REGISTER_MAIN_LONG_CONSTANT(name: PAnsiChar; lval: longint; flags: integer; TSRMLS_DC: Pointer); +begin + zend_register_long_constant(name, length(name) + 1, lval, flags, 0, TSRMLS_DC); +end; + +procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: PAnsiChar; dval: double; flags: integer; TSRMLS_DC: Pointer); +begin + zend_register_double_constant(name, length(name) + 1, dval, flags, 0, TSRMLS_DC); +end; + +procedure REGISTER_MAIN_STRING_CONSTANT(name: PAnsiChar; str: PAnsiChar; flags: integer; TSRMLS_DC: Pointer); +begin + zend_register_string_constant(name, length(name) + 1, str, flags, 0, TSRMLS_DC); +end; + +procedure REGISTER_MAIN_STRINGL_CONSTANT(name: PAnsiChar; str: PAnsiChar; len: uint; flags: integer; TSRMLS_DC: Pointer); +begin + zend_register_stringl_constant(name, length(name) + 1, str, len, flags, 0, TSRMLS_DC); +end; + +procedure ZVAL_RESOURCE(value: pzval; l: longint); +begin + value^._type := IS_RESOURCE; + value^.value.lval := l; +end; + +procedure ZVAL_BOOL(z: pzval; b: boolean); +begin + z^._type := IS_BOOL; + z^.value.lval := integer(b); +end; + +procedure ZVAL_NULL(z: pzval); +begin + z^._type := IS_NULL; +end; + +procedure ZVAL_LONG(z: pzval; l: longint); +begin + z^._type := IS_LONG; + z^.value.lval := l; +end; + +procedure ZVAL_DOUBLE(z: pzval; d: double); +begin + z^._type := IS_DOUBLE; + z^.value.dval := d; +end; +procedure ZvalString(z:pzval); +begin + z^.value.str.len := 0; + z^.value.str.val := ''; + z^._type := IS_STRING; +end; - WriteFuncPtr := GetProcAddress(PHPLib, 'zend_write'); - if Assigned(WriteFuncPtr) then - @zend_write := pointer(WriteFuncPtr^); +procedure ZvalString(z:pzval; s:PAnsiChar; len:Integer = 0); +var + lens:Integer; +begin + if not assigned(s) then + ZvalString(z) + else begin + if len = 0 then + lens := Length(s) + else + lens := len; - Result := true; + z^.value.str.len := lens; + z^.value.str.val := estrndup(s, lens); + z^._type := IS_STRING; + end; end; -procedure ZEND_PUTS(str: PChar); +procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0); begin - if assigned(str) then - zend_write(str, strlen(str)); + if not assigned(s) then + ZvalString(z) + else + ZvalString(z, PAnsiChar(AnsiString(WideString(s))), len); end; -procedure convert_to_string(op: pzval); +procedure ZvalString(z:pzval; s:string; len:Integer = 0); +var + _s:PWideChar; +begin + _s := PWideChar(s); + + if not assigned(_s) then + ZvalString(z) + else + ZvalString(z, _s, len); +end; +function ZvalInt; begin - _convert_to_string(op, nil, 0); + Result := z.value.lval; end; -procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: pchar; functions: pointer); +function ZvalDouble; begin - if class_name = nil then - Exit; - FillChar(class_container, sizeof(Tzend_class_entry), 0); - - {$IFDEF PHP5} - {$IFDEF PHP512} - class_container.name := estrdup(class_name); - {$ELSE} - {$IFDEF PHP511} - class_container.name := estrdup(class_name); - {$ELSE} - class_container.name := PChar(class_name); - {$ENDIF} - {$ENDIF} - {$ELSE} - class_container.name := estrdup(class_name); - {$ENDIF} - - class_container.name_length := strlen(class_name); - class_container.builtin_functions := functions; - - {$IFDEF PHP4} - class_container.handle_function_call := nil; - class_container.handle_property_get := nil; - class_container.handle_property_set := nil; - {$ENDIF} + Result := z.value.dval; end; -function ZEND_FAST_ALLOC: pzval; +function ZvalBool; begin - Result := emalloc(sizeof(zval)); + Result := boolean(z.value.lval); end; -function ALLOC_ZVAL: pzval; +function ZvalStrS; begin - Result := emalloc(sizeof(zval)); + Result := z.value.str.val; end; -procedure INIT_PZVAL(p: pzval); +function ZvalStr; begin - p^.refcount := 1; - p^.is_ref := 0; + Result := z.value.str.val; end; -function MAKE_STD_ZVAL: pzval; +function ZvalStrW; begin - Result := ALLOC_ZVAL; - INIT_PZVAL(Result); + Result := WideString(z.value.str.val); end; -function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; +procedure ZvalVAL(z:pzval; v:Boolean); +Begin + z._type := IS_BOOL; + z.value.lval := integer(v); +End; + +procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); +Begin + z._type := _type; + z.value.lval := v; +End; + +procedure ZvalVAL(z:pzval); +Begin + z._type := IS_NULL; +End; + +procedure ZvalVAL(z:pzval; v:Double); +Begin + z._type := IS_LONG; + z.value.dval := v; +End; +procedure ZvalVAL(z: pzval; s: AnsiString; len: Integer = 0); var - i : integer; + lens: Integer; + AChar: PAnsiChar; begin - SetLength(Params, number); - if number = 0 then + AChar := PAnsiChar(s); + + if not assigned(AChar) then + ZVAL_NULL(z) + else begin - Result := SUCCESS; - Exit; - end; - for i := 0 to number - 1 do - New(Params[i]); - Result := zend_get_parameters(number, number, Params); -end; + if len = 0 then + lens := Length(AChar) + else + lens := len; -function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; assembler; register; -asm - push esi - mov esi, ecx - mov ecx, [ebp+8] - cmp ecx, 0 - je @first - @toploop: - {$IFDEF VERSION6} - push [esi][ecx * 4] - {$ELSE} - push dword [esi][ecx * 4] - {$ENDIF} - loop @toploop - @first: - push dword [esi] - push edx - push eax - call ZendGetParameters - mov ecx, [ebp+8] - add ecx, 3 - @toploop2: - pop edx - loop @toploop2 - pop esi + z^.value.str.len := lens; + z^.value.str.val := _estrndup(AChar, lens, nil, 0, nil, 0); + z^._type := IS_STRING; + end; end; -procedure dispose_pzval_array(Params: pzval_array); +function AddElementZvalArray(z: pzval; Args: array of const; flag: Integer; + idx: uint = 0; len: uint = 0; const key: AnsiString = ''): Integer; var - i : integer; + tmp: pzval; + arKey: PAnsiChar; begin - for i := 0 to High(Params) do - FreeMem(Params[i]); -end; + Result := FAILURE; + if z._type <> IS_ARRAY then + exit; -{ EPHP4DelphiException } + if len <> 0 then + begin + inc(len); + arKey := PAnsiChar(key); + idx := zend_hash_func(arKey, len); + end; -constructor EPHP4DelphiException.Create(const Msg: string); + tmp := GetArgPZval(Args[0], 1, true); + Result := _zend_hash_quick_add_or_update(z.value.ht, arKey, len, idx, tmp, + sizeof(pzval), nil, flag); +end; +// Add Next +function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; begin - inherited Create('Unable to link '+ Msg+' function'); + Result := FAILURE; + if z._type <> IS_ARRAY then + exit; + Result := AddElementZvalArray(z, Args, HASH_NEXT_INSERT, + z.value.ht.nNextFreeElement); end; -procedure zenderror(Error : PChar); +// Add Index +function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) + : Integer; overload; begin - zend_error(E_PARSE, Error); + Result := AddElementZvalArray(z, Args, HASH_UPDATE, idx); end; +// Add Assoc +function ZvalArrayAdd(z: pzval; key: AnsiString; Args: array of const) + : Integer; overload; +begin + Result := AddElementZvalArray(z, Args, HASH_UPDATE, 0, Length(key), key); +end; -{$IFNDEF QUIET_LOAD} -procedure CheckZendErrors; +function IsArrayRetVal(v: pzval): Boolean; begin - if @zend_disable_function = nil then raise EPHP4DelphiException.Create('zend_disable_function'); - if @zend_disable_class = nil then raise EPHP4DelphiException.Create('zend_disable_class'); - if @zend_register_list_destructors_ex = nil then raise EPHP4DelphiException.Create('zend_register_list_destructors_ex'); - if @zend_register_resource = nil then raise EPHP4DelphiException.Create('zend_register_resource'); - if @zend_fetch_resource = nil then raise EPHP4DelphiException.Create('zend_fetch_resource'); - if @zend_list_insert = nil then raise EPHP4DelphiException.Create('zend_list_insert'); - if @_zend_list_addref = nil then raise EPHP4DelphiException.Create('zend_list_addref'); - if @_zend_list_delete = nil then raise EPHP4DelphiException.Create('zend_list_delete'); - if @_zend_list_find = nil then raise EPHP4DelphiException.Create('_zend_list_find'); - if @zend_rsrc_list_get_rsrc_type = nil then raise EPHP4DelphiException.Create('zend_rsrc_list_get_rsrc_type'); - if @zend_fetch_list_dtor_id = nil then raise EPHP4DelphiException.Create('zend_fetch_list_dtor_id'); - if @zend_get_compiled_filename = nil then raise EPHP4DelphiException.Create('zend_get_compiled_filename'); - if @zend_get_compiled_lineno = nil then raise EPHP4DelphiException.Create('zend_get_compiled_lineno'); - if @tsrm_startup = nil then raise EPHP4DelphiException.Create('tsrm_startup'); - if @ts_allocate_id = nil then raise EPHP4DelphiException.Create('ts_allocate_id'); - if @ts_free_id = nil then raise EPHP4DelphiException.Create('ts_free_id'); - if @zend_strndup = nil then raise EPHP4DelphiException.Create('zend_strndup'); - if @_emalloc = nil then raise EPHP4DelphiException.Create('_emalloc'); - if @_efree = nil then raise EPHP4DelphiException.Create('_efree'); - if @_ecalloc = nil then raise EPHP4DelphiException.Create('_ecalloc'); - if @_erealloc = nil then raise EPHP4DelphiException.Create('_erealloc'); - if @_estrdup = nil then raise EPHP4DelphiException.Create('_estrdup'); - if @_estrndup = nil then raise EPHP4DelphiException.Create('_estrndup'); - if @zend_set_memory_limit = nil then raise EPHP4DelphiException.Create('zend_set_memory_limit'); - if @start_memory_manager = nil then raise EPHP4DelphiException.Create('start_memory_manager'); - if @shutdown_memory_manager = nil then raise EPHP4DelphiException.Create('shutdown_memory_manager'); - {$IFDEF PHP4} - if @zend_hash_init = nil then raise EPHP4DelphiException.Create('zend_hash_init'); - if @zend_hash_init_ex = nil then raise EPHP4DelphiException.Create('zend_hash_init_ex'); - if @zend_hash_add_or_update = nil then raise EPHP4DelphiException.Create('zend_hash_add_or_update'); - if @zend_hash_quick_add_or_update = nil then raise EPHP4DelphiException.Create('zend_hash_quick_add_or_update'); - if @zend_hash_index_update_or_next_insert = nil then raise EPHP4DelphiException.Create('zend_hash_index_update_or_next_insert'); - if @zend_hash_merge = nil then raise EPHP4DelphiException.Create('zend_hash_merge'); - {$ENDIF} - - {$IFDEF PHP5} - if @zend_hash_add_or_update = nil then raise EPHP4DelphiException.Create('_zend_hash_add_or_update'); - {$ENDIF} - - if @zend_hash_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_destroy'); - if @zend_hash_clean = nil then raise EPHP4DelphiException.Create('zend_hash_clean'); - if @zend_hash_add_empty_element = nil then raise EPHP4DelphiException.Create('zend_hash_add_empty_element'); - if @zend_hash_graceful_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_graceful_destroy'); - if @zend_hash_graceful_reverse_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_graceful_reverse_destroy'); - if @zend_hash_apply = nil then raise EPHP4DelphiException.Create('zend_hash_apply'); - if @zend_hash_apply_with_argument = nil then raise EPHP4DelphiException.Create('zend_hash_apply_with_argument'); - if @zend_hash_reverse_apply = nil then raise EPHP4DelphiException.Create('zend_hash_reverse_apply'); - if @zend_hash_del_key_or_index = nil then raise EPHP4DelphiException.Create('zend_hash_del_key_or_index'); - if @zend_get_hash_value = nil then raise EPHP4DelphiException.Create('zend_get_hash_value'); - if @zend_hash_find = nil then raise EPHP4DelphiException.Create('zend_hash_find'); - if @zend_hash_quick_find = nil then raise EPHP4DelphiException.Create('zend_hash_quick_find'); - if @zend_hash_index_find = nil then raise EPHP4DelphiException.Create('zend_hash_index_find'); - if @zend_hash_exists = nil then raise EPHP4DelphiException.Create('zend_hash_exists'); - if @zend_hash_index_exists = nil then raise EPHP4DelphiException.Create('zend_hash_index_exists'); - if @zend_hash_next_free_element = nil then raise EPHP4DelphiException.Create('zend_hash_next_free_element'); - if @zend_hash_move_forward_ex = nil then raise EPHP4DelphiException.Create('zend_hash_move_forward_ex'); - if @zend_hash_move_backwards_ex = nil then raise EPHP4DelphiException.Create('zend_hash_move_backwards_ex'); - if @zend_hash_get_current_key_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_key_ex'); - if @zend_hash_get_current_key_type_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_key_type_ex'); - if @zend_hash_get_current_data_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_data_ex'); - if @zend_hash_internal_pointer_reset_ex = nil then raise EPHP4DelphiException.Create('zend_hash_internal_pointer_reset_ex'); - if @zend_hash_internal_pointer_end_ex = nil then raise EPHP4DelphiException.Create('zend_hash_internal_pointer_end_ex'); - if @zend_hash_copy = nil then raise EPHP4DelphiException.Create('zend_hash_copy'); - if @zend_hash_sort = nil then raise EPHP4DelphiException.Create('zend_hash_sort'); - if @zend_hash_compare = nil then raise EPHP4DelphiException.Create('zend_hash_compare'); - if @zend_hash_minmax = nil then raise EPHP4DelphiException.Create('zend_hash_minmax'); - if @zend_hash_num_elements = nil then raise EPHP4DelphiException.Create('zend_hash_num_elements'); - if @zend_hash_rehash = nil then raise EPHP4DelphiException.Create('zend_hash_rehash'); - if @zend_hash_func = nil then raise EPHP4DelphiException.Create('zend_hash_func'); - if @zend_get_constant = nil then raise EPHP4DelphiException.Create('zend_get_constant'); - if @zend_register_long_constant = nil then raise EPHP4DelphiException.Create('zend_register_long_constant'); - if @zend_register_double_constant = nil then raise EPHP4DelphiException.Create('zend_register_double_constant'); - if @zend_register_string_constant = nil then raise EPHP4DelphiException.Create('zend_register_string_constant'); - if @zend_register_stringl_constant = nil then raise EPHP4DelphiException.Create('zend_register_stringl_constant'); - if @zend_register_constant = nil then raise EPHP4DelphiException.Create('zend_register_constant'); - if @tsrm_shutdown = nil then raise EPHP4DelphiException.Create('tsrm_shutdown'); - if @ts_resource_ex = nil then raise EPHP4DelphiException.Create('ts_resource_ex'); - if @ts_free_thread = nil then raise EPHP4DelphiException.Create('ts_free_thread'); - if @zend_error = nil then raise EPHP4DelphiException.Create('zend_error'); - if @zend_error_cb = nil then raise EPHP4DelphiException.Create('zend_error_cb'); - if @zend_eval_string = nil then raise EPHP4DelphiException.Create('zend_eval_string'); - if @zend_make_compiled_string_description = nil then raise EPHP4DelphiException.Create('zend_make_compiled_string_description'); - if @_zval_dtor = nil then raise EPHP4DelphiException.Create('_zval_dtor'); - if @_zval_copy_ctor = nil then raise EPHP4DelphiException.Create('_zval_copy_ctor'); - if @zend_print_variable = nil then raise EPHP4DelphiException.Create('zend_print_variable'); - if @zend_stack_init = nil then raise EPHP4DelphiException.Create('zend_stack_init'); - if @zend_stack_push = nil then raise EPHP4DelphiException.Create('zend_stack_push'); - if @zend_stack_top = nil then raise EPHP4DelphiException.Create('zend_stack_top'); - if @zend_stack_del_top = nil then raise EPHP4DelphiException.Create('zend_stack_del_top'); - if @zend_stack_int_top = nil then raise EPHP4DelphiException.Create('zend_stack_int_top'); - if @zend_stack_is_empty = nil then raise EPHP4DelphiException.Create('zend_stack_is_empty'); - if @zend_stack_destroy = nil then raise EPHP4DelphiException.Create('zend_stack_destroy'); - if @zend_stack_base = nil then raise EPHP4DelphiException.Create('zend_stack_base'); - if @zend_stack_count = nil then raise EPHP4DelphiException.Create('zend_stack_count'); - if @zend_stack_apply = nil then raise EPHP4DelphiException.Create('zend_stack_apply'); - if @zend_stack_apply_with_argument = nil then raise EPHP4DelphiException.Create('zend_stack_apply_with_argument'); - if @_convert_to_string = nil then raise EPHP4DelphiException.Create('_convert_to_string'); - if @add_function = nil then raise EPHP4DelphiException.Create('add_function'); - if @sub_function = nil then raise EPHP4DelphiException.Create('sub_function'); - if @mul_function = nil then raise EPHP4DelphiException.Create('mul_function'); - if @div_function = nil then raise EPHP4DelphiException.Create('div_function'); - if @mod_function = nil then raise EPHP4DelphiException.Create('mod_function'); - if @boolean_xor_function = nil then raise EPHP4DelphiException.Create('boolean_xor_function'); - if @boolean_not_function = nil then raise EPHP4DelphiException.Create('boolean_not_function'); - if @bitwise_not_function = nil then raise EPHP4DelphiException.Create('bitwise_not_function'); - if @bitwise_or_function = nil then raise EPHP4DelphiException.Create('bitwise_or_function'); - if @bitwise_and_function = nil then raise EPHP4DelphiException.Create('bitwise_and_function'); - if @bitwise_xor_function = nil then raise EPHP4DelphiException.Create('bitwise_xor_function'); - if @shift_left_function = nil then raise EPHP4DelphiException.Create('shift_left_function'); - if @shift_right_function = nil then raise EPHP4DelphiException.Create('shift_right_function'); - if @concat_function = nil then raise EPHP4DelphiException.Create('concat_function'); - if @is_equal_function = nil then raise EPHP4DelphiException.Create('is_equal_function'); - if @is_identical_function = nil then raise EPHP4DelphiException.Create('is_identical_function'); - if @is_not_identical_function = nil then raise EPHP4DelphiException.Create('is_not_identical_function'); - if @is_not_equal_function = nil then raise EPHP4DelphiException.Create('is_not_equal_function'); - if @is_smaller_function = nil then raise EPHP4DelphiException.Create('is_smaller_function'); - if @is_smaller_or_equal_function = nil then raise EPHP4DelphiException.Create('is_smaller_or_equal_function'); - if @increment_function = nil then raise EPHP4DelphiException.Create('increment_function'); - if @decrement_function = nil then raise EPHP4DelphiException.Create('decrement_function'); - if @convert_scalar_to_number = nil then raise EPHP4DelphiException.Create('convert_scalar_to_number'); - if @convert_to_long = nil then raise EPHP4DelphiException.Create('convert_to_long'); - if @convert_to_double = nil then raise EPHP4DelphiException.Create('convert_to_double'); - if @convert_to_long_base = nil then raise EPHP4DelphiException.Create('convert_to_long_base'); - if @convert_to_null = nil then raise EPHP4DelphiException.Create('convert_to_null'); - if @convert_to_boolean = nil then raise EPHP4DelphiException.Create('convert_to_boolean'); - if @convert_to_array = nil then raise EPHP4DelphiException.Create('convert_to_array'); - if @convert_to_object = nil then raise EPHP4DelphiException.Create('convert_to_object'); - if @add_char_to_string = nil then raise EPHP4DelphiException.Create('add_char_to_string'); - if @add_string_to_string = nil then raise EPHP4DelphiException.Create('add_string_to_string'); - if @zend_string_to_double = nil then raise EPHP4DelphiException.Create('zend_string_to_double'); - if @zval_is_true = nil then raise EPHP4DelphiException.Create('zval_is_true'); - if @compare_function = nil then raise EPHP4DelphiException.Create('compare_function'); - if @numeric_compare_function = nil then raise EPHP4DelphiException.Create('numeric_compare_function'); - if @string_compare_function = nil then raise EPHP4DelphiException.Create('string_compare_function'); - if @zend_str_tolower = nil then raise EPHP4DelphiException.Create('zend_str_tolower'); - if @zend_binary_zval_strcmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strcmp'); - if @zend_binary_zval_strncmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strncmp'); - if @zend_binary_zval_strcasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strcasecmp'); - if @zend_binary_zval_strncasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strncasecmp'); - if @zend_binary_strcmp = nil then raise EPHP4DelphiException.Create('zend_binary_strcmp'); - if @zend_binary_strncmp = nil then raise EPHP4DelphiException.Create('zend_binary_strncmp'); - if @zend_binary_strcasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_strcasecmp'); - if @zend_binary_strncasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_strncasecmp'); - if @zendi_smart_strcmp = nil then raise EPHP4DelphiException.Create('zendi_smart_strcmp'); - if @zend_compare_symbol_tables = nil then raise EPHP4DelphiException.Create('zend_compare_symbol_tables'); - if @zend_compare_arrays = nil then raise EPHP4DelphiException.Create('zend_compare_arrays'); - if @zend_compare_objects = nil then raise EPHP4DelphiException.Create('zend_compare_objects'); - if @zend_atoi = nil then raise EPHP4DelphiException.Create('zend_atoi'); - if @get_active_function_name = nil then raise EPHP4DelphiException.Create('get_active_function_name'); - if @zend_get_executed_filename = nil then raise EPHP4DelphiException.Create('zend_get_executed_filename'); - if @zend_set_timeout = nil then raise EPHP4DelphiException.Create('zend_set_timeout'); - if @zend_unset_timeout = nil then raise EPHP4DelphiException.Create('zend_unset_timeout'); - if @zend_timeout = nil then raise EPHP4DelphiException.Create('zend_timeout'); - if @zend_highlight = nil then raise EPHP4DelphiException.Create('zend_highlight'); - if @zend_strip = nil then raise EPHP4DelphiException.Create('zend_strip'); - if @highlight_file = nil then raise EPHP4DelphiException.Create('highlight_file'); - if @highlight_string = nil then raise EPHP4DelphiException.Create('highlight_string'); - if @zend_html_putc = nil then raise EPHP4DelphiException.Create('zend_html_putc'); - if @zend_html_puts = nil then raise EPHP4DelphiException.Create('zend_html_puts'); - if @zend_indent = nil then raise EPHP4DelphiException.Create('zend_indent'); - if @_zend_get_parameters_array_ex = nil then raise EPHP4DelphiException.Create('_zend_get_parameters_array_ex'); - if @zend_ini_refresh_caches = nil then raise EPHP4DelphiException.Create('zend_ini_refresh_caches'); - if @zend_alter_ini_entry = nil then raise EPHP4DelphiException.Create('zend_alter_ini_entry'); - if @zend_restore_ini_entry = nil then raise EPHP4DelphiException.Create('zend_restore_ini_entry'); - if @zend_ini_long = nil then raise EPHP4DelphiException.Create('zend_ini_long'); - if @zend_ini_double = nil then raise EPHP4DelphiException.Create('zend_ini_double'); - if @zend_ini_string = nil then raise EPHP4DelphiException.Create('zend_ini_string'); - if @compile_string = nil then raise EPHP4DelphiException.Create('compile_string'); - if @execute = nil then raise EPHP4DelphiException.Create('execute'); - if @zend_wrong_param_count = nil then raise EPHP4DelphiException.Create('zend_wrong_param_count'); - if @add_property_long_ex = nil then raise EPHP4DelphiException.Create('add_property_long_ex'); - if @add_property_null_ex = nil then raise EPHP4DelphiException.Create('add_property_null_ex'); - if @add_property_bool_ex = nil then raise EPHP4DelphiException.Create('add_property_bool_ex'); - if @add_property_resource_ex = nil then raise EPHP4DelphiException.Create('add_property_resource_ex'); - if @add_property_double_ex = nil then raise EPHP4DelphiException.Create('add_property_double_ex'); - if @add_property_string_ex = nil then raise EPHP4DelphiException.Create('add_property_string_ex'); - if @add_property_stringl_ex = nil then raise EPHP4DelphiException.Create('add_property_stringl_ex'); - if @add_property_zval_ex = nil then raise EPHP4DelphiException.Create('add_property_zval_ex'); - if @add_assoc_long_ex = nil then raise EPHP4DelphiException.Create('add_assoc_long_ex'); - if @add_assoc_null_ex = nil then raise EPHP4DelphiException.Create('add_assoc_null_ex'); - if @add_assoc_bool_ex = nil then raise EPHP4DelphiException.Create('add_assoc_bool_ex'); - if @add_assoc_resource_ex = nil then raise EPHP4DelphiException.Create('add_assoc_resource_ex'); - if @add_assoc_double_ex = nil then raise EPHP4DelphiException.Create('add_assoc_double_ex'); - if @add_assoc_string_ex = nil then raise EPHP4DelphiException.Create('add_assoc_string_ex'); - if @add_assoc_stringl_ex = nil then raise EPHP4DelphiException.Create('add_assoc_stringl_ex'); - if @add_assoc_zval_ex = nil then raise EPHP4DelphiException.Create('add_assoc_zval_ex'); - if @add_index_long = nil then raise EPHP4DelphiException.Create('add_index_long'); - if @add_index_null = nil then raise EPHP4DelphiException.Create('add_index_null'); - if @add_index_bool = nil then raise EPHP4DelphiException.Create('add_index_bool'); - if @add_index_resource = nil then raise EPHP4DelphiException.Create('add_index_resource'); - if @add_index_double = nil then raise EPHP4DelphiException.Create('add_index_double'); - if @add_index_string = nil then raise EPHP4DelphiException.Create('add_index_string'); - if @add_index_stringl = nil then raise EPHP4DelphiException.Create('add_index_stringl'); - if @add_index_zval = nil then raise EPHP4DelphiException.Create('add_index_zval'); - if @add_next_index_long = nil then raise EPHP4DelphiException.Create('add_next_index_long'); - if @add_next_index_null = nil then raise EPHP4DelphiException.Create('add_next_index_null'); - if @add_next_index_bool = nil then raise EPHP4DelphiException.Create('add_next_index_bool'); - if @add_next_index_resource = nil then raise EPHP4DelphiException.Create('add_next_index_resource'); - if @add_next_index_double = nil then raise EPHP4DelphiException.Create('add_next_index_double'); - if @add_next_index_string = nil then raise EPHP4DelphiException.Create('add_next_index_string'); - if @add_next_index_stringl = nil then raise EPHP4DelphiException.Create('add_next_index_stringl'); - if @add_next_index_zval = nil then raise EPHP4DelphiException.Create('add_next_index_zval'); - if @add_get_assoc_string_ex = nil then raise EPHP4DelphiException.Create('add_get_assoc_string_ex'); - if @add_get_assoc_stringl_ex = nil then raise EPHP4DelphiException.Create('add_get_assoc_stringl_ex'); - if @add_get_index_long = nil then raise EPHP4DelphiException.Create('add_get_index_long'); - if @add_get_index_double = nil then raise EPHP4DelphiException.Create('add_get_index_double'); - if @add_get_index_string = nil then raise EPHP4DelphiException.Create('add_get_index_string'); - if @add_get_index_stringl = nil then raise EPHP4DelphiException.Create('add_get_index_stringl'); - if @_array_init = nil then raise EPHP4DelphiException.Create('_array_init'); - if @_object_init = nil then raise EPHP4DelphiException.Create('_object_init'); - if @_object_init_ex = nil then raise EPHP4DelphiException.Create('_object_init_ex'); - if @_object_and_properties_init = nil then raise EPHP4DelphiException.Create('_object_and_properties_init'); - if @zend_register_internal_class = nil then raise EPHP4DelphiException.Create('zend_register_internal_class'); - if @zend_register_internal_class_ex = nil then raise EPHP4DelphiException.Create('zend_register_internal_class_ex'); - if @get_zend_version = nil then raise EPHP4DelphiException.Create('get_zend_version'); - if @zend_make_printable_zval = nil then raise EPHP4DelphiException.Create('zend_make_printable_zval'); - if @zend_print_zval = nil then raise EPHP4DelphiException.Create('zend_print_zval'); - if @zend_print_zval_r = nil then raise EPHP4DelphiException.Create('zend_print_zval_r'); - if @zend_output_debug_string = nil then raise EPHP4DelphiException.Create('zend_output_debug_string'); - if @ZendGetParameters = nil then raise EPHP4DelphiException.Create('zend_get_parameters'); + Result := v._type = IS_ARRAY; end; -{$ENDIF} -function zend_hash_get_current_data(ht: PHashTable; pData: Pointer): Integer; cdecl; +function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; begin - result := zend_hash_get_current_data_ex(ht, pData, nil); + Result := false; + if v._type <> IS_ARRAY then + exit; + + if v.value.ht.nNumOfElements = 0 then + exit; + + Result := zend_hash_exists(v.value.ht, PAnsiChar(key), Length(key) + 1) = 1; end; -procedure zend_hash_internal_pointer_reset(ht: PHashTable); cdecl; +function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; begin - zend_hash_internal_pointer_reset_ex(ht, nil); + Result := false; + if (v._type <> IS_ARRAY) then + exit; + + if v.value.ht.nNumOfElements = 0 then + exit; + + Result := zend_hash_index_exists(v.value.ht, idx) = 1; end; -function ts_resource(id : integer) : pointer; +function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) + : Boolean; overload; +var + tmp: ppzval; begin - result := ts_resource_ex(id, nil); + Result := ZValArrayKeyExists(v, key); + if Result then + begin + pData := nil; + if ZValArrayKeyFind(v, key, tmp) then + pData := tmp^; + end; end; +function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) + : Boolean; overload; +var + tmp: ppzval; +begin + Result := ZValArrayKeyExists(v, idx); + if Result then + begin + pData := nil; + if ZValArrayKeyFind(v, idx, tmp) then + pData := tmp^; + end; +end; -function zval_copy_ctor(val : pzval) : integer; +function ZValArrayKeyDel(v: pzval; key: AnsiString): Boolean; overload; begin - result := _zval_copy_ctor(val, nil, 0); + Result := false; + if ZValArrayKeyExists(v, key) then + Result := zend_hash_del_key_or_index(v.value.ht, PAnsiChar(key), + Length(key) + 1, 0, HASH_DEL_KEY) = SUCCESS; end; +function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; +begin + Result := false; + if ZValArrayKeyExists(v, idx) then + Result := zend_hash_del_key_or_index(v.value.ht, nil, 0, idx, + HASH_DEL_INDEX) = SUCCESS; +end; -function zend_unregister_functions(functions : pzend_function_entry; count : integer; function_table : PHashTable; TSRMLS_DC : pointer) : integer; +function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) + : Boolean; overload; var - i : integer; - ptr : pzend_function_entry; + keyStr: PAnsiChar; + KeyLength: uint; begin - Result := SUCCESS; - i := 0; - ptr := functions; - if ptr = nil then - Exit; - while ptr.fname <> nil do - begin - if ( count <> -1 ) and (i >= count) then - break; - zend_hash_del_key_or_index(function_table, ptr.fname, strlen(ptr.fname) +1, 0, HASH_DEL_KEY); - inc(ptr); - inc(i); - end; + keyStr := PAnsiChar(key); + KeyLength := Length(key) + 1; + + Result := zend_hash_quick_find(v.value.ht, keyStr, KeyLength, + zend_hash_func(keyStr, KeyLength), pData) = SUCCESS; +end; + +function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) + : Boolean; overload; +begin + Result := zend_hash_quick_find(v.value.ht, nil, 0, idx, pData) = SUCCESS; +end; +procedure MAKE_STD_ZVAL(out Result: pzval); +begin + ALLOC_ZVAL(Result); + INIT_PZVAL(Result); end; -// registers all functions in *library_functions in the function hash -function zend_register_functions(functions : pzend_function_entry; function_table : PHashTable; _type: integer; TSRMLS_DC : pointer) : integer; -var - ptr : pzend_function_entry; - _function : zend_function; - internal_function : PzendInternalFunction; - count : integer; - unload : integer; - target_function_table : PHashTable; - error_type : integer; +function GetArgPZval; begin - Result := FAILURE; - if functions = nil then - Exit; - ptr := functions; - count := 0; - unload := 0; - if _type = MODULE_PERSISTENT then - error_type := E_CORE_WARNING - else - error_type := E_WARNING; + if Args._Reserved1 = 0 then // nil + begin + if Make then + MAKE_STD_ZVAL(Result); + Result._type := IS_NULL; + end + else if Args.VType = vtPointer then + Result := Args.VPointer + else + begin + if Make then + MAKE_STD_ZVAL(Result); + case Args.VType of + vtInteger: + ZvalVAL(Result, Args.VInteger, _type); + vtInt64: + ZvalVAL(Result, NativeInt(Args.VInt64^), _type); + vtBoolean: + ZvalVAL(Result, Args.VBoolean); + vtExtended: + ZvalVAL(Result, Args.VExtended^); + vtClass, vtObject: + ZvalVAL(Result, Args._Reserved1); + vtString: + ZvalVAL(Result, AnsiString(Args.VString^)); + vtAnsiString: + ZvalVAL(Result, PAnsiChar(Args.VAnsiString)); + vtUnicodeString: + ZvalVAL(Result, UnicodeString(Args._Reserved1)); + vtWideChar: + ZvalVAL(Result, AnsiString(Args.VWideChar)); + vtChar: + ZvalVAL(Result, Args.VChar); + vtPWideChar: + ZvalVAL(Result, Args.VPWideChar); + vtPChar: + ZvalVAL(Result, Args.VPChar); + vtWideString: + ZvalVAL(Result, PWideChar(Args.VWideString)); + end; + end; +end; - internal_function := @_function; - target_function_table := function_table; + +procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); +var + __s : PUTF8Char; +begin + if not assigned(s) then + __s := '' + else + __s := s; + + z^.value.str.len := length(__s); + if duplicate then + + z^.value.str.val := estrndup(__s, z^.value.str.len) + else + z^.value.str.val := __s; + z^._type := IS_STRING; +end; + +procedure ZVAL_STRING(z: pzval; s: PAnsiChar; duplicate: boolean); +var + __s : PAnsiChar; +begin + if not assigned(s) then + __s := '' + else + __s := s; + + z^.value.str.len := strlen(__s); + if duplicate then + + z^.value.str.val := estrndup(__s, z^.value.str.len) + else + z^.value.str.val := __s; + z^._type := IS_STRING; +end; + +procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); +var + __s : PAnsiChar; + StA : AnsiString; + StW : WideString; +begin + if not assigned(s) then + __s := '' + else + begin + StW := WideString(s); + StA := AnsiString(StW); + __s := PAnsiChar(StA); + end; + + z^.value.str.len := strlen(__s); + if duplicate then + + z^.value.str.val := estrndup(__s, z^.value.str.len) + else + z^.value.str.val := __s; + z^._type := IS_STRING; +end; + +procedure ZVAL_STRINGL(z: pzval; s: PAnsiChar; l: integer; duplicate: boolean); +var + __s : PAnsiChar; + __l : integer; +begin + if not assigned(s) then + __s := '' + else + __s := s; + __l := l; + z^.value.str.len := __l; + if duplicate then + z^.value.str.val := estrndup(__s, __l) + else + z^.value.str.val := __s; + z^._type := IS_STRING; +end; + +procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); +var + __s : PAnsiChar; + __l : integer; + StA : AnsiString; + StW : WideString; +begin + if not assigned(s) then + __s := '' + else + begin + StW := WideString(s); + StA := AnsiString(StW); + __s := PAnsiChar(StA); + end; + + __l := l; + z^.value.str.len := __l; + if duplicate then + z^.value.str.val := estrndup(__s, __l) + else + z^.value.str.val := __s; + z^._type := IS_STRING; +end; + +procedure ZVAL_EMPTY_STRING(z: pzval); +begin + z^.value.str.len := 0; + // {$IFDEF PHP510} + z^.value.str.val := STR_EMPTY_ALLOC; + (*{$ELSE} + z^.value.str.val := ''; + {$ENDIF}*) + z^._type := IS_STRING; +end; + +procedure ZVAL_TRUE(z: pzval); +begin + z^._type := IS_BOOL; + z^.value.lval := 1; +end; + +procedure ZVAL_FALSE(z: pzval); +begin + z^._type := IS_BOOL; + z^.value.lval := 0; +end; +function ToStrA(V: Variant): AnsiString; +begin + Result := V; +end; + +function ToStr(V: Variant): String; +begin + Result := V; +end; + +function ToPChar(V: Variant): PAnsiChar; +begin + Result := PAnsiChar(ToStr(V)); +end; + +function toWChar(s: PAnsiChar): PWideChar; + var + ss: WideString; + ss2: string; +begin + ss2 := s; + ss := ss2; + Result := PWideChar(ss); +end; + +function ZendToVariant(const Value: pppzval): Variant; overload; + Var + S: String; +begin + case Value^^^._type of + 1: Result := Value^^^.value.lval; + 2: Result := Value^^^.value.dval; + 6: begin S := Value^^^.value.str.val; Result := S; end; + 4,5: Result := Null; + end; +end; + +function ZendToVariant(const Value: ppzval): Variant; overload; + Var + S: String; +begin +Result := Null; + case Value^^._type of + 1: Result := Value^^.value.lval; + 2: Result := Value^^.value.dval; + 6: begin S := Value^^.value.str.val; Result := S; end; + 4,5: Result := Null; + end; +end; + +procedure HashToArray(HT: PHashTable; var AR: TArrayVariant); overload; + Var + Len,I: Integer; + tmp : pppzval; +begin + len := zend_hash_num_elements(HT); + SetLength(AR,len); + for i:=0 to len-1 do + begin + new(tmp); + + zend_hash_index_find(ht,i,tmp); + + AR[i] := ZendToVariant(tmp); + freemem(tmp); + end; +end; + + +procedure ArrayToHash(AR: Array of Variant; var HT: pzval); overload; + Var + I,Len: Integer; +begin + _array_init(ht,nil,1); + len := Length(AR); + for i:=0 to len-1 do + begin + case VarType(AR[i]) of + varInteger, varSmallint, varLongWord, 17: add_index_long(ht,i,AR[i]); + varDouble,varSingle: add_index_double(ht,i,AR[i]); + varBoolean: add_index_bool(ht,i,AR[I]); + varEmpty: add_index_null(ht,i); + varString: add_index_string(ht,i,PAnsiChar(ToStr(AR[I])),1); + 258: add_index_string(ht,i,PAnsiChar(AnsiString(ToStr(AR[I]))),1); + end; + end; +end; + +procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; + Var + I,Len: Integer; + v: Variant; + key: PAnsiChar; + s: PAnsiChar; +begin + _array_init(ht,nil,1); + len := Length(AR); + for i:=0 to len-1 do + begin + v := AR[I]; + key := PAnsiChar(ToStrA(keys[i])); + s := PAnsiChar(ToStrA(v)); + case VarType(AR[i]) of + varInteger, varSmallint, varLongWord, 17: add_assoc_long_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[i]); + varDouble,varSingle: add_assoc_double_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[i]); + varBoolean: add_assoc_bool_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[I]); + varEmpty: add_assoc_null_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1); + varString,258: add_assoc_string_ex(ht,key,strlen(key)+1,s,1); + end; + end; +end; + +function add_next_index_variant(arg: pzval; value: variant): integer; +var iz: pzval; + W: WideString; + S: String; +begin + iz := MAKE_STD_ZVAL; + if VarIsEmpty(value) then + begin + ZVAL_NULL(iz); + Result := add_next_index_zval(arg, iz); + Exit; + end; + // MessageBoxA(0, PAnsiChar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ; + case TVarData(Value).VType of + varString : //Peter Enz + begin + if Assigned ( TVarData(Value).VString ) then + begin + ZVAL_STRING(iz, TVarData(Value).VString , true); + end + else + begin + ZVAL_STRING(iz, '', true); + end; + end; + + varUString : //Peter Enz + begin + S := string(TVarData(Value).VUString); + + ZVAL_STRING(iz, PAnsiChar(AnsiString(S)), true); + end; + + varOleStr : //Peter Enz + begin + if Assigned ( TVarData(Value).VOleStr ) then + begin + W := WideString(Pointer(TVarData(Value).VOleStr)); + ZVAL_STRINGW(iz, PWideChar(W), true); + end + else + begin + ZVAL_STRING(iz, '', true); + end; + end; + varSmallInt : ZVAL_LONG(iz, TVarData(Value).VSmallint); + varInteger : ZVAL_LONG(iz, TVarData(Value).VInteger); + varBoolean : ZVAL_BOOL(iz, TVarData(Value).VBoolean); + varSingle : ZVAL_DOUBLE(iz, TVarData(Value).VSingle); + varDouble : ZVAL_DOUBLE(iz, TVarData(Value).VDouble); + varError : ZVAL_LONG(iz, TVarData(Value).VError); + varByte : ZVAL_LONG(iz, TVarData(Value).VByte); + varDate : ZVAL_DOUBLE(iz, TVarData(Value).VDate); + else + ZVAL_NULL(iz); + end; + + Result := add_next_index_zval(arg, iz); +end; + + +procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; +var + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; - if (target_function_table = nil) then - target_function_table := GetCompilerGlobals(TSRMLS_DC).function_table; + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; + for i := 0 to Length(arr)-1 do + begin + add_next_index_string(z, PAnsiChar(AnsiString(arr[i])), 1); + end; + Exit; +end; + +procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; +var + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; - internal_function._type := ZEND_INTERNAL_FUNCTION; + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; - while (ptr.fname <> nil) do + for i := 0 to Length(arr)-1 do begin - internal_function.handler := ptr.handler; - internal_function.function_name := ptr.fname; - if (internal_function.handler = nil) then begin - zend_error(error_type, 'Null function defined as active function'); - zend_unregister_functions(functions, count, target_function_table, TSRMLS_DC); - Result := FAILURE; - Exit; - end; - - if (zend_hash_add_or_update(target_function_table, ptr.fname, strlen(ptr.fname)+1, @_function, sizeof(zend_function), nil, HASH_ADD) = FAILURE) then - begin - unload:=1; - break; - end; - inc(ptr); - inc(count); - end; - - - if (unload = 1) then begin // before unloading, display all remaining bad function in the module */ - while (ptr.fname<> nil) do begin - if (zend_hash_exists(target_function_table, ptr.fname, strlen(ptr.fname)+1)) = 1 then - begin - zend_error(error_type, PChar(Format('Function registration failed - duplicate name - %s', [ptr.fname]))); - end; - inc(ptr); - end; - zend_unregister_functions(functions, count, target_function_table, TSRMLS_DC); - result := FAILURE; - Exit; - end; - Result := SUCCESS; + add_next_index_string(z, PansiChar(arr[i]), 1); + end; + Exit; +end; + +procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; +var + i: integer; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; -end; + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; + for i := 0 to Length(arr)-1 do + begin + add_next_index_string(z, PansiChar(AnsiString(arr[i])), 1); + end; + Exit; +end; + +procedure ZVAL_ARRAY(z: pzval; arr: array of AnsiString); overload; +var + i: integer; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; -function GetGlobalResource(resource_name: string; TSRMLS_DC : pointer) : pointer; + for i := 0 to Length(arr)-1 do + begin + add_next_index_string(z, PansiChar(arr[i]), 1); + end; + Exit; +end; + +procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; var - global_id : pointer; - global_value : integer; - global_ptr : pointer; + i: integer; begin - Result := nil; - global_id := GetProcAddress(PHPLib, PChar(resource_name)); - if Assigned(global_id) then - begin - global_value := integer(global_id^); - asm - mov ecx, global_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov global_ptr, ecx - end; - Result := global_ptr; - end; -end; + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; -function GetCompilerGlobals(TSRMLS_DC : pointer) : Pzend_compiler_globals; + for i := 0 to Length(arr)-1 do + begin + add_next_index_variant(z, arr[i]); + end; + Exit; +end; +procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; +var + i: integer; begin - result := GetGlobalResource('compiler_globals_id', TSRMLS_DC); -end; + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; -function GetExecutorGlobals(TSRMLS_DC : pointer) : pzend_executor_globals; -begin - result := GetGlobalResource('executor_globals_id', TSRMLS_DC); -end; + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; -function GetAllocGlobals(TSRMLS_DC : pointer) : pointer; + for i := 0 to Length(arr)-1 do + begin + add_next_index_long(z, arr[i]); + end; + Exit; +end; + +procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; +var + i: integer; + V: TVarData; begin - result := GetGlobalResource('alloc_globals_id', TSRMLS_DC); -end; - -{$IFDEF PHP5} - -function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : integer; cdecl; assembler; -asm - mov eax, [esp + 16] - mov ecx, [esp + 12] - mov edx, [esp + 8] - pop ebp - push eax - push ecx - push edx - call _object_init_ex - add esp, $0c - ret -end; + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + if arr.PVarArray.DimCount = 0 then + begin + ZVAL_FALSE(z); + Exit; + end; -function Z_LVAL(z : zval) : longint; + for i := 0 to arr.DimCount-1 do + begin + {V := TVarData( arr[i] ); + case V.VType of + varEmpty, varNull: + add_next_index_null(z); + varSmallInt: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VSmallInt))), 1); + varInteger: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VInteger))), 1); + varSingle: + add_next_index_string(z, PansiChar(AnsiString(V.VSingle.ToString())), 1); + varDouble: + add_next_index_double(z, V.VDouble); + varCurrency: + add_next_index_string(z, PansiChar(AnsiString(CurrToStr(V.VCurrency))), 1); + varDate: + add_next_index_string(z, PansiChar(AnsiString(DateTimeToStr(V.VDate))), 1); + varOleStr: + add_next_index_string(z, PansiChar(AnsiString(V.VOleStr)), 1); + varBoolean: + add_next_index_bool(z, V.VBoolean.ToInteger()); + varByte: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VByte))), 1); + varWord: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VWord))), 1); + varShortInt: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VShortInt))), 1); + varLongWord: + add_next_index_long(z, V.VLongWord); + varInt64: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VInt64))), 1); + varString: + add_next_index_string(z, PansiChar(AnsiString(V.VString)), 1); + {$IFDEF SUPPORTS_UNICODE_STRING}{ + varUString: + add_next_index_string(z, PansiChar(AnsiString(V.VUString)), 1); + {$ENDIF SUPPORTS_UNICODE_STRING} + {varArray, + varDispatch, + varError, + varUnknown, + varAny, + varByRef:}{ + varObject: + add_next_index_long(z, Integer( + end; } + add_next_index_variant(z, arr[i]); + end; + Exit; +end; + +procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of PAnsiChar; keyvals: Array of PAnsiChar); +var + i : integer; begin - Result := z.value.lval; -end; + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; -function Z_BVAL(z : zval) : boolean; -begin - Result := zend_bool(z.value.lval); -end; + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; + + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, keynames[i], StrLen(keynames[i]) + 1, keyvals[i], 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; -function Z_DVAL(z : zval) : double; +end; +procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of PWideChar); +var + i : integer; begin - Result := z.value.dval; -end; + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; -function Z_STRVAL(z : zval) : string; -begin - Result := z.value.str.val; -end; + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; -function Z_STRLEN(z : zval) : longint; +end; +procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overload; +var + i : integer; begin - Result := z.value.str.len; -end; + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + //z^.refcount := Length(keynames); // + if (Length(keynames) = 0) then + begin + z^.refcount := 1; + Exit; + end; -function Z_ARRVAL(z : zval ) : PHashTable; -begin - Result := z.value.ht; -end; + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + // + // + add_assoc_string_ex(z, PAnsiChar(AnsiString(keynames[i])), StrLen(PAnsiChar(AnsiString(keynames[i]))) + 1, + PAnsiChar(AnsiString(keyvals[i])), 1); -function Z_OBJ_HANDLE(z :zval) : zend_object_handle; -begin - Result := z.value.obj.handle; -end; + // + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; -function Z_OBJ_HT(z : zval) : pzend_object_handlers; +end; +procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of string); overload; +var + i : integer; begin - Result := z.value.obj.handlers; -end; + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; -function Z_OBJPROP(z : zval) : PHashtable; -var - TSRMLS_DC : pointer; -begin - TSRMLS_DC := ts_resource_ex(0, nil); - Result := Z_OBJ_HT(z)^.get_properties(@z, TSRMLS_DC); -end; + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; + + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, PAnsiChar(AnsiString(keynames[i])), StrLen(PAnsiChar(AnsiString(keynames[i]))) + 1, + PAnsiChar(AnsiString(keyvals[i])), 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; +end; +procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; +var + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; -{$ENDIF} + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; -initialization -{$IFDEF PHP4DELPHI_AUTOLOAD} - LoadZEND; -{$ENDIF} + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; -finalization -{$IFDEF PHP4DELPHI_AUTOUNLOAD} - UnloadZEND; -{$ENDIF} +end; +procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array of AnsiString); overload; +var + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; -end. + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; +end; +function ZENDLoaded: boolean; +begin + Result := PHPLib <> 0; +end; + +procedure UnloadZEND; +var + H : THandle; +begin + H := InterlockedExchange(Integer(PHPLib), 0); + if H > 0 then + begin + FreeLibrary(H); + end; +end; + + +function LoadZEND(const DllFilename: AnsiString = PHPWin) : boolean; +var + WriteFuncPtr : pointer; +begin + {$IFDEF QUIET_LOAD} + Result := false; + {$ENDIF} + PHPLib := LoadLibraryA(PAnsiChar(DllFileName)); + +{$IFNDEF QUIET_LOAD} + if PHPLib = 0 then + begin + RaiseLastOSError; + // raise Exception.Create(RaiseLastOSError); + end; +{$ELSE} + if PHPLib = 0 then Exit; +{$ENDIF} + + {$IFDEF PHP5} + zend_copy_constants := GetProcAddress(PHPLib, 'zend_copy_constants'); + zend_objects_new := GetProcAddress(PHPLib, 'zend_objects_new'); + zend_objects_clone_obj := GetProcAddress(PHPLib, 'zend_objects_clone_obj'); + function_add_ref := GetProcAddress(PHPLib, 'function_add_ref'); + zend_class_add_ref := GetProcAddress(PHPLib, 'zend_class_add_ref'); + + zend_objects_store_add_ref := GetProcAddress(PHPLib, 'zend_objects_store_add_ref'); + zend_objects_store_del_ref := GetProcAddress(PHPLib, 'zend_objects_store_del_ref'); + + zend_get_std_object_handlers := GetProcAddress(PHPLib, 'zend_get_std_object_handlers'); + zend_objects_get_address := GetProcAddress(PHPLib, 'zend_objects_get_address'); + zend_is_true := GetProcAddress(PHPLib, 'zend_is_true'); +{$ENDIF} + + _zend_bailout := GetProcAddress(PHPLib, '_zend_bailout'); + + zend_disable_function := GetProcAddress(PHPLib, 'zend_disable_function'); + zend_disable_class := GetProcAddress(PHPLib, 'zend_disable_class'); + zend_register_list_destructors_ex := GetProcAddress(PHPLib, 'zend_register_list_destructors_ex'); + zend_register_resource := GetProcAddress(PHPLib, 'zend_register_resource'); + zend_fetch_resource := GetProcAddress(PHPLib, 'zend_fetch_resource'); + zend_list_insert := GetProcAddress(PHPLib, 'zend_list_insert'); + {$IFNDEF PHP700} + _zend_list_addref := GetProcAddress(PHPLib, '_zend_list_addref'); + _zend_list_delete := GetProcAddress(PHPLib, '_zend_list_delete'); + _zend_list_find := GetProcAddress(PHPLib, '_zend_list_find'); + {$ENDIF} + zend_rsrc_list_get_rsrc_type := GetProcAddress(PHPLib, 'zend_rsrc_list_get_rsrc_type'); + zend_fetch_list_dtor_id := GetProcAddress(PHPLib, 'zend_fetch_list_dtor_id'); + + zend_get_compiled_filename := GetProcAddress(PHPLib, 'zend_get_compiled_filename'); + + zend_get_compiled_lineno := GetProcAddress(PHPLib, 'zend_get_compiled_lineno'); + + zend_ini_deactivate := GetProcAddress(PHPLib, 'zend_ini_deactivate'); + + // -- tsrm_startup + tsrm_startup := GetProcAddress(PHPLib, 'tsrm_startup'); + + // -- ts_allocate_id + ts_allocate_id := GetProcAddress(PHPLib, 'ts_allocate_id'); + + // -- ts_free_id + ts_free_id := GetProcAddress(PHPLib, 'ts_free_id'); + + // -- zend_strndup + zend_strndup := GetProcAddress(PHPLib, 'zend_strndup'); + + + // -- _emalloc + _emalloc := GetProcAddress(PHPLib, '_emalloc'); + + + // -- _efree + _efree := GetProcAddress(PHPLib, '_efree'); + + + // -- _ecalloc + _ecalloc := GetProcAddress(PHPLib, '_ecalloc'); + + + // -- _erealloc + _erealloc := GetProcAddress(PHPLib, '_erealloc'); + + + // -- _estrdup + _estrdup := GetProcAddress(PHPLib, '_estrdup'); + + // -- _estrndup + _estrndup := GetProcAddress(PHPLib, '_estrndup'); + + // -- _estrndup Unicode + _estrndupu := GetProcAddress(PHPLib, '_estrndup'); + + // -- zend_set_memory_limit + zend_set_memory_limit := GetProcAddress(PHPLib, 'zend_set_memory_limit'); + + // -- start_memory_manager + start_memory_manager := GetProcAddress(PHPLib, 'start_memory_manager'); + + // -- shutdown_memory_manager + shutdown_memory_manager := GetProcAddress(PHPLib, 'shutdown_memory_manager'); + + {$IFDEF PHP4} + // -- zend_hash_init + zend_hash_init := GetProcAddress(PHPLib, 'zend_hash_init'); + + // -- zend_hash_init_ex + zend_hash_init_ex := GetProcAddress(PHPLib, 'zend_hash_init_ex'); + + // -- zend_hash_quick_add_or_update + zend_hash_quick_add_or_update := GetProcAddress(PHPLib, 'zend_hash_quick_add_or_update'); + + // -- zend_hash_index_update_or_next_insert + zend_hash_index_update_or_next_insert := GetProcAddress(PHPLib, 'zend_hash_index_update_or_next_insert'); + + // -- zend_hash_merge + zend_hash_merge := GetProcAddress(PHPLib, 'zend_hash_merge'); + {$ELSE} + _zend_hash_init := GetProcAddress(PHPLib, '_zend_hash_init'); + _zend_hash_init_ex := GetProcAddress(PHPLib, '_zend_hash_init_ex'); + + {$ENDIF} + + {$IFDEF PHP4} + // -- zend_hash_add_or_update + zend_hash_add_or_update := GetProcAddress(PHPLib, 'zend_hash_add_or_update'); + {$ELSE} + // -- zend_hash_add_or_update + _zend_hash_add_or_update := GetProcAddress(PHPLib, '_zend_hash_add_or_update'); + {$ENDIF} + + // -- zend_hash_destroy + zend_hash_destroy := GetProcAddress(PHPLib, 'zend_hash_destroy'); + + // -- zend_hash_clean + zend_hash_clean := GetProcAddress(PHPLib, 'zend_hash_clean'); + + // -- zend_hash_add_empty_element + zend_hash_add_empty_element := GetProcAddress(PHPLib, 'zend_hash_add_empty_element'); + + // -- zend_hash_graceful_destroy + zend_hash_graceful_destroy := GetProcAddress(PHPLib, 'zend_hash_graceful_destroy'); + + // -- zend_hash_graceful_reverse_destroy + zend_hash_graceful_reverse_destroy := GetProcAddress(PHPLib, 'zend_hash_graceful_reverse_destroy'); + + // -- zend_hash_apply + zend_hash_apply := GetProcAddress(PHPLib, 'zend_hash_apply'); + + // -- zend_hash_apply_with_argument + zend_hash_apply_with_argument := GetProcAddress(PHPLib, 'zend_hash_apply_with_argument'); + + // -- zend_hash_reverse_apply + zend_hash_reverse_apply := GetProcAddress(PHPLib, 'zend_hash_reverse_apply'); + + // -- zend_hash_del_key_or_index + zend_hash_del_key_or_index := GetProcAddress(PHPLib, 'zend_hash_del_key_or_index'); + + // -- zend_get_hash_value + zend_get_hash_value := GetProcAddress(PHPLib, + {$IFDEF PHP560}'zend_hash_func'{$ELSE}'zend_get_hash_value'{$ENDIF}); + + // -- zend_hash_find + zend_hash_find := GetProcAddress(PHPLib, 'zend_hash_find'); + + // -- zend_hash_quick_find + zend_hash_quick_find := GetProcAddress(PHPLib, 'zend_hash_quick_find'); + + // -- zend_hash_index_find + zend_hash_index_find := GetProcAddress(PHPLib, 'zend_hash_index_find'); + + // -- zend_hash_exists + zend_hash_exists := GetProcAddress(PHPLib, 'zend_hash_exists'); + + // -- zend_hash_index_exists + zend_hash_index_exists := GetProcAddress(PHPLib, 'zend_hash_index_exists'); + + // -- zend_hash_next_free_element + zend_hash_next_free_element := GetProcAddress(PHPLib, 'zend_hash_next_free_element'); + + // -- zend_hash_move_forward_ex + zend_hash_move_forward_ex := GetProcAddress(PHPLib, 'zend_hash_move_forward_ex'); + + // -- zend_hash_move_backwards_ex + zend_hash_move_backwards_ex := GetProcAddress(PHPLib, 'zend_hash_move_backwards_ex'); + + // -- zend_hash_get_current_key_ex + zend_hash_get_current_key_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_key_ex'); + + // -- zend_hash_get_current_key_type_ex + zend_hash_get_current_key_type_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_key_type_ex'); + + // -- zend_hash_get_current_data_ex + zend_hash_get_current_data_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_data_ex'); + + // -- zend_hash_internal_pointer_reset_ex + zend_hash_internal_pointer_reset_ex := GetProcAddress(PHPLib, 'zend_hash_internal_pointer_reset_ex'); + + // -- zend_hash_internal_pointer_end_ex + zend_hash_internal_pointer_end_ex := GetProcAddress(PHPLib, 'zend_hash_internal_pointer_end_ex'); + + // -- zend_hash_copy + zend_hash_copy := GetProcAddress(PHPLib, 'zend_hash_copy'); + + + // -- zend_hash_sort + zend_hash_sort := GetProcAddress(PHPLib, 'zend_hash_sort'); + + // -- zend_hash_compare + zend_hash_compare := GetProcAddress(PHPLib, 'zend_hash_compare'); + + // -- zend_hash_minmax + zend_hash_minmax := GetProcAddress(PHPLib, 'zend_hash_minmax'); + + // -- zend_hash_num_elements + zend_hash_num_elements := GetProcAddress(PHPLib, 'zend_hash_num_elements'); + + // -- zend_hash_rehash + zend_hash_rehash := GetProcAddress(PHPLib, 'zend_hash_rehash'); + + // -- zend_hash_func + zend_hash_func := GetProcAddress(PHPLib, 'zend_hash_func'); + + // -- zend_get_constant + zend_get_constant := GetProcAddress(PHPLib, 'zend_get_constant'); + + // -- zend_register_long_constant + zend_register_long_constant := GetProcAddress(PHPLib, 'zend_register_long_constant'); + + // -- zend_register_double_constant + zend_register_double_constant := GetProcAddress(PHPLib, 'zend_register_double_constant'); + + // -- zend_register_string_constant + zend_register_string_constant := GetProcAddress(PHPLib, 'zend_register_string_constant'); + + // -- zend_register_stringl_constant + zend_register_stringl_constant := GetProcAddress(PHPLib, 'zend_register_stringl_constant'); + + // -- zend_register_constant + zend_register_constant := GetProcAddress(PHPLib, 'zend_register_constant'); + + zend_register_auto_global := GetProcAddress(PHPLib, 'zend_register_auto_global'); + + // -- tsrm_shutdown + tsrm_shutdown := GetProcAddress(PHPLib, 'tsrm_shutdown'); + + // -- ts_resource_ex + ts_resource_ex := GetProcAddress(PHPLib, 'ts_resource_ex'); + + // -- ts_free_thread + ts_free_thread := GetProcAddress(PHPLib, 'ts_free_thread'); + + // -- zend_error + zend_error := GetProcAddress(PHPLib, 'zend_error'); + + // -- zend_error_cb + zend_error_cb := GetProcAddress(PHPLib, 'zend_error_cb'); + + // -- zend_eval_string + zend_eval_string := GetProcAddress(PHPLib, 'zend_eval_string'); + + // -- zend_make_compiled_string_description + zend_make_compiled_string_description := GetProcAddress(PHPLib, 'zend_make_compiled_string_description'); + + + {$IFDEF PHP4} + // -- _zval_dtor + _zval_dtor := GetProcAddress(PHPLib, '_zval_dtor'); + + // -- _zval_copy_ctor + _zval_copy_ctor := GetProcAddress(PHPLib, '_zval_copy_ctor'); + + {$ELSE} + _zval_copy_ctor_func := GetProcAddress(PHPLib, '_zval_copy_ctor_func'); + _zval_dtor_func := GetProcAddress(PHPLib, '_zval_dtor_func'); + _zval_ptr_dtor := GetProcAddress(PHPLib, '_zval_ptr_dtor'); + + {$ENDIF} + + // -- zend_print_variable + zend_print_variable := GetProcAddress(PHPLib, 'zend_print_variable'); + + // -- zend_stack_init + zend_stack_init := GetProcAddress(PHPLib, 'zend_stack_init'); + + // -- zend_stack_push + zend_stack_push := GetProcAddress(PHPLib, 'zend_stack_push'); + + // -- zend_stack_top + zend_stack_top := GetProcAddress(PHPLib, 'zend_stack_top'); + + // -- zend_stack_del_top + zend_stack_del_top := GetProcAddress(PHPLib, 'zend_stack_del_top'); + + // -- zend_stack_int_top + zend_stack_int_top := GetProcAddress(PHPLib, 'zend_stack_int_top'); + + // -- zend_stack_is_empty + zend_stack_is_empty := GetProcAddress(PHPLib, 'zend_stack_is_empty'); + + // -- zend_stack_destroy + zend_stack_destroy := GetProcAddress(PHPLib, 'zend_stack_destroy'); + + // -- zend_stack_base + zend_stack_base := GetProcAddress(PHPLib, 'zend_stack_base'); + + // -- zend_stack_count + zend_stack_count := GetProcAddress(PHPLib, 'zend_stack_count'); + + // -- zend_stack_apply + zend_stack_apply := GetProcAddress(PHPLib, 'zend_stack_apply'); + + // -- zend_stack_apply_with_argument + zend_stack_apply_with_argument := GetProcAddress(PHPLib, 'zend_stack_apply_with_argument'); + + // -- _convert_to_string + _convert_to_string := GetProcAddress(PHPLib, '_convert_to_string'); + + // -- add_function + add_function := GetProcAddress(PHPLib, 'add_function'); + + // -- sub_function + sub_function := GetProcAddress(PHPLib, 'sub_function'); + + // -- mul_function + mul_function := GetProcAddress(PHPLib, 'mul_function'); + + // -- div_function + div_function := GetProcAddress(PHPLib, 'div_function'); + + // -- mod_function + mod_function := GetProcAddress(PHPLib, 'mod_function'); + + // -- boolean_xor_function + boolean_xor_function := GetProcAddress(PHPLib, 'boolean_xor_function'); + + // -- boolean_not_function + boolean_not_function := GetProcAddress(PHPLib, 'boolean_not_function'); + + // -- bitwise_not_function + bitwise_not_function := GetProcAddress(PHPLib, 'bitwise_not_function'); + + // -- bitwise_or_function + bitwise_or_function := GetProcAddress(PHPLib, 'bitwise_or_function'); + + // -- bitwise_and_function + bitwise_and_function := GetProcAddress(PHPLib, 'bitwise_and_function'); + + // -- bitwise_xor_function + bitwise_xor_function := GetProcAddress(PHPLib, 'bitwise_xor_function'); + + // -- shift_left_function + shift_left_function := GetProcAddress(PHPLib, 'shift_left_function'); + + // -- shift_right_function + shift_right_function := GetProcAddress(PHPLib, 'shift_right_function'); + + // -- concat_function + concat_function := GetProcAddress(PHPLib, 'concat_function'); + + // -- is_equal_function + is_equal_function := GetProcAddress(PHPLib, 'is_equal_function'); + + // -- is_identical_function + is_identical_function := GetProcAddress(PHPLib, 'is_identical_function'); + + // -- is_not_identical_function + is_not_identical_function := GetProcAddress(PHPLib, 'is_not_identical_function'); + + // -- is_not_equal_function + is_not_equal_function := GetProcAddress(PHPLib, 'is_not_equal_function'); + + // -- is_smaller_function + is_smaller_function := GetProcAddress(PHPLib, 'is_smaller_function'); + + // -- is_smaller_or_equal_function + is_smaller_or_equal_function := GetProcAddress(PHPLib, 'is_smaller_or_equal_function'); + + // -- increment_function + increment_function := GetProcAddress(PHPLib, 'increment_function'); + + // -- decrement_function + decrement_function := GetProcAddress(PHPLib, 'decrement_function'); + + // -- convert_scalar_to_number + convert_scalar_to_number := GetProcAddress(PHPLib, 'convert_scalar_to_number'); + + // -- convert_to_long + convert_to_long := GetProcAddress(PHPLib, 'convert_to_long'); + + // -- convert_to_double + convert_to_double := GetProcAddress(PHPLib, 'convert_to_double'); + + // -- convert_to_long_base + convert_to_long_base := GetProcAddress(PHPLib, 'convert_to_long_base'); + + // -- convert_to_null + convert_to_null := GetProcAddress(PHPLib, 'convert_to_null'); + + // -- convert_to_boolean + convert_to_boolean := GetProcAddress(PHPLib, 'convert_to_boolean'); + + // -- convert_to_array + convert_to_array := GetProcAddress(PHPLib, 'convert_to_array'); + + // -- convert_to_object + convert_to_object := GetProcAddress(PHPLib, 'convert_to_object'); + + // -- add_char_to_string + add_char_to_string := GetProcAddress(PHPLib, 'add_char_to_string'); + + // -- add_string_to_string + add_string_to_string := GetProcAddress(PHPLib, 'add_string_to_string'); + + // -- zend_string_to_double + zend_string_to_double := GetProcAddress(PHPLib, 'zend_string_to_double'); + + // -- zval_is_true + zval_is_true := GetProcAddress(PHPLib, 'zval_is_true'); + + // -- compare_function + compare_function := GetProcAddress(PHPLib, 'compare_function'); + + // -- numeric_compare_function + numeric_compare_function := GetProcAddress(PHPLib, 'numeric_compare_function'); + + // -- string_compare_function + string_compare_function := GetProcAddress(PHPLib, 'string_compare_function'); + + // -- zend_str_tolower + zend_str_tolower := GetProcAddress(PHPLib, 'zend_str_tolower'); + + // -- zend_binary_zval_strcmp + zend_binary_zval_strcmp := GetProcAddress(PHPLib, 'zend_binary_zval_strcmp'); + + // -- zend_binary_zval_strncmp + zend_binary_zval_strncmp := GetProcAddress(PHPLib, 'zend_binary_zval_strncmp'); + + // -- zend_binary_zval_strcasecmp + zend_binary_zval_strcasecmp := GetProcAddress(PHPLib, 'zend_binary_zval_strcasecmp'); + + // -- zend_binary_zval_strncasecmp + zend_binary_zval_strncasecmp := GetProcAddress(PHPLib, 'zend_binary_zval_strncasecmp'); + + // -- zend_binary_strcmp + zend_binary_strcmp := GetProcAddress(PHPLib, 'zend_binary_strcmp'); + + // -- zend_binary_strncmp + zend_binary_strncmp := GetProcAddress(PHPLib, 'zend_binary_strncmp'); + + // -- zend_binary_strcasecmp + zend_binary_strcasecmp := GetProcAddress(PHPLib, 'zend_binary_strcasecmp'); + + // -- zend_binary_strncasecmp + zend_binary_strncasecmp := GetProcAddress(PHPLib, 'zend_binary_strncasecmp'); + + // -- zendi_smart_strcmp + zendi_smart_strcmp := GetProcAddress(PHPLib, 'zendi_smart_strcmp'); + + // -- zend_compare_symbol_tables + zend_compare_symbol_tables := GetProcAddress(PHPLib, 'zend_compare_symbol_tables'); + + // -- zend_compare_arrays + zend_compare_arrays := GetProcAddress(PHPLib, 'zend_compare_arrays'); + + // -- zend_compare_objects + zend_compare_objects := GetProcAddress(PHPLib, 'zend_compare_objects'); + + // -- zend_atoi + zend_atoi := GetProcAddress(PHPLib, 'zend_atoi'); + + // -- get_active_function_name + get_active_function_name := GetProcAddress(PHPLib, 'get_active_function_name'); + + // -- zend_get_executed_filename + zend_get_executed_filename := GetProcAddress(PHPLib, 'zend_get_executed_filename'); + + // -- zend_get_executed_lineno + zend_get_executed_lineno := GetProcAddress(PHPLib, 'zend_get_executed_lineno'); + + // -- zend_set_timeout + zend_set_timeout := GetProcAddress(PHPLib, 'zend_set_timeout'); + + // -- zend_unset_timeout + zend_unset_timeout := GetProcAddress(PHPLib, 'zend_unset_timeout'); + + // -- zend_timeout + zend_timeout := GetProcAddress(PHPLib, 'zend_timeout'); + + // -- zend_highlight + zend_highlight := GetProcAddress(PHPLib, 'zend_highlight'); + + // -- zend_strip + zend_strip := GetProcAddress(PHPLib, 'zend_strip'); + + // -- highlight_file + highlight_file := GetProcAddress(PHPLib, 'highlight_file'); + + // -- highlight_string + highlight_string := GetProcAddress(PHPLib, 'highlight_string'); + + // -- zend_html_putc + zend_html_putc := GetProcAddress(PHPLib, 'zend_html_putc'); + + // -- zend_html_puts + zend_html_puts := GetProcAddress(PHPLib, 'zend_html_puts'); + + // -- zend_indent + zend_indent := GetProcAddress(PHPLib, 'zend_indent'); + + // -- _zend_get_parameters_array_ex + _zend_get_parameters_array_ex := GetProcAddress(PHPLib, '_zend_get_parameters_array_ex'); + + // -- zend_ini_refresh_caches + zend_ini_refresh_caches := GetProcAddress(PHPLib, 'zend_ini_refresh_caches'); + + // -- zend_alter_ini_entry + zend_alter_ini_entry := GetProcAddress(PHPLib, 'zend_alter_ini_entry'); + zend_alter_ini_entry_ex:= GetProcAddress(PHPLib, 'zend_alter_ini_entry_ex'); + // -- zend_restore_ini_entry + zend_restore_ini_entry := GetProcAddress(PHPLib, 'zend_restore_ini_entry'); + + // -- zend_ini_long + zend_ini_long := GetProcAddress(PHPLib, 'zend_ini_long'); + + // -- zend_ini_double + zend_ini_double := GetProcAddress(PHPLib, 'zend_ini_double'); + + // -- zend_ini_string + zend_ini_string := GetProcAddress(PHPLib, 'zend_ini_string'); + + // -- compile_string + compile_string := GetProcAddress(PHPLib, 'compile_string'); + + // -- execute + execute := GetProcAddress(PHPLib, {$IFDEF PHP550}'zend_execute'{$ELSE}'execute'{$ENDIF}); + + // -- zend_wrong_param_count + zend_wrong_param_count := GetProcAddress(PHPLib, 'zend_wrong_param_count'); + + // -- zend_hash_quick_add_or_update + _zend_hash_quick_add_or_update := GetProcAddress(PHPLib, '_zend_hash_quick_add_or_update'); + + // -- add_property_long_ex + add_property_long_ex := GetProcAddress(PHPLib, 'add_property_long_ex'); + + // -- add_property_null_ex + add_property_null_ex := GetProcAddress(PHPLib, 'add_property_null_ex'); + + // -- add_property_bool_ex + add_property_bool_ex := GetProcAddress(PHPLib, 'add_property_bool_ex'); + + // -- add_property_resource_ex + add_property_resource_ex := GetProcAddress(PHPLib, 'add_property_resource_ex'); + + // -- add_property_double_ex + add_property_double_ex := GetProcAddress(PHPLib, 'add_property_double_ex'); + + // -- add_property_string_ex + add_property_string_ex := GetProcAddress(PHPLib, 'add_property_string_ex'); + + // -- add_property_stringl_ex + add_property_stringl_ex := GetProcAddress(PHPLib, 'add_property_stringl_ex'); + + // -- add_property_zval_ex + add_property_zval_ex := GetProcAddress(PHPLib, 'add_property_zval_ex'); + + call_user_function := GetProcAddress(PHPLib, 'call_user_function'); + call_user_function_ex := GetProcAddress(PHPLib, 'call_user_function_ex'); + + // -- add_assoc_long_ex + add_assoc_long_ex := GetProcAddress(PHPLib, 'add_assoc_long_ex'); + + // -- add_assoc_null_ex + add_assoc_null_ex := GetProcAddress(PHPLib, 'add_assoc_null_ex'); + + // -- add_assoc_bool_ex + add_assoc_bool_ex := GetProcAddress(PHPLib, 'add_assoc_bool_ex'); + + // -- add_assoc_resource_ex + add_assoc_resource_ex := GetProcAddress(PHPLib, 'add_assoc_resource_ex'); + + // -- add_assoc_double_ex + add_assoc_double_ex := GetProcAddress(PHPLib, 'add_assoc_double_ex'); + + // -- add_assoc_string_ex + add_assoc_string_ex := GetProcAddress(PHPLib, 'add_assoc_string_ex'); + + // -- add_assoc_stringl_ex + add_assoc_stringl_ex := GetProcAddress(PHPLib, 'add_assoc_stringl_ex'); + + // -- add_assoc_zval_ex + add_assoc_zval_ex := GetProcAddress(PHPLib, 'add_assoc_zval_ex'); + + // -- add_index_long + add_index_long := GetProcAddress(PHPLib, 'add_index_long'); + + // -- add_index_null + add_index_null := GetProcAddress(PHPLib, 'add_index_null'); + + // -- add_index_bool + add_index_bool := GetProcAddress(PHPLib, 'add_index_bool'); + + // -- add_index_resource + add_index_resource := GetProcAddress(PHPLib, 'add_index_resource'); + + // -- add_index_double + add_index_double := GetProcAddress(PHPLib, 'add_index_double'); + + // -- add_index_string + add_index_string := GetProcAddress(PHPLib, 'add_index_string'); + + // -- add_index_stringl + add_index_stringl := GetProcAddress(PHPLib, 'add_index_stringl'); + + // -- add_index_zval + add_index_zval := GetProcAddress(PHPLib, 'add_index_zval'); + + // -- add_next_index_long + add_next_index_long := GetProcAddress(PHPLib, 'add_next_index_long'); + + // -- add_next_index_null + add_next_index_null := GetProcAddress(PHPLib, 'add_next_index_null'); + + // -- add_next_index_bool + add_next_index_bool := GetProcAddress(PHPLib, 'add_next_index_bool'); + + // -- add_next_index_resource + add_next_index_resource := GetProcAddress(PHPLib, 'add_next_index_resource'); + + // -- add_next_index_double + add_next_index_double := GetProcAddress(PHPLib, 'add_next_index_double'); + + // -- add_next_index_string + add_next_index_string := GetProcAddress(PHPLib, 'add_next_index_string'); + + // -- add_next_index_stringl + add_next_index_stringl := GetProcAddress(PHPLib, 'add_next_index_stringl'); + + // -- add_next_index_zval + add_next_index_zval := GetProcAddress(PHPLib, 'add_next_index_zval'); + + // -- add_get_assoc_string_ex + add_get_assoc_string_ex := GetProcAddress(PHPLib, 'add_get_assoc_string_ex'); + + // -- add_get_assoc_stringl_ex + add_get_assoc_stringl_ex := GetProcAddress(PHPLib, 'add_get_assoc_stringl_ex'); + + // -- add_get_index_long + add_get_index_long := GetProcAddress(PHPLib, 'add_get_index_long'); + + // -- add_get_index_double + add_get_index_double := GetProcAddress(PHPLib, 'add_get_index_double'); + + // -- add_get_index_string + add_get_index_string := GetProcAddress(PHPLib, 'add_get_index_string'); + + // -- add_get_index_stringl + add_get_index_stringl := GetProcAddress(PHPLib, 'add_get_index_stringl'); + + // -- _array_init + _array_init := GetProcAddress(PHPLib, '_array_init'); + + // -- _object_init + _object_init := GetProcAddress(PHPLib, '_object_init'); + + // -- _object_init_ex + _object_init_ex := GetProcAddress(PHPLib, '_object_init_ex'); + + // -- _object_and_properties_init + _object_and_properties_init := GetProcAddress(PHPLib, '_object_and_properties_init'); + + // -- zend_register_internal_class + zend_register_internal_class := GetProcAddress(PHPLib, 'zend_register_internal_class'); + + // -- zend_register_internal_class_ex + zend_register_internal_class_ex := GetProcAddress(PHPLib, 'zend_register_internal_class_ex'); + + // -- get_zend_version + get_zend_version := GetProcAddress(PHPLib, 'get_zend_version'); + + // -- zend_make_printable_zval + zend_make_printable_zval := GetProcAddress(PHPLib, 'zend_make_printable_zval'); + + // -- zend_print_zval + zend_print_zval := GetProcAddress(PHPLib, 'zend_print_zval'); + + // -- zend_print_zval_r + zend_print_zval_r := GetProcAddress(PHPLib, 'zend_print_zval_r'); + + // -- zend_output_debug_string + zend_output_debug_string := GetProcAddress(PHPLib, 'zend_output_debug_string'); + + // -- zend_get_parameters + ZendGetParameters := GetProcAddress(PHPLib, 'zend_get_parameters'); + + // - zend_get_parameters_ex (native call) + zend_get_params_ex := GetProcAddress(PHPLib, 'zend_get_params_ex'); + {$IFDEF PHP5} + zend_destroy_file_handle := GetProcAddress(PHPLib, 'zend_destroy_file_handle'); + {$ENDIF} + + {$IFNDEF QUIET_LOAD} + CheckZendErrors; + {$ENDIF} + + WriteFuncPtr := GetProcAddress(PHPLib, 'zend_write'); + if Assigned(WriteFuncPtr) then + @zend_write := pointer(WriteFuncPtr^); + + Result := true; +end; + +procedure ZEND_PUTS(str: PAnsiChar); +begin + if assigned(str) then + zend_write(str, strlen(str)); +end; + +procedure convert_to_string(op: pzval); +begin + _convert_to_string(op, nil, 0); +end; + +procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: PAnsiChar; functions: pointer); +begin + + if class_name = nil then + Exit; + + ZeroMemory(@class_container, sizeof(Tzend_class_entry)); + + {$IFNDEF COMPILER_VC9} + class_container.name := strdup(class_name); + {$ELSE} + class_container.name := estrdup(class_name); + {$ENDIF} + + class_container.name_length := strlen(class_name); + class_container.builtin_functions := functions; + + {$IFDEF PHP4} + class_container.handle_function_call := nil; + class_container.handle_property_get := nil; + class_container.handle_property_set := nil; + {$ENDIF} +end; + +function ZEND_FAST_ALLOC: pzval; +begin + Result := emalloc(sizeof(zval)); +end; + +function ALLOC_ZVAL: pzval; +begin + Result := emalloc(sizeof(zval)); +end; + +procedure ALLOC_ZVAL(out Result: pzval); +begin + Result := emalloc(sizeof(zval)); +end; + +procedure INIT_PZVAL(p: pzval); +begin + p^.refcount := 1; + p^.is_ref := 0; +end; + +procedure LOCK_ZVAL(p: pzval); +begin + Inc(p^.refcount); +end; + +procedure UNLOCK_ZVAL(p: pzval); +begin + if p^.refcount > 0 then + Dec(p^.refcount); +end; + +function MAKE_STD_ZVAL: pzval; +begin + Result := ALLOC_ZVAL; + INIT_PZVAL(Result); +end; + +function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; +var + i : integer; +begin + SetLength(Params, number); + if number = 0 then + begin + Result := SUCCESS; + Exit; + end; + for i := 0 to number - 1 do + New(Params[i]); + + Result := zend_get_parameters(number, number, Params); +end; + +function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; +var + i : integer; + p: pppzval; +begin + SetLength(Params, number); + if number = 0 then + begin + Result := SUCCESS; + Exit; + end; + for i := 0 to number - 1 do + New(Params[i]); + + p := emalloc(number * sizeOf(ppzval)); + Result := _zend_get_parameters_array_ex(number, p, TSRMLS_DC); + + for i := 0 to number - 1 do + begin + Params[i]^ := p^^; + if i <> number then + inc(integer(p^), sizeof(ppzval)); + end; + + efree(p); +end; + +function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; assembler; register; +asm + push esi + mov esi, ecx + mov ecx, [ebp+8] + cmp ecx, 0 + je @first + @toploop: + {$IFDEF VERSION6} + push [esi][ecx * 4] + {$ELSE} + push dword [esi][ecx * 4] + {$ENDIF} + loop @toploop + @first: + push dword [esi] + push edx + push eax + call ZendGetParameters + mov ecx, [ebp+8] + add ecx, 3 + @toploop2: + pop edx + loop @toploop2 + pop esi +end; + +procedure dispose_pzval_array(Params: pzval_array); +var + i : integer; +begin + if Length(Params)>0 then + + for i := 0 to High(Params) do + FreeMem(Params[i]); + Params := nil; +end; + +{ EPHP4DelphiException } + +constructor EPHP4DelphiException.Create(const Msg: AnsiString); +begin + inherited Create('Unable to link '+ Msg+' function'); +end; + +{procedure zenderror(Error : PAnsiChar); +begin + zend_error(E_PARSE, Error); +end;} + + +{$IFNDEF QUIET_LOAD} +procedure CheckZendErrors; +begin + if @zend_disable_function = nil then raise EPHP4DelphiException.Create('zend_disable_function'); + if @zend_disable_class = nil then raise EPHP4DelphiException.Create('zend_disable_class'); + if @zend_register_list_destructors_ex = nil then raise EPHP4DelphiException.Create('zend_register_list_destructors_ex'); + if @zend_register_resource = nil then raise EPHP4DelphiException.Create('zend_register_resource'); + if @zend_fetch_resource = nil then raise EPHP4DelphiException.Create('zend_fetch_resource'); + if @zend_list_insert = nil then raise EPHP4DelphiException.Create('zend_list_insert'); + {$IFNDEF PHP700} + if @_zend_list_addref = nil then raise EPHP4DelphiException.Create('zend_list_addref'); + if @_zend_list_delete = nil then raise EPHP4DelphiException.Create('zend_list_delete'); + if @_zend_list_find = nil then raise EPHP4DelphiException.Create('_zend_list_find'); + {$ENDIF} + if @zend_rsrc_list_get_rsrc_type = nil then raise EPHP4DelphiException.Create('zend_rsrc_list_get_rsrc_type'); + if @zend_fetch_list_dtor_id = nil then raise EPHP4DelphiException.Create('zend_fetch_list_dtor_id'); + if @zend_get_compiled_filename = nil then raise EPHP4DelphiException.Create('zend_get_compiled_filename'); + if @zend_get_compiled_lineno = nil then raise EPHP4DelphiException.Create('zend_get_compiled_lineno'); + if @tsrm_startup = nil then raise EPHP4DelphiException.Create('tsrm_startup'); + if @ts_allocate_id = nil then raise EPHP4DelphiException.Create('ts_allocate_id'); + if @ts_free_id = nil then raise EPHP4DelphiException.Create('ts_free_id'); + if @zend_strndup = nil then raise EPHP4DelphiException.Create('zend_strndup'); + if @_emalloc = nil then raise EPHP4DelphiException.Create('_emalloc'); + if @_efree = nil then raise EPHP4DelphiException.Create('_efree'); + if @_ecalloc = nil then raise EPHP4DelphiException.Create('_ecalloc'); + if @_erealloc = nil then raise EPHP4DelphiException.Create('_erealloc'); + if @_estrdup = nil then raise EPHP4DelphiException.Create('_estrdup'); + if @_estrndup = nil then raise EPHP4DelphiException.Create('_estrndup'); + if @zend_set_memory_limit = nil then raise EPHP4DelphiException.Create('zend_set_memory_limit'); + if @start_memory_manager = nil then raise EPHP4DelphiException.Create('start_memory_manager'); + if @shutdown_memory_manager = nil then raise EPHP4DelphiException.Create('shutdown_memory_manager'); + {$IFDEF PHP4} + if @zend_hash_init = nil then raise EPHP4DelphiException.Create('zend_hash_init'); + if @zend_hash_init_ex = nil then raise EPHP4DelphiException.Create('zend_hash_init_ex'); + if @zend_hash_add_or_update = nil then raise EPHP4DelphiException.Create('zend_hash_add_or_update'); + if @zend_hash_quick_add_or_update = nil then raise EPHP4DelphiException.Create('zend_hash_quick_add_or_update'); + if @zend_hash_index_update_or_next_insert = nil then raise EPHP4DelphiException.Create('zend_hash_index_update_or_next_insert'); + if @zend_hash_merge = nil then raise EPHP4DelphiException.Create('zend_hash_merge'); + {$ENDIF} + + {$IFDEF PHP5} + if @_zend_hash_add_or_update = nil then raise EPHP4DelphiException.Create('_zend_hash_add_or_update'); + {$ENDIF} + + if @zend_hash_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_destroy'); + if @zend_hash_clean = nil then raise EPHP4DelphiException.Create('zend_hash_clean'); + if @zend_hash_add_empty_element = nil then raise EPHP4DelphiException.Create('zend_hash_add_empty_element'); + if @zend_hash_graceful_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_graceful_destroy'); + if @zend_hash_graceful_reverse_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_graceful_reverse_destroy'); + if @zend_hash_apply = nil then raise EPHP4DelphiException.Create('zend_hash_apply'); + if @zend_hash_apply_with_argument = nil then raise EPHP4DelphiException.Create('zend_hash_apply_with_argument'); + if @zend_hash_reverse_apply = nil then raise EPHP4DelphiException.Create('zend_hash_reverse_apply'); + if @zend_hash_del_key_or_index = nil then raise EPHP4DelphiException.Create('zend_hash_del_key_or_index'); + if @zend_get_hash_value = nil then raise EPHP4DelphiException.Create('zend_get_hash_value'); + if @zend_hash_find = nil then raise EPHP4DelphiException.Create('zend_hash_find'); + if @zend_hash_quick_find = nil then raise EPHP4DelphiException.Create('zend_hash_quick_find'); + if @zend_hash_index_find = nil then raise EPHP4DelphiException.Create('zend_hash_index_find'); + if @zend_hash_exists = nil then raise EPHP4DelphiException.Create('zend_hash_exists'); + if @zend_hash_index_exists = nil then raise EPHP4DelphiException.Create('zend_hash_index_exists'); + if @zend_hash_next_free_element = nil then raise EPHP4DelphiException.Create('zend_hash_next_free_element'); + if @zend_hash_move_forward_ex = nil then raise EPHP4DelphiException.Create('zend_hash_move_forward_ex'); + if @zend_hash_move_backwards_ex = nil then raise EPHP4DelphiException.Create('zend_hash_move_backwards_ex'); + if @zend_hash_get_current_key_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_key_ex'); + if @zend_hash_get_current_key_type_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_key_type_ex'); + if @zend_hash_get_current_data_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_data_ex'); + if @zend_hash_internal_pointer_reset_ex = nil then raise EPHP4DelphiException.Create('zend_hash_internal_pointer_reset_ex'); + if @zend_hash_internal_pointer_end_ex = nil then raise EPHP4DelphiException.Create('zend_hash_internal_pointer_end_ex'); + if @zend_hash_copy = nil then raise EPHP4DelphiException.Create('zend_hash_copy'); + if @zend_hash_sort = nil then raise EPHP4DelphiException.Create('zend_hash_sort'); + if @zend_hash_compare = nil then raise EPHP4DelphiException.Create('zend_hash_compare'); + if @zend_hash_minmax = nil then raise EPHP4DelphiException.Create('zend_hash_minmax'); + if @zend_hash_num_elements = nil then raise EPHP4DelphiException.Create('zend_hash_num_elements'); + if @zend_hash_rehash = nil then raise EPHP4DelphiException.Create('zend_hash_rehash'); + if @zend_hash_func = nil then raise EPHP4DelphiException.Create('zend_hash_func'); + if @zend_get_constant = nil then raise EPHP4DelphiException.Create('zend_get_constant'); + if @zend_register_long_constant = nil then raise EPHP4DelphiException.Create('zend_register_long_constant'); + if @zend_register_double_constant = nil then raise EPHP4DelphiException.Create('zend_register_double_constant'); + if @zend_register_string_constant = nil then raise EPHP4DelphiException.Create('zend_register_string_constant'); + if @zend_register_stringl_constant = nil then raise EPHP4DelphiException.Create('zend_register_stringl_constant'); + if @zend_register_constant = nil then raise EPHP4DelphiException.Create('zend_register_constant'); + if @tsrm_shutdown = nil then raise EPHP4DelphiException.Create('tsrm_shutdown'); + if @ts_resource_ex = nil then raise EPHP4DelphiException.Create('ts_resource_ex'); + if @ts_free_thread = nil then raise EPHP4DelphiException.Create('ts_free_thread'); + if @zend_error = nil then raise EPHP4DelphiException.Create('zend_error'); + if @zend_error_cb = nil then raise EPHP4DelphiException.Create('zend_error_cb'); + if @zend_eval_string = nil then raise EPHP4DelphiException.Create('zend_eval_string'); + if @zend_make_compiled_string_description = nil then raise EPHP4DelphiException.Create('zend_make_compiled_string_description'); + + {$IFDEF PHP4} + if @_zval_dtor = nil then raise EPHP4DelphiException.Create('_zval_dtor'); + if @_zval_copy_ctor = nil then raise EPHP4DelphiException.Create('_zval_copy_ctor'); + {$ELSE} + if @_zval_dtor_func = nil then raise EPHP4DelphiException.Create('_zval_dtor_func'); + if @_zval_copy_ctor_func = nil then raise EPHP4DelphiException.Create('_zval_ctor_func'); + {$ENDIF} + + if @zend_print_variable = nil then raise EPHP4DelphiException.Create('zend_print_variable'); + if @zend_stack_init = nil then raise EPHP4DelphiException.Create('zend_stack_init'); + if @zend_stack_push = nil then raise EPHP4DelphiException.Create('zend_stack_push'); + if @zend_stack_top = nil then raise EPHP4DelphiException.Create('zend_stack_top'); + if @zend_stack_del_top = nil then raise EPHP4DelphiException.Create('zend_stack_del_top'); + if @zend_stack_int_top = nil then raise EPHP4DelphiException.Create('zend_stack_int_top'); + if @zend_stack_is_empty = nil then raise EPHP4DelphiException.Create('zend_stack_is_empty'); + if @zend_stack_destroy = nil then raise EPHP4DelphiException.Create('zend_stack_destroy'); + if @zend_stack_base = nil then raise EPHP4DelphiException.Create('zend_stack_base'); + if @zend_stack_count = nil then raise EPHP4DelphiException.Create('zend_stack_count'); + if @zend_stack_apply = nil then raise EPHP4DelphiException.Create('zend_stack_apply'); + if @zend_stack_apply_with_argument = nil then raise EPHP4DelphiException.Create('zend_stack_apply_with_argument'); + if @_convert_to_string = nil then raise EPHP4DelphiException.Create('_convert_to_string'); + if @add_function = nil then raise EPHP4DelphiException.Create('add_function'); + if @sub_function = nil then raise EPHP4DelphiException.Create('sub_function'); + if @mul_function = nil then raise EPHP4DelphiException.Create('mul_function'); + if @div_function = nil then raise EPHP4DelphiException.Create('div_function'); + if @mod_function = nil then raise EPHP4DelphiException.Create('mod_function'); + if @boolean_xor_function = nil then raise EPHP4DelphiException.Create('boolean_xor_function'); + if @boolean_not_function = nil then raise EPHP4DelphiException.Create('boolean_not_function'); + if @bitwise_not_function = nil then raise EPHP4DelphiException.Create('bitwise_not_function'); + if @bitwise_or_function = nil then raise EPHP4DelphiException.Create('bitwise_or_function'); + if @bitwise_and_function = nil then raise EPHP4DelphiException.Create('bitwise_and_function'); + if @bitwise_xor_function = nil then raise EPHP4DelphiException.Create('bitwise_xor_function'); + if @shift_left_function = nil then raise EPHP4DelphiException.Create('shift_left_function'); + if @shift_right_function = nil then raise EPHP4DelphiException.Create('shift_right_function'); + if @concat_function = nil then raise EPHP4DelphiException.Create('concat_function'); + if @is_equal_function = nil then raise EPHP4DelphiException.Create('is_equal_function'); + if @is_identical_function = nil then raise EPHP4DelphiException.Create('is_identical_function'); + if @is_not_identical_function = nil then raise EPHP4DelphiException.Create('is_not_identical_function'); + if @is_not_equal_function = nil then raise EPHP4DelphiException.Create('is_not_equal_function'); + if @is_smaller_function = nil then raise EPHP4DelphiException.Create('is_smaller_function'); + if @is_smaller_or_equal_function = nil then raise EPHP4DelphiException.Create('is_smaller_or_equal_function'); + if @increment_function = nil then raise EPHP4DelphiException.Create('increment_function'); + if @decrement_function = nil then raise EPHP4DelphiException.Create('decrement_function'); + if @convert_scalar_to_number = nil then raise EPHP4DelphiException.Create('convert_scalar_to_number'); + if @convert_to_long = nil then raise EPHP4DelphiException.Create('convert_to_long'); + if @convert_to_double = nil then raise EPHP4DelphiException.Create('convert_to_double'); + if @convert_to_long_base = nil then raise EPHP4DelphiException.Create('convert_to_long_base'); + if @convert_to_null = nil then raise EPHP4DelphiException.Create('convert_to_null'); + if @convert_to_boolean = nil then raise EPHP4DelphiException.Create('convert_to_boolean'); + if @convert_to_array = nil then raise EPHP4DelphiException.Create('convert_to_array'); + if @convert_to_object = nil then raise EPHP4DelphiException.Create('convert_to_object'); + if @add_char_to_string = nil then raise EPHP4DelphiException.Create('add_char_to_string'); + if @add_string_to_string = nil then raise EPHP4DelphiException.Create('add_string_to_string'); + if @zend_string_to_double = nil then raise EPHP4DelphiException.Create('zend_string_to_double'); + if @zval_is_true = nil then raise EPHP4DelphiException.Create('zval_is_true'); + if @compare_function = nil then raise EPHP4DelphiException.Create('compare_function'); + if @numeric_compare_function = nil then raise EPHP4DelphiException.Create('numeric_compare_function'); + if @string_compare_function = nil then raise EPHP4DelphiException.Create('string_compare_function'); + if @zend_str_tolower = nil then raise EPHP4DelphiException.Create('zend_str_tolower'); + if @zend_binary_zval_strcmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strcmp'); + if @zend_binary_zval_strncmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strncmp'); + if @zend_binary_zval_strcasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strcasecmp'); + if @zend_binary_zval_strncasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strncasecmp'); + if @zend_binary_strcmp = nil then raise EPHP4DelphiException.Create('zend_binary_strcmp'); + if @zend_binary_strncmp = nil then raise EPHP4DelphiException.Create('zend_binary_strncmp'); + if @zend_binary_strcasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_strcasecmp'); + if @zend_binary_strncasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_strncasecmp'); + if @zendi_smart_strcmp = nil then raise EPHP4DelphiException.Create('zendi_smart_strcmp'); + if @zend_compare_symbol_tables = nil then raise EPHP4DelphiException.Create('zend_compare_symbol_tables'); + if @zend_compare_arrays = nil then raise EPHP4DelphiException.Create('zend_compare_arrays'); + if @zend_compare_objects = nil then raise EPHP4DelphiException.Create('zend_compare_objects'); + if @zend_atoi = nil then raise EPHP4DelphiException.Create('zend_atoi'); + if @get_active_function_name = nil then raise EPHP4DelphiException.Create('get_active_function_name'); + if @zend_get_executed_filename = nil then raise EPHP4DelphiException.Create('zend_get_executed_filename'); + if @zend_set_timeout = nil then raise EPHP4DelphiException.Create('zend_set_timeout'); + if @zend_unset_timeout = nil then raise EPHP4DelphiException.Create('zend_unset_timeout'); + if @zend_timeout = nil then raise EPHP4DelphiException.Create('zend_timeout'); + if @zend_highlight = nil then raise EPHP4DelphiException.Create('zend_highlight'); + if @zend_strip = nil then raise EPHP4DelphiException.Create('zend_strip'); + if @highlight_file = nil then raise EPHP4DelphiException.Create('highlight_file'); + if @highlight_string = nil then raise EPHP4DelphiException.Create('highlight_string'); + if @zend_html_putc = nil then raise EPHP4DelphiException.Create('zend_html_putc'); + if @zend_html_puts = nil then raise EPHP4DelphiException.Create('zend_html_puts'); + if @zend_indent = nil then raise EPHP4DelphiException.Create('zend_indent'); + if @_zend_get_parameters_array_ex = nil then raise EPHP4DelphiException.Create('_zend_get_parameters_array_ex'); + if @zend_ini_refresh_caches = nil then raise EPHP4DelphiException.Create('zend_ini_refresh_caches'); + if @zend_alter_ini_entry = nil then raise EPHP4DelphiException.Create('zend_alter_ini_entry'); + if @zend_restore_ini_entry = nil then raise EPHP4DelphiException.Create('zend_restore_ini_entry'); + if @zend_ini_long = nil then raise EPHP4DelphiException.Create('zend_ini_long'); + if @zend_ini_double = nil then raise EPHP4DelphiException.Create('zend_ini_double'); + if @zend_ini_string = nil then raise EPHP4DelphiException.Create('zend_ini_string'); + if @compile_string = nil then raise EPHP4DelphiException.Create('compile_string'); + if @execute = nil then raise EPHP4DelphiException.Create('execute'); + if @zend_wrong_param_count = nil then raise EPHP4DelphiException.Create('zend_wrong_param_count'); + if @add_property_long_ex = nil then raise EPHP4DelphiException.Create('add_property_long_ex'); + if @add_property_null_ex = nil then raise EPHP4DelphiException.Create('add_property_null_ex'); + if @add_property_bool_ex = nil then raise EPHP4DelphiException.Create('add_property_bool_ex'); + if @add_property_resource_ex = nil then raise EPHP4DelphiException.Create('add_property_resource_ex'); + if @add_property_double_ex = nil then raise EPHP4DelphiException.Create('add_property_double_ex'); + if @add_property_string_ex = nil then raise EPHP4DelphiException.Create('add_property_string_ex'); + if @add_property_stringl_ex = nil then raise EPHP4DelphiException.Create('add_property_stringl_ex'); + if @add_property_zval_ex = nil then raise EPHP4DelphiException.Create('add_property_zval_ex'); + if @call_user_function = nil then raise EPHP4DelphiException.Create('call_user_function'); + if @call_user_function_ex = nil then raise EPHP4DelphiException.Create('call_user_function_ex'); + if @add_assoc_long_ex = nil then raise EPHP4DelphiException.Create('add_assoc_long_ex'); + if @add_assoc_null_ex = nil then raise EPHP4DelphiException.Create('add_assoc_null_ex'); + if @add_assoc_bool_ex = nil then raise EPHP4DelphiException.Create('add_assoc_bool_ex'); + if @add_assoc_resource_ex = nil then raise EPHP4DelphiException.Create('add_assoc_resource_ex'); + if @add_assoc_double_ex = nil then raise EPHP4DelphiException.Create('add_assoc_double_ex'); + if @add_assoc_string_ex = nil then raise EPHP4DelphiException.Create('add_assoc_string_ex'); + if @add_assoc_stringl_ex = nil then raise EPHP4DelphiException.Create('add_assoc_stringl_ex'); + if @add_assoc_zval_ex = nil then raise EPHP4DelphiException.Create('add_assoc_zval_ex'); + if @add_index_long = nil then raise EPHP4DelphiException.Create('add_index_long'); + if @add_index_null = nil then raise EPHP4DelphiException.Create('add_index_null'); + if @add_index_bool = nil then raise EPHP4DelphiException.Create('add_index_bool'); + if @add_index_resource = nil then raise EPHP4DelphiException.Create('add_index_resource'); + if @add_index_double = nil then raise EPHP4DelphiException.Create('add_index_double'); + if @add_index_string = nil then raise EPHP4DelphiException.Create('add_index_string'); + if @add_index_stringl = nil then raise EPHP4DelphiException.Create('add_index_stringl'); + if @add_index_zval = nil then raise EPHP4DelphiException.Create('add_index_zval'); + if @add_next_index_long = nil then raise EPHP4DelphiException.Create('add_next_index_long'); + if @add_next_index_null = nil then raise EPHP4DelphiException.Create('add_next_index_null'); + if @add_next_index_bool = nil then raise EPHP4DelphiException.Create('add_next_index_bool'); + if @add_next_index_resource = nil then raise EPHP4DelphiException.Create('add_next_index_resource'); + if @add_next_index_double = nil then raise EPHP4DelphiException.Create('add_next_index_double'); + if @add_next_index_string = nil then raise EPHP4DelphiException.Create('add_next_index_string'); + if @add_next_index_stringl = nil then raise EPHP4DelphiException.Create('add_next_index_stringl'); + if @add_next_index_zval = nil then raise EPHP4DelphiException.Create('add_next_index_zval'); + if @add_get_assoc_string_ex = nil then raise EPHP4DelphiException.Create('add_get_assoc_string_ex'); + if @add_get_assoc_stringl_ex = nil then raise EPHP4DelphiException.Create('add_get_assoc_stringl_ex'); + if @add_get_index_long = nil then raise EPHP4DelphiException.Create('add_get_index_long'); + if @add_get_index_double = nil then raise EPHP4DelphiException.Create('add_get_index_double'); + if @add_get_index_string = nil then raise EPHP4DelphiException.Create('add_get_index_string'); + if @add_get_index_stringl = nil then raise EPHP4DelphiException.Create('add_get_index_stringl'); + if @_array_init = nil then raise EPHP4DelphiException.Create('_array_init'); + if @_object_init = nil then raise EPHP4DelphiException.Create('_object_init'); + if @_object_init_ex = nil then raise EPHP4DelphiException.Create('_object_init_ex'); + if @_object_and_properties_init = nil then raise EPHP4DelphiException.Create('_object_and_properties_init'); + if @zend_register_internal_class = nil then raise EPHP4DelphiException.Create('zend_register_internal_class'); + if @zend_register_internal_class_ex = nil then raise EPHP4DelphiException.Create('zend_register_internal_class_ex'); + if @get_zend_version = nil then raise EPHP4DelphiException.Create('get_zend_version'); + if @zend_make_printable_zval = nil then raise EPHP4DelphiException.Create('zend_make_printable_zval'); + if @zend_print_zval = nil then raise EPHP4DelphiException.Create('zend_print_zval'); + if @zend_print_zval_r = nil then raise EPHP4DelphiException.Create('zend_print_zval_r'); + if @zend_output_debug_string = nil then raise EPHP4DelphiException.Create('zend_output_debug_string'); + if @ZendGetParameters = nil then raise EPHP4DelphiException.Create('zend_get_parameters'); +end; +{$ENDIF} + +function zend_hash_get_current_data(ht: PHashTable; pData: Pointer): Integer; cdecl; +begin + result := zend_hash_get_current_data_ex(ht, pData, nil); +end; + +procedure zend_hash_internal_pointer_reset(ht: PHashTable); cdecl; +begin + zend_hash_internal_pointer_reset_ex(ht, nil); +end; + +function ts_resource(id : integer) : pointer; +begin + result := ts_resource_ex(id, nil); +end; + +function tsrmls_fetch : pointer; +begin + result := ts_resource_ex(0, nil); +end; + +{$IFDEF PHP4} +function zval_copy_ctor(val : pzval) : integer; +begin + result := _zval_copy_ctor(val, nil, 0); +end; +{$ENDIF} + +function zend_unregister_functions(functions : pzend_function_entry; count : integer; function_table : PHashTable; TSRMLS_DC : pointer) : integer; +var + i : integer; + ptr : pzend_function_entry; +begin + Result := SUCCESS; + i := 0; + ptr := functions; + if ptr = nil then + Exit; + while ptr.fname <> nil do + begin + if ( count <> -1 ) and (i >= count) then + break; + zend_hash_del_key_or_index(function_table, ptr.fname, strlen(ptr.fname) +1, 0, HASH_DEL_KEY); + inc(ptr); + inc(i); + end; +end; + +// registers all functions in *library_functions in the function hash + +function zend_register_functions(functions : pzend_function_entry; function_table : PHashTable; _type: integer; TSRMLS_DC : pointer) : integer; +var + ptr : pzend_function_entry; + _function : zend_function; + internal_function : PzendInternalFunction; + count : integer; + unload : integer; + target_function_table : PHashTable; + error_type : integer; + +begin + Result := FAILURE; + if functions = nil then + Exit; + ptr := functions; + count := 0; + unload := 0; + if _type = MODULE_PERSISTENT then + error_type := E_CORE_WARNING + else + error_type := E_WARNING; + + internal_function := @_function; + target_function_table := function_table; + + if (target_function_table = nil) then + target_function_table := GetCompilerGlobals.function_table; + + + internal_function._type := ZEND_INTERNAL_FUNCTION; + + while (ptr.fname <> nil) do + begin + internal_function.handler := ptr.handler; + internal_function.function_name := ptr.fname; + if (internal_function.handler = nil) then begin + zend_error(error_type, 'Null function defined as active function'); + zend_unregister_functions(functions, count, target_function_table, TSRMLS_DC); + Result := FAILURE; + Exit; + end; + + if (zend_hash_add_or_update(target_function_table, ptr.fname, strlen(ptr.fname)+1, @_function, sizeof(zend_function), nil, HASH_ADD) = FAILURE) then + begin + unload:=1; + break; + end; + inc(ptr); + inc(count); + end; + + + if (unload = 1) then begin // before unloading, display all remaining bad function in the module */ + while (ptr.fname<> nil) do begin + if (zend_hash_exists(target_function_table, ptr.fname, strlen(ptr.fname)+1)) = 1 then + begin + zend_error(error_type, PAnsiChar(Format('Function registration failed - duplicate name - %s', [ptr.fname]))); + end; + inc(ptr); + end; + zend_unregister_functions(functions, count, target_function_table, TSRMLS_DC); + result := FAILURE; + Exit; + end; + Result := SUCCESS; + +end; + + + +function GetGlobalResource(resource_name: AnsiString) : pointer; +var + global_id : pointer; + global_value : integer; + global_ptr : pointer; + tsrmls_dc : pointer; +begin + Result := nil; + try + global_id := GetProcAddress(PHPLib, PAnsiChar(resource_name)); + if Assigned(global_id) then + begin + tsrmls_dc := tsrmls_fetch; + global_value := integer(global_id^); + asm + mov ecx, global_value + mov edx, dword ptr tsrmls_dc + mov eax, dword ptr [edx] + mov ecx, dword ptr [eax+ecx*4-4] + mov global_ptr, ecx + end; + Result := global_ptr; + end; + except + Result := nil; + end; +end; + + +function GetCompilerGlobals : Pzend_compiler_globals; +begin + result := GetGlobalResource('compiler_globals_id'); +end; + +function GetExecutorGlobals : pzend_executor_globals; +begin + result := GetGlobalResource('executor_globals_id'); +end; + +function GetAllocGlobals : pointer; +begin + result := GetGlobalResource('alloc_globals_id'); +end; + +{$IFDEF PHP5} + +procedure zend_addref_p; +begin + Inc(z.refcount); +end; + +procedure my_class_add_ref; +begin + Inc(aclass^^.refcount,1); +end; + +procedure copy_zend_constant(C: PZendConstant); cdecl; + var + I: Integer; +begin + C^.name := zend_strndup(C^.name, C^.name_len - 1); + I := c^.flags and CONST_PERSISTENT; + if I > 0 then + _zval_copy_ctor(@c.value, nil, 0); +end; + +function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : integer; cdecl; assembler; +asm + mov eax, [esp + 16] + mov ecx, [esp + 12] + mov edx, [esp + 8] + pop ebp + push eax + push ecx + push edx + call _object_init_ex + add esp, $0c + ret +end; + + +function Z_LVAL(z : pzval) : longint; +begin + if z = nil then + begin + Result := 0; + exit; + end; + + if z._type = IS_LONG then + Result := z.value.lval + else + case z._type of + IS_DOUBLE: Result := Trunc(z.value.dval); + IS_BOOL : Result := z.value.lval; + IS_STRING: Result := StrToIntDef( Z_STRVAL(z), 0 ); + else + Result := 0; + end; +end; + +function Z_BVAL(z : pzval) : boolean; +begin + if z = nil then + begin + Result := false; + exit; + end; + + if z._type = IS_BOOL then + Result := zend_bool(z.value.lval) + else + case z._type of + IS_DOUBLE: if Trunc(z.value.dval) = 0 then Result := false else Result := true; + IS_LONG : if z.value.lval = 0 then Result := false else Result := true; + IS_STRING: if Z_STRVAL(z) = '' then Result := False else Result := True; + else + Result := False; + end; + //Result := zend_bool(z.value.lval); +end; + +function Z_DVAL(z : pzval) : double; +begin + if z = nil then + begin + Result := 0; + exit; + end; + + if z._type = IS_DOUBLE then + Result := z.value.dval + else + case z._type of + IS_LONG, IS_BOOL: Result := z.value.lval; + IS_STRING: Result := StrToFloatDef( Z_STRVAL(z), 0 ); + else + Result := 0; + end; +end; + +function Z_VARREC(z: pzval): TVarRec; + Var + P: AnsiString; +begin + if z = nil then + begin + Result.VType := vtBoolean; + Result.VBoolean := false; + exit; + end; + + case z._type of + IS_BOOL: begin + Result.VType := vtBoolean; + Result.VBoolean := Boolean(z.value.lval); + end; + IS_LONG: begin + Result.VType := vtInteger; + Result.VInteger := z.value.lval; + end; + IS_DOUBLE: begin + Result.VType := vtExtended; + New(Result.VExtended); + Result.VExtended^ := z.value.dval; + end; + IS_STRING: begin + Result.VType := vtAnsiString; + + SetLength(P, z.value.str.len); + Move(z.value.str.val^, P[1], z.value.str.len); + + Result.VAnsiString := Pointer(P); + end; + else + begin + Result.VType := vtPointer; + Result.VPointer := nil; + end; + end; +end; + +function Z_STRUVAL(z : pzval) : UTF8String; +begin + if z = nil then + begin + Result := ''; + exit; + end; + + if z._type = IS_STRING then + begin + SetLength(Result, z.value.str.len); + Move(z.value.str.val^, Result[1], z.value.str.len); + end else + case z._type of + IS_LONG: Result := IntToStr(z.value.lval); + IS_DOUBLE: Result := FloatToStr(z.value.dval); + IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; + else + Result := ''; + end; +end; + +function Z_STRVAL(z : pzval) : AnsiString; +begin + if z = nil then + begin + Result := ''; + exit; + end; + + if z._type = IS_STRING then + begin + SetLength(Result, z.value.str.len); + Move(z.value.str.val^, Result[1], z.value.str.len); + end else + case z._type of + IS_LONG: Result := IntToStr(z.value.lval); + IS_DOUBLE: Result := FloatToStr(z.value.dval); + IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; + else + Result := ''; + end; +end; + +function Z_STRWVAL(z : pzval) : String; +begin + if z = nil then + begin + Result := ''; + exit; + end; + + if z._type = IS_STRING then + begin + SetLength(Result, z.value.str.len); + Move(z.value.str.val^, Result[1], z.value.str.len); + end else + case z._type of + IS_LONG: Result := IntToStr(z.value.lval); + IS_DOUBLE: Result := FloatToStr(z.value.dval); + IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; + else + Result := ''; + end; +end; + +function Z_STRLEN(z : pzval) : longint; +begin + Result := Length(Z_STRVAL(z)); +end; + +function Z_ARRVAL(z : pzval ) : PHashTable; +begin + Result := z.value.ht; +end; + +function Z_OBJ_HANDLE(z :pzval) : zend_object_handle; +begin + Result := z.value.obj.handle; +end; + +function Z_OBJ_HT(z : pzval) : pzend_object_handlers; +begin + Result := z.value.obj.handlers; +end; + +function Z_OBJPROP(z : pzval) : PHashtable; +var + TSRMLS_DC : pointer; +begin + TSRMLS_DC := ts_resource_ex(0, nil); + Result := Z_OBJ_HT(z)^.get_properties(@z, TSRMLS_DC); +end; + + +{$ENDIF} + +{$IFDEF PHP5} +procedure _zval_copy_ctor (val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); +begin + if val^._type <= IS_BOOL then + Exit + else + _zval_copy_ctor_func(val, __zend_filename, __zend_lineno); +end; + +procedure _zval_dtor(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); +begin + if val^._type <= IS_BOOL then + Exit + else + _zval_dtor_func(val, __zend_filename, __zend_lineno); +end; + +function zend_hash_init (ht : PHashTable; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool) : integer; +begin + Result := _zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent, nil, 0); +end; + +function zend_hash_add_or_update(ht : PHashTable; arKey : PAnsiChar; + nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; + flag : integer) : integer; +begin + if Assigned(_zend_hash_add_or_update) then + Result := _zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDes, flag, nil, 0) + else + Result := FAILURE; +end; + +function zend_hash_init_ex (ht : PHashTable; nSize : uint; pHashFunction : pointer; + pDestructor : pointer; persistent : zend_bool; bApplyProtection : zend_bool): integer; +begin + Result := _zend_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection, nil, 0); +end; + +{$ENDIF} + + +function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; +begin + Result := Sysutils.Format(Format, Args); +end; + +{$IFDEF COMPILER_VC9} +function DupStr(strSource : PAnsiChar) : PAnsiChar; cdecl; +var + P : PAnsiChar; +begin + + if (strSource = nil) then + P := nil + else + begin + P := StrNew(strSource); + end; + Result := P; +end; +{$ENDIF} + +initialization +{$IFDEF PHP4DELPHI_AUTOLOAD} + LoadZEND; +{$ENDIF} + +finalization +{$IFDEF PHP4DELPHI_AUTOUNLOAD} + UnloadZEND; +{$ENDIF} + +end. + + diff --git a/ZendTypes.pas b/ZendTypes.pas index e43872c..5cfee75 100644 --- a/ZendTypes.pas +++ b/ZendTypes.pas @@ -1,1373 +1,1582 @@ -{*******************************************************} -{ PHP4Delphi } -{ ZEND - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: ZendTypes.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit ZENDTypes; - -interface - -uses - Windows; - -const - //zend.h - ZEND_MAX_RESERVED_RESOURCES = 4; - - //zend_vm_opcodes.h -const - ZEND_NOP = 0; - ZEND_ADD = 1; - ZEND_SUB = 2; - ZEND_MUL = 3; - ZEND_DIV = 4; - ZEND_MOD = 5; - ZEND_SL = 6; - ZEND_SR = 7; - ZEND_CONCAT = 8; - ZEND_BW_OR = 9; - ZEND_BW_AND = 10; - ZEND_BW_XOR = 11; - ZEND_BW_NOT = 12; - ZEND_BOOL_NOT = 13; - ZEND_BOOL_XOR = 14; - ZEND_IS_IDENTICAL = 15; - ZEND_IS_NOT_IDENTICAL = 16; - ZEND_IS_EQUAL = 17; - ZEND_IS_NOT_EQUAL = 18; - ZEND_IS_SMALLER = 19; - ZEND_IS_SMALLER_OR_EQUAL = 20; - ZEND_CAST = 21; - ZEND_QM_ASSIGN = 22; - ZEND_ASSIGN_ADD = 23; - ZEND_ASSIGN_SUB = 24; - ZEND_ASSIGN_MUL = 25; - ZEND_ASSIGN_DIV = 26; - ZEND_ASSIGN_MOD = 27; - ZEND_ASSIGN_SL = 28; - ZEND_ASSIGN_SR = 29; - ZEND_ASSIGN_CONCAT = 30; - ZEND_ASSIGN_BW_OR = 31; - ZEND_ASSIGN_BW_AND = 32; - ZEND_ASSIGN_BW_XOR = 33; - ZEND_PRE_INC = 34; - ZEND_PRE_DEC = 35; - ZEND_POST_INC = 36; - ZEND_POST_DEC = 37; - ZEND_ASSIGN = 38; - ZEND_ASSIGN_REF = 39; - ZEND_ECHO = 40; - ZEND_PRINT = 41; - ZEND_JMP = 42; - ZEND_JMPZ = 43; - ZEND_JMPNZ = 44; - ZEND_JMPZNZ = 45; - ZEND_JMPZ_EX = 46; - ZEND_JMPNZ_EX = 47; - ZEND_CASE = 48; - ZEND_SWITCH_FREE = 49; - ZEND_BRK = 50; - ZEND_CONT = 51; - ZEND_BOOLEAN = 52; //original ZEND_BOOL - ZEND_INIT_STRING = 53; - ZEND_ADD_CHAR = 54; - ZEND_ADD_STRING = 55; - ZEND_ADD_VAR = 56; - ZEND_BEGIN_SILENCE = 57; - ZEND_END_SILENCE = 58; - ZEND_INIT_FCALL_BY_NAME = 59; - ZEND_DO_FCALL = 60; - ZEND_DO_FCALL_BY_NAME = 61; - ZEND_RETURN = 62; - ZEND_RECV = 63; - ZEND_RECV_INIT = 64; - ZEND_SEND_VAL = 65; - ZEND_SEND_VAR = 66; - ZEND_SEND_REF = 67; - ZEND_NEW = 68; - ZEND_JMP_NO_CTOR = 69; - ZEND_FREE = 70; - ZEND_INIT_ARRAY = 71; - ZEND_ADD_ARRAY_ELEMENT = 72; - ZEND_INCLUDE_OR_EVAL = 73; - ZEND_UNSET_VAR = 74; - ZEND_UNSET_DIM_OBJ = 75; - ZEND_ISSET_ISEMPTY = 76; - ZEND_FE_RESET = 77; - ZEND_FE_FETCH = 78; - ZEND_EXIT = 79; - ZEND_FETCH_R = 80; - ZEND_FETCH_DIM_R = 81; - ZEND_FETCH_OBJ_R = 82; - ZEND_FETCH_W = 83; - ZEND_FETCH_DIM_W = 84; - ZEND_FETCH_OBJ_W = 85; - ZEND_FETCH_RW = 86; - ZEND_FETCH_DIM_RW = 87; - ZEND_FETCH_OBJ_RW = 88; - ZEND_FETCH_IS = 89; - ZEND_FETCH_DIM_IS = 90; - ZEND_FETCH_OBJ_IS = 91; - ZEND_FETCH_FUNC_ARG = 92; - ZEND_FETCH_DIM_FUNC_ARG = 93; - ZEND_FETCH_OBJ_FUNC_ARG = 94; - ZEND_FETCH_UNSET = 95; - ZEND_FETCH_DIM_UNSET = 96; - ZEND_FETCH_OBJ_UNSET = 97; - ZEND_FETCH_DIM_TMP_VAR = 98; - ZEND_FETCH_CONSTANT = 99; - ZEND_DECLARE_FUNCTION_OR_CLASS = 100; - ZEND_EXT_STMT = 101; - ZEND_EXT_FCALL_BEGIN = 102; - ZEND_EXT_FCALL_END = 103; - ZEND_EXT_NOP = 104; - ZEND_TICKS = 105; - ZEND_SEND_VAR_NO_REF = 106; -{$IFDEF PHP511} - ZEND_CATCH = 107; - ZEND_THROW = 108; - ZEND_FETCH_CLASS = 109; - ZEND_CLONE = 110; - ZEND_INIT_METHOD_CALL = 112; - ZEND_INIT_STATIC_METHOD_CALL = 113; - ZEND_ISSET_ISEMPTY_VAR = 114; - ZEND_ISSET_ISEMPTY_DIM_OBJ = 115; - ZEND_PRE_INC_OBJ = 132; - ZEND_PRE_DEC_OBJ = 133; - ZEND_POST_INC_OBJ = 134; - ZEND_POST_DEC_OBJ = 135; - ZEND_ASSIGN_OBJ = 136; - ZEND_INSTANCEOF = 138; - ZEND_DECLARE_CLASS = 139; - ZEND_DECLARE_INHERITED_CLASS = 140; - ZEND_DECLARE_FUNCTION = 141; - ZEND_RAISE_ABSTRACT_ERROR = 142; - ZEND_ADD_INTERFACE = 144; - ZEND_VERIFY_ABSTRACT_CLASS = 146; - ZEND_ASSIGN_DIM = 147; - ZEND_ISSET_ISEMPTY_PROP_OBJ = 148; - ZEND_HANDLE_EXCEPTION = 149; - ZEND_USER_OPCODE = 150; -{$ENDIF} - - { end of block } - - { global/local fetches } - -const - ZEND_FETCH_GLOBAL = 0; - ZEND_FETCH_LOCAL = 1; - ZEND_FETCH_STATIC = 2; -{$IFDEF PHP511} - ZEND_FETCH_STATIC_MEMBER = 3; - ZEND_FETCH_GLOBAL_LOCK = 4; - - ZEND_FETCH_CLASS_DEFAULT = 0; - ZEND_FETCH_CLASS_SELF = 1; - ZEND_FETCH_CLASS_PARENT = 2; - ZEND_FETCH_CLASS_MAIN = 3; - ZEND_FETCH_CLASS_GLOBAL = 4; - ZEND_FETCH_CLASS_AUTO = 5; - ZEND_FETCH_CLASS_INTERFACE = 6; - ZEND_FETCH_CLASS_NO_AUTOLOAD = $80; -{$ENDIF} - - { var status for backpatching } - -const - BP_VAR_R = 0; - BP_VAR_W = 1; - BP_VAR_RW = 2; - BP_VAR_IS = 3; - BP_VAR_NA = 4 { if not applicable } - ; - BP_VAR_FUNC_ARG = 5; - BP_VAR_UNSET = 6; - ZEND_INTERNAL_FUNCTION = 1; - ZEND_USER_FUNCTION = 2; - ZEND_OVERLOADED_FUNCTION = 3; - ZEND_EVAL_CODE = 4; - ZEND_INTERNAL_CLASS = 1; - ZEND_USER_CLASS = 2; - ZEND_EVAL = (1 shl 0); - ZEND_INCLUDE = (1 shl 1); - ZEND_INCLUDE_ONCE = (1 shl 2); - ZEND_REQUIRE = (1 shl 3); - ZEND_REQUIRE_ONCE = (1 shl 4); - ZEND_ISSET = (1 shl 0); - ZEND_ISEMPTY = (1 shl 1); - ZEND_CT = (1 shl 0); - ZEND_RT = (1 shl 1); - ZEND_HANDLE_FILENAME = 0; - ZEND_HANDLE_FD = 1; - ZEND_HANDLE_FP = 2; - ZEND_HANDLE_STDIOSTREAM = 3; - ZEND_HANDLE_FSTREAM = 4; - ZEND_FETCH_STANDARD = 0; - ZEND_FETCH_ADD_LOCK = 1; - ZEND_MEMBER_FUNC_CALL = 1 shl 0; - ZEND_CTOR_CALL = 1 shl 1; - ZEND_ARG_SEND_BY_REF = (1 shl 0); - ZEND_ARG_COMPILE_TIME_BOUND = (1 shl 1); - ZEND_RETURN_VAL = 0; - ZEND_RETURN_REF = 1; - - //zend_errors.h -const - E_ERROR = (1 shl 0); - E_WARNING = (1 shl 1); - E_PARSE = (1 shl 2); - E_NOTICE = (1 shl 3); - E_CORE_ERROR = (1 shl 4); - E_CORE_WARNING = (1 shl 5); - E_COMPILE_ERROR = (1 shl 6); - E_COMPILE_WARNING = (1 shl 7); - E_USER_ERROR = (1 shl 8); - E_USER_WARNING = (1 shl 9); - E_USER_NOTICE = (1 shl 10); - E_ALL = (E_ERROR or E_WARNING or E_PARSE or E_NOTICE or E_CORE_ERROR or E_CORE_WARNING or E_COMPILE_ERROR or E_COMPILE_WARNING or E_USER_ERROR or E_USER_WARNING or E_USER_NOTICE); - E_CORE = (E_CORE_ERROR or E_CORE_WARNING); - - //zend.h - //data types -{$IFDEF PHP510} -const - IS_NULL = 0; - IS_LONG = 1; - IS_DOUBLE = 2; - IS_BOOL = 3; - IS_ARRAY = 4; - IS_OBJECT = 5; - IS_STRING= 6; - IS_RESOURCE = 7; - IS_CONSTANT = 8; - IS_CONSTANT_ARRAY = 9; -{$ELSE} -const - IS_NULL = 0; - IS_LONG = 1; - IS_DOUBLE = 2; - IS_STRING = 3; - IS_ARRAY = 4; - IS_OBJECT = 5; - IS_BOOL = 6; - IS_RESOURCE = 7; - IS_CONSTANT = 8; - IS_CONSTANT_ARRAY = 9; -{$ENDIF} - - ZEND_PATHS_SEPARATOR = ';'; - SUCCESS = 0; - FAILURE = -1; { this MUST stay a negative number, or it may affect functions! } - - //zend_modules.h -const -{$IFDEF PHP4} - ZEND_MODULE_API_NO = 20020429; -{$ELSE} - {$IFDEF PHP512} - ZEND_MODULE_API_NO = 20050922; - {$ELSE} - {$IFDEF PHP511} - ZEND_MODULE_API_NO = 20050922; - {$ELSE} - {$IFDEF PHP510} - ZEND_MODULE_API_NO = 20050617; - {$ELSE} - {$IFDEF PHP504} - ZEND_MODULE_API_NO = 20041030; - {$ELSE} - ZEND_MODULE_API_NO = 20040412; - {$ENDIF} - {$ENDIF} - {$ENDIF} -{$ENDIF} -{$ENDIF} - -{$IFDEF ZTS} -const - USING_ZTS = 1; -{$ELSE} -const - USING_ZTS = 0; -{$ENDIF} - -const - NO_VERSION_YET = nil; - MODULE_PERSISTENT = 1; - MODULE_TEMPORARY = 2; - - //zend_alloc.h -const - MEM_BLOCK_START_MAGIC = $7312F8DC; - MEM_BLOCK_END_MAGIC = $2A8FCC84; - MEM_BLOCK_FREED_MAGIC = $99954317; - MEM_BLOCK_CACHED_MAGIC = $FB8277DC; - - -const - MAX_CACHED_MEMORY = 11; - MAX_CACHED_ENTRIES = 256; - PRE_INIT_CACHE_ENTRIES = 32; - - //zend_hash.h -const - HASH_KEY_IS_STRING = 1; - HASH_KEY_IS_LONG = 2; - HASH_KEY_NON_EXISTANT = 3; - HASH_UPDATE = (1 shl 0); - HASH_ADD = (1 shl 1); - HASH_NEXT_INSERT = (1 shl 2); - HASH_DEL_KEY = 0; - HASH_DEL_INDEX = 1; - -const - ZEND_RESOURCE_LIST_TYPE_STD = 1; - ZEND_RESOURCE_LIST_TYPE_EX = 2; - -const - ZEND_HASH_APPLY_KEEP = 0; - ZEND_HASH_APPLY_REMOVE = 1 shl 0; - ZEND_HASH_APPLY_STOP = 1 shl 1; - - //zend_constants.h -const - CONST_CS = (1 shl 0) { Case Sensitive } - ; - CONST_PERSISTENT = (1 shl 1) { Persistent } - ; - - // Debug support -const - TSRM_ERROR_LEVEL_ERROR = 1; - TSRM_ERROR_LEVEL_CORE = 2; - TSRM_ERROR_LEVEL_INFO = 3; - -const - ZVAL_CACHE_LIST = 0; - - -const - STACK_BLOCK_SIZE = 64; - - -const - ZEND_STACK_APPLY_TOPDOWN = 1; - ZEND_STACK_APPLY_BOTTOMUP = 2; - - - //zend_highlight.h -const - HL_COMMENT_COLOR = '#FF8000' { orange } - ; - HL_DEFAULT_COLOR = '#0000BB' { blue } - ; - HL_HTML_COLOR = '#000000' { black } - ; - HL_STRING_COLOR = '#DD0000' { red } - ; - HL_BG_COLOR = '#FFFFFF' { white } - ; - HL_KEYWORD_COLOR = '#007700' { green } - ; - -const - ZEND_INI_USER = (1 shl 0); - ZEND_INI_PERDIR = (1 shl 1); - ZEND_INI_SYSTEM = (1 shl 2); - ZEND_INI_ALL = (ZEND_INI_USER or ZEND_INI_PERDIR or ZEND_INI_SYSTEM); - - ZEND_INI_DISPLAY_ORIG = 1; - ZEND_INI_DISPLAY_ACTIVE = 2; - ZEND_INI_STAGE_STARTUP = (1 shl 0); - ZEND_INI_STAGE_SHUTDOWN = (1 shl 1); - ZEND_INI_STAGE_ACTIVATE = (1 shl 2); - ZEND_INI_STAGE_DEACTIVATE = (1 shl 3); - ZEND_INI_STAGE_RUNTIME = (1 shl 4); - -type - zend_uint = uint; - zend_bool = boolean; - zend_uchar = char; - zend_ulong = ulong; - zend_ushort = word; - unsigned_char = byte; - - -type - size_t = cardinal; - ppointer = ^pointer; - pppointer = ^ppointer; - - PStat = ^TStat; - TStat = record - st_dev: Word; - st_ino: Word; - st_mode: Word; - st_nlink: SmallInt; - st_uid: SmallInt; - st_gid: SmallInt; - st_rdev: Word; - st_size: Longint; - st_atime: Longint; - st_mtime: Longint; - st_ctime: Longint; - end; - Stat = TStat; - - Pzend_mem_header = ^Tzend_mem_header; - _zend_mem_header = record - pNext: Pzend_mem_header; - pLast: Pzend_mem_header; - size_cached: integer; - end; - Tzend_mem_header = _zend_mem_header; - - -type - - hash_func_t = function(arKey: PChar; nKeyLength: uint): ulong; - - compare_func_t = function(_noname1: Pointer; _noname2: Pointer; - TSRMLS_DC: Pointer): integer; - - dtor_func_t = procedure(pDest: Pointer); - - copy_ctor_func_t = procedure(pElement: Pointer); - - PBucket = ^TBucket; - TBucket = record - h: ulong; - nKeyLength: uint; - pData: Pointer; - pDataPtr: Pointer; - pListNext: PBucket; - pListLast: PBucket; - pNext: PBucket; - pLast: PBucket; - arKey: array[0..0] of char; - end; - - PHashTable = ^THashTable; - THashTable = - record - nTableSize: uint; - nTableMask: uint; - nNumOfElements: uint; - nNextFreeElement: ulong; - pInternalPointer: PBucket; - pListHead: PBucket; - pListTail: PBucket; - arBuckets: ^PBucket; - pDestructor: pointer; - persistent: boolean; - nApplyCount: Byte; - bApplyProtection: boolean; - end; - - HashPosition = PBucket; - - - {$IFDEF PHP5} - - zend_op_array = - record - _type : zend_uchar; - function_name : PChar; - scope : pointer; - fn_flags : zend_uint; - prototype : pointer; - num_args : zend_uint; - required_num_args : zend_uint; - arg_info : pointer; - pass_rest_by_reference : zend_bool; - return_reference : Byte; - refcount : pointer; - opcodes : pointer; - last :zend_uint ; - size : zend_uint; - T : zend_uint; - brk_cont_array : pointer; - last_brk_cont : zend_uint; - current_brk_cont : zend_uint; - try_catch_array : pointer; - last_try_catch : Integer; - static_variables : PHashTable; - start_op : pointer; - backpatch_count : Integer; - done_pass_two : zend_bool; - uses_this : zend_bool; - filename : PChar; - line_start : zend_uint; - line_end : zend_uint; - doc_comment : PChar; - doc_comment_len : zend_uint; - reserved : array[0..ZEND_MAX_RESERVED_RESOURCES - 1] of Pointer; - end; - - _zend_internal_function = - record - _type : byte; - function_name : PChar; - scope : pointer; - fn_flags : zend_uint; - prototype : pointer; - num_args : zend_uint; - required_num_args : zend_uint; - arg_info : pointer; - pass_rest_by_reference : zend_bool; - return_reference : Byte; - handler : pointer; - end; - TZendInternalFunction = _zend_internal_function; - PZendInternalFunction = ^TZendInternalFunction; - - zend_function = - record - case Integer of - 1 : - ( - _type : zend_uchar; - ); - 2 : - ( - common : - record - _type : zend_uchar; - function_name : PChar; - scope : pointer; - fn_flags : zend_uint; - prototype : pointer; - num_args : zend_uint; - required_num_args : zend_uint; - arg_info : pointer; - pass_rest_by_reference : zend_bool; - return_reference : Byte; - end; - ); - 3 : - ( - op_array : zend_op_array; - ); - 4 : - ( - internal_function : _zend_internal_function; - ); - end; - TZendFunction = zend_function; - PZendFunction = ^TZendFunction; - - PZendObjectIteratorFuncs = ^zend_object_iterator_funcs; - zend_object_iterator_funcs = record - dtor : pointer; - valid : pointer; - get_currect_data : pointer; - get_current_key : pointer; - move_forward : pointer; - rewind : pointer; - end; - - zend_object_iterator = record - data : pointer; - funcs : PZendObjectIteratorFuncs; - index : ulong; - end; - - zend_class_iterator_funcs = record - funcs : pointer; - new_iterator : pointer; - zf_new_iterator : pointer; - zf_valid : pointer; - zf_current : pointer; - zf_key : pointer; - zf_next : pointer; - zf_rewind : pointer; - end; - {$ELSE} - - type zend_op_array = record - _type : zend_uchar; - arg_types : PByte; - function_name : PChar; - refcount : pointer; - opcodes : pointer; - last : zend_uint; - size : zend_uint; - T : zend_uint; - brk_cont_array : pointer; - last_brk_cont : zend_uint; - current_brk_cont : zend_uint; - uses_globals : zend_bool; - static_variables : PHashTable; - start_op : pointer; - backpatch_count : integer; - - return_reference : boolean; - done_pass_two : boolean; - - filename : PChar; - reserved : array[0..ZEND_MAX_RESERVED_RESOURCES - 1] of Pointer; - end; - - -type - _zend_internal_function = record - _type : byte; - arg_types : PByte; - function_name : pchar; - handler : pointer; - end; - PZendInternalFunction = ^_zend_internal_function; - - _zend_overloaded_function = record - _type : byte; - arg_types : PByte; - function_name : PChar; - _var : zend_uint; - end; - - zend_function = record - case Integer of - 1 : ( _type : zend_uchar; ); - 2 : ( - common : - record - _type : zend_uchar; - arg_types : PByte; - function_name : PChar; - end; - ); - 3 : - ( - op_array : zend_op_array; - ); - 4 : - ( - internal_function : _zend_internal_function; - ); - 5 : - ( - overloaded_function : _zend_overloaded_function; - ); - end; - - {$ENDIF} - - Pzend_class_entry = ^Tzend_class_entry; - {$IFDEF PHP4} - Tzend_class_entry = - record - _type: Char; - name: PChar; - name_length: uint; - parent: pointer; - refcount: pointer; - constants_updated: boolean; - function_table: THashTable; - default_properties: THashTable; - builtin_functions: pointer; - handle_function_call: pointer; - handle_property_get: pointer; - handle_property_set: pointer; - end; - {$ELSE} - Tzend_class_entry = record - _type : char; - name : pchar; - name_length : uint; - parent : PZend_class_entry; - refcount : integer; - constants_updated : zend_bool; - ce_flags : zend_uint; - function_table : THashTable; - default_properties : THashTable; - properties_info : THashTable; - {$IFDEF PHP511} - default_static_members : THashTable; - {$ENDIF} - static_members : PHashTable; - constants_table : THashTable; - builtin_functions : pointer; - _constructor : PZendFunction; - _destructor : PZendFunction; - clone : PZendFunction; - __get : PZendFunction; - __set : PZendFunction; - {$IFDEF PHP510} - __unset : PZendFunction; - __isset : PZendFunction; - {$ENDIF} - __call: PZendFunction; - {$IFDEF PHP510} - serialize_func : PZendFunction; - unserialize_func : PZendFunction; - {$ENDIF} - iterator_funcs : zend_class_iterator_funcs; - - create_object : pointer; - get_iterator : pointer; - interface_gets_implemented : pointer; - - {$IFDEF PHP511} - serialize : pointer; - unserialize : pointer; - {$ENDIF} - - interfaces : pointer; - num_interfaces : zend_uint; - - filename : PChar; - line_start : zend_uint; - line_end : zend_uint; - doc_comment : PChar; - doc_comment_len : zend_uint; - {$IFDEF PHP511} - module : pointer; - {$ENDIF} - end; - {$ENDIF} - - Pzend_Object = ^Tzend_object; - PPzend_Object = ^PZend_Object; - _zend_object = record - ce: Pzend_class_entry; - properties: PHashTable; - {$IFDEF PHP5} - in_get_set : cardinal; - {$ENDIF} - end; - Tzend_Object = _zend_object; - - {$IFDEF PHP5} - - - type - - Tzend_object_get_properties = function (_object : pointer; TSRMLS_DC : pointer) : PHashtable; cdecl; - Pzend_object_get_propeeries = ^Tzend_object_get_properties; - - Tzend_object_get_classname = function(_object : pointer; class_name : pointer; class_name_len : pointer; p : integer; TSRMLS_DC : pointer) : integer; cdecl; - - zend_object_handlers = record - // general object functions - add_ref : pointer; - del_ref : pointer; - clone_obj : pointer; - // individual object functions - read_property : pointer; - write_property : pointer; - read_dimension : pointer; - write_dimension : pointer; - get_property_ptr_ptr : pointer; - _get : pointer; - _set : pointer; - has_property : pointer; - unset_property : pointer; - has_dimension : pointer; - unset_dimension : pointer; - get_properties : Tzend_object_get_properties; - get_method : pointer; - call_method : pointer; - get_constructor : pointer; - get_class_entry : pointer; - get_class_name : Tzend_object_get_classname; - compare_objects : pointer; - cast_object : pointer; - count_elements : pointer; - end; - pzend_object_handlers = ^zend_object_handlers; - - zend_object_handle = cardinal; - _zend_object_value = record - handle : zend_object_handle; - handlers : pzend_object_handlers; - end; - TZendObjectValue = _zend_object_value; - PZendObjectValue = ^TZendObjectValue; - {$ENDIF} - - Pzvalue_value = ^zvalue_value; - zvalue_value = record - case longint of - 0: (lval: longint); - 1: (dval: double); - 2: (str: record - val: PChar; - len: longint; - end); - 3: (ht: PHashTable); - {$IFDEF PHP4} - 4: (obj: Tzend_Object); - {$ELSE} - 4 : (obj : _zend_object_value); - {$ENDIF} - end; - - pppzval = ^ppzval; - ppzval = ^pzval; - - - {$IFDEF PHP4} - Pzval = ^zval; - zval = record - value: zvalue_value; - _type: Byte; - is_ref: Byte; - refcount: Smallint; - end; - Tzval = zval; - {$ELSE} - pzval = ^zval; - zval = record - value : zvalue_value; - refcount : zend_uint; - _type : byte; - is_ref : byte; - end; - {$ENDIF} - - ppzval_array = ^pzval_array; - pzval_array = array of ppzval; - - -type - PZend_rsrc_list_entry = ^zend_rsrc_list_entry; - zend_rsrc_list_entry = record - ptr : pointer; - _type : integer; - refcount : integer; - end; - TZend_rsrc_list_entry = Zend_rsrc_list_entry; - -type - PZendHashKey = ^TZendHashKey; - zend_hash_key = record - arKey: PChar; - nKeyLength: uint; - h: ulong; - end; - TZendHashKey = zend_hash_key; - - zend_hash_graceful_reverse_destroy_t = procedure(ht: PHashTable); cdecl; - -type - PZendConstant = ^TZendConstant; - zend_constant = record - value: zval; - flags: Integer; - name: PChar; - name_len: uint; - module_number: Integer; - end; - TZendConstant = zend_constant; - -{$IFDEF PHP5} -type - zend_stream_reader_t = function(handle : pointer; buf : pChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; - zend_strem_closer_t = procedure(handle : pointer; TSRMLS_DC : pointer); cdecl; - - _zend_stream = record - handle : pointer; - reader : pointer; - closer : pointer; - {$IFDEF PHP510} - fteller : pointer; - {$ENDIF} - interactive : pointer; - end; - TZendStream = _zend_stream; - PZendStream = ^TZendStream; -{$ENDIF} - -type - PZendFileHandle = ^TZendFileHandle; - zend_file_handle = - record - _type: uchar; - filename: PChar; - opened_path: PChar; - handle: - record - case Integer of - 1: - ( - fd: Integer; - ); - 2: - ( - fp: pointer; - ); - {$IFDEF PHP5} - 3 : - ( - stream : TZendStream; - ); - {$ENDIF} - end; - free_filename: shortint; - end; - TZendFileHandle = zend_file_handle; - - //TSRM.h - - -type - ts_rsrc_id = integer; - pts_rsrc_id = ^ts_rsrc_id; - - - //zend_stack.h -type - pzend_stack = ^Tzend_stack; - zend_stack = - record - top: Integer; - max: Integer; - elements: PPointer; - end; - Tzend_stack = zend_stack; - - -type - Pzend_syntax_highlighter_ini = ^Tzend_syntax_highlighter_ini; - zend_syntax_highlighter_ini = - record - highlight_html: PChar; - highlight_comment: PChar; - highlight_default: PChar; - highlight_string: PChar; - highlight_keyword: PChar; - end; - Tzend_syntax_highlighter_ini = zend_syntax_highlighter_ini; - - -type - zend_write_t = function(str: PChar; str_length: integer): integer; cdecl; - - -type - - {$IFDEF PHP5} - _zend_arg_info = record - name : PChar; - name_len : zend_uint; - class_name : PChar; - class_name_len : zend_uint; - {$IFDEF PHP510} - array_type_hint : zend_bool; - {$ENDIF} - allow_null : zend_bool; - pass_by_reference : zend_bool; - return_reference : zend_bool; - required_num_args : integer; - end; - - TZendArgInfo = _zend_arg_info; - PZendArgInfo = ^TZendArgInfo; - {$ENDIF} - - Pzend_function_entry = ^Tzend_function_entry; - zend_function_entry = record - fname: Pchar; - handler: pointer; - {$IFDEF PHP4} - func_arg_types: Pbyte; - {$ELSE} - arg_info : PZendArgInfo; - num_args : zend_uint; - flags : zend_uint; - {$ENDIF} - end; - Tzend_function_entry = zend_function_entry; - TZendFunctionEntry = zend_function_entry; - - Pzend_module_entry = ^Tzend_module_entry; - Tzend_module_entry = record - size: word; - zend_api: dword; - zend_debug: byte; - zts: byte; - {$IFDEF PHP5} - ini_entry : pointer; - {$IFDEF PHP510} - deps : pointer; - {$ENDIF} - {$ENDIF} - name: pchar; - functions: pointer; - module_startup_func: pointer; - module_shutdown_func: pointer; - request_startup_func: pointer; - request_shutdown_func: pointer; - info_func: pointer; - version: pchar; - {$IFDEF PHP5} - post_deactivate_func : pointer; - {$ELSE} - global_startup_func: pointer; - global_shutdown_func: pointer; - {$ENDIF} - global_id: integer; - module_started: integer; - _type: byte; - handle: pointer; - module_number: longint; - end; - - -type - pzend_list_element = ^zend_list_element; - zend_list_element = record - prev: pzend_list_element; - next: pzend_list_element; - data: char; - end; - - pzend_llist = ^zend_llist; - zend_llist = record - head: pzend_list_element; - tail: pzend_list_element; - size: size_t; - count: size_t; - dtor: pointer; - persistent: byte; - traverse_ptr: pzend_list_element; - end; - - pzend_overloaded_element = ^Zend_overloaded_element; - zend_overloaded_element = record - _type : integer; - element : zval; - end; - - -type - _zend_property_reference = record - _type: integer; - _object: pzval; - elements_list: pzend_llist; - end; - - Tzend_property_reference = _zend_property_reference; - Pzend_property_reference = ^Tzend_property_reference; - - -type - //Zend internal function - TInternalFunction = procedure(ht: integer; return_value: pzval; this_ptr: pzval; - return_value_used: integer; TSRMLS_DC: pointer); cdecl; - - PInitFunction = ^TInitFunction; - TInitFunction = function(_type: integer; module_number: integer; TSRMLS_DC: pointer): integer; cdecl; - - PShutdownFunction = ^TShutdownFunction; - TShutdownFunction = function(_type: integer; module_number: integer; TSRMLS_DC: pointer): integer; cdecl; - - PZendModuleInfoFunction = ^TZendModuleInfoFunction; - TZendModuleInfoFunction = procedure(zend_module: Pzend_module_entry; TSRMLS_DC: pointer); cdecl; - - //global startup and shutdown function - TZendGlobalFunction = procedure(); cdecl; - - TZendModuleType = (mtPersistent, mtTemporary); - -type - - _znode = record - op_type : Integer; - u : - record - case Integer of - 1 : - ( - constant : zval; - ); - 2 : - ( - _var : zend_uint; - ); - 3 : - ( - opline_num : zend_uint; - { Needs to be signed } - ); - 4 : - ( - op_array : ^zend_op_array; - ); - 5 : - ( - jmp_addr : pointer; - ); - 6 : - ( - EA : - record - _var : zend_uint; - { dummy } - _type : zend_uint; - end; - ); - end; - end; - - _zend_declarables = record - ticks : zval; - end; - zend_declarables = _zend_declarables; - - Pzend_compiler_globals = ^zend_compiler_globals; - zend_compiler_globals = record - bp_stack : zend_stack; - switch_cond_stack : zend_stack; - foreach_copy_stack : zend_stack; - object_stack : zend_stack; - declare_stack : zend_stack; - - {$IFNDEF PHP510} - class_entry : Tzend_class_entry; - {$ENDIF} - active_class_entry : PZend_class_entry; - - {$IFNDEF PHP510} - active_ce_parent_class_name : zval; - {$ENDIF} - - //variables for list() compilation - list_llist : zend_llist; - dimension_llist : zend_llist; - list_stack : zend_stack; - - function_call_stack : zend_stack; - - compiled_filename : PChar; - - zend_lineno : integer; - comment_start_line : integer; - heredoc : PChar; - heredoc_len : integer; - - active_op_array : pointer; - - function_table : PHashTable; // function symbol table - class_table : PHashTable; // class table - - filenames_table : THashTable; - - auto_globals : PHashTable; - - in_compilation : zend_bool; - short_tags : zend_bool; - asp_tags : zend_bool; - allow_call_time_pass_reference : zend_bool; - - declarables : zend_declarables; - - // For extensions support - extended_info : zend_bool; // generate extension information for debugger/profiler - handle_op_arrays : zend_bool; // run op_arrays through op_array handlers - - unclean_shutdown : zend_bool; - - ini_parser_unbuffered_errors : zend_bool; - - open_files : zend_llist; - - {$IFDEF PHP510} - catch_begin : longint; - {$ENDIF} - - ini_parser_param : pointer; - - interactive : integer; - - {$IFDEF PHP5} - start_lineno : zend_uint; - {$ENDIF} - - increment_lineno : zend_bool; - - {$IFDEF PHP510} - implementing_class : _znode; - access_type : zend_uint; - doc_comment : pchar; - doc_comment_len : integer; - {$ENDIF} - end; - Tzend_compiler_globals = zend_compiler_globals; - - - zend_ptr_stack = record - top, max : integer; - elements : pointer; - top_element : pointer; - end; - - jump_buf = array[0..63] of byte; - -{$IFDEF PHP5} -type _zend_objects_store = record - object_buckets : pointer; - top : zend_uint; - size : zend_uint; - free_list_head : integer; - end; - -type _zend_property_info = record - flags : zend_uint; - name : PChar; - name_length : integer; - h : ulong; - {$IFDEF PHP510} - doc_comment : PChar; - doc_comment_len : integer; - {$ENDIF} - end; - -{$ENDIF} - -type - - Pzend_executor_globals = ^zend_executor_globals; - zend_executor_globals = record - return_value_ptr_ptr : ppzval; - - uninitialized_zval : zval; - uninitialized_zval_ptr : pzval; - - error_zval : zval; - error_zval_ptr : pzval; - - function_state_ptr : pointer; - arg_types_stack : zend_ptr_stack; - - // symbol table cache - symtable_cache : array[0..31] of PHashTable; - symtable_cache_limit : ^PHashTable; - symtable_cache_ptr : ^PHashTable; - - opline_ptr : pointer; - - {$IFDEF PHP4} - current_execute_data : pointer; - {$ENDIF} - - active_symbol_table : PHashTable; - symbol_table : THashTable; // main symbol table - - included_files : THashTable; // files already included */ - - bailout : jump_buf; - - error_reporting : integer; - orig_error_reporting : integer; - exit_status : integer; - - active_op_array : pointer; - - function_table : PHashTable; // function symbol table */ - class_table : PHashTable; // class table - zend_constants : PHashTable; // constants table */ - - {$IFDEF PHP5} - scope : pointer; - _this : pzval; - {$ENDIF} - - precision : longint; - - ticks_count : integer; - - in_execution : zend_bool; - {$IFDEF PHP5} - in_autoload : PHashTable; - {$IFDEF PHP510} - autoload_func : pointer; - {$ENDIF} - {$ENDIF} - - bailout_set : zend_bool; - full_tables_cleanup : zend_bool; - {$IFDEF PHP5} - ze1_compatibility_mode : zend_bool; - {$ENDIF} - - // for extended information support */ - no_extensions : zend_bool; - - timed_out : zend_bool; - - regular_list : THashTable; - persistent_list : ThashTable; - - argument_stack : zend_ptr_stack; - - {$IFNDEF PHP510} - free_op1, free_op2 : pzval; - unary_op : pointer; - binary_op : pointer; - - garbage : array[0..1] of pzval; - garbage_ptr : integer; - {$ENDIF} - - {$IFDEF PHP5} - user_error_handler_error_reporting : integer; - {$ENDIF} - user_error_handler : pzval; - {$IFDEF PHP5} - user_exception_handler : pzval; - user_error_handlers_error_reporting : zend_stack; - {$ENDIF} - - user_error_handlers : zend_ptr_stack; - {$IFDEF PHP5} - user_exception_handlers : zend_ptr_stack; - {$ENDIF} - - //* timeout support */ - timeout_seconds : integer; - lambda_count : integer; - ini_directives : PHashTable; - {$IFDEF PHP5} - - objects_store : _zend_objects_store; - exception : pzval; - opline_before_exception : pointer; - current_execute_data : pointer; - {$IFDEF PHP5} - current_module : pointer; - {$ENDIF} - - std_property_info : _zend_property_info; - {$ENDIF} - //* locale stuff */ - - {$IFNDEF PHP510} - float_separator : char; - {$ENDIF} - - reserved: array[0..3] of pointer; - end; - - -{$IFDEF PHP5} - type - TZendObjectReadProperty = function (_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; - TZendObjectReadDimension = function (_object : pzval; offset : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; - TZendObjectWriteProperty = procedure(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; - TZendObjectWriteDimension = procedure(_object : pzval; offset : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; - -{$ENDIF} - -implementation - -end. +{*******************************************************} +{ PHP4Delphi } +{ ZEND - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I 'PHP.inc'} + +{ $Id: ZendTypes.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit ZENDTypes; + +interface + +uses + Windows, SysUtils; + +const + //zend.h + ZEND_MAX_RESERVED_RESOURCES = 4; + +{$IFDEF PHP530} +{$IFDEF ZTS} +const ZEND_BUILD_TS = ',TS'; +{$ELSE} +const ZEND_BUILD_TS = ',NTS'; +{$ENDIF} + +{$IFDEF ZEND_DEBUG} +const ZEND_BUILD_DEBUG = ',debug'; +{$ELSE} +const ZEND_BUILD_DEBUG = ''; +{$ENDIF} + +{$IFDEF PHP_COMPILER_ID} +{$IFDEF COMPILER_VC9} +const ZEND_BUILD_SYSTEM = +{$IFDEF COMPILER_VC14} +',VC14' +{$ELSE} + {$IFDEF COMPILER_VC13} + ',VC13' + {$ELSE} + {$IFDEF COMPILER_VC12} + ',VC12' + {$ELSE} + {$IFDEF COMPILER_VC11} + ',VC11' + {$ELSE} + {$IFDEF COMPILER_VC11} + ',VC10' + {$ELSE} + ',VC9' + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF}; +{$ELSE} +{$IFDEF COMPILER_VC6} +const ZEND_BUILD_SYSTEM = ',VC6'; +{$ELSE} +const ZEND_BUILD_SYSTEM = ', $DEFINE COMPILER_VCx directive error. See PHP.INC for more details'; +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{$ENDIF} + + + + //zend_vm_opcodes.h +const + ZEND_NOP = 0; + ZEND_ADD = 1; + ZEND_SUB = 2; + ZEND_MUL = 3; + ZEND_DIV = 4; + ZEND_MOD = 5; + ZEND_SL = 6; + ZEND_SR = 7; + ZEND_CONCAT = 8; + ZEND_BW_OR = 9; + ZEND_BW_AND = 10; + ZEND_BW_XOR = 11; + ZEND_BW_NOT = 12; + ZEND_BOOL_NOT = 13; + ZEND_BOOL_XOR = 14; + ZEND_IS_IDENTICAL = 15; + ZEND_IS_NOT_IDENTICAL = 16; + ZEND_IS_EQUAL = 17; + ZEND_IS_NOT_EQUAL = 18; + ZEND_IS_SMALLER = 19; + ZEND_IS_SMALLER_OR_EQUAL = 20; + ZEND_CAST = 21; + ZEND_QM_ASSIGN = 22; + ZEND_ASSIGN_ADD = 23; + ZEND_ASSIGN_SUB = 24; + ZEND_ASSIGN_MUL = 25; + ZEND_ASSIGN_DIV = 26; + ZEND_ASSIGN_MOD = 27; + ZEND_ASSIGN_SL = 28; + ZEND_ASSIGN_SR = 29; + ZEND_ASSIGN_CONCAT = 30; + ZEND_ASSIGN_BW_OR = 31; + ZEND_ASSIGN_BW_AND = 32; + ZEND_ASSIGN_BW_XOR = 33; + ZEND_PRE_INC = 34; + ZEND_PRE_DEC = 35; + ZEND_POST_INC = 36; + ZEND_POST_DEC = 37; + ZEND_ASSIGN = 38; + ZEND_ASSIGN_REF = 39; + ZEND_ECHO = 40; + ZEND_PRINT = 41; + ZEND_JMP = 42; + ZEND_JMPZ = 43; + ZEND_JMPNZ = 44; + ZEND_JMPZNZ = 45; + ZEND_JMPZ_EX = 46; + ZEND_JMPNZ_EX = 47; + ZEND_CASE = 48; + ZEND_SWITCH_FREE = 49; + ZEND_BRK = 50; + ZEND_CONT = 51; + ZEND_BOOLEAN = 52; //original ZEND_BOOL + ZEND_INIT_STRING = 53; + ZEND_ADD_CHAR = 54; + ZEND_ADD_STRING = 55; + ZEND_ADD_VAR = 56; + ZEND_BEGIN_SILENCE = 57; + ZEND_END_SILENCE = 58; + ZEND_INIT_FCALL_BY_NAME = 59; + ZEND_DO_FCALL = 60; + ZEND_DO_FCALL_BY_NAME = 61; + ZEND_RETURN = 62; + ZEND_RECV = 63; + ZEND_RECV_INIT = 64; + ZEND_SEND_VAL = 65; + ZEND_SEND_VAR = 66; + ZEND_SEND_REF = 67; + ZEND_NEW = 68; + ZEND_JMP_NO_CTOR = 69; + ZEND_FREE = 70; + ZEND_INIT_ARRAY = 71; + ZEND_ADD_ARRAY_ELEMENT = 72; + ZEND_INCLUDE_OR_EVAL = 73; + ZEND_UNSET_VAR = 74; + ZEND_UNSET_DIM_OBJ = 75; + ZEND_ISSET_ISEMPTY = 76; + ZEND_FE_RESET = 77; + ZEND_FE_FETCH = 78; + ZEND_EXIT = 79; + ZEND_FETCH_R = 80; + ZEND_FETCH_DIM_R = 81; + ZEND_FETCH_OBJ_R = 82; + ZEND_FETCH_W = 83; + ZEND_FETCH_DIM_W = 84; + ZEND_FETCH_OBJ_W = 85; + ZEND_FETCH_RW = 86; + ZEND_FETCH_DIM_RW = 87; + ZEND_FETCH_OBJ_RW = 88; + ZEND_FETCH_IS = 89; + ZEND_FETCH_DIM_IS = 90; + ZEND_FETCH_OBJ_IS = 91; + ZEND_FETCH_FUNC_ARG = 92; + ZEND_FETCH_DIM_FUNC_ARG = 93; + ZEND_FETCH_OBJ_FUNC_ARG = 94; + ZEND_FETCH_UNSET = 95; + ZEND_FETCH_DIM_UNSET = 96; + ZEND_FETCH_OBJ_UNSET = 97; + ZEND_FETCH_DIM_TMP_VAR = 98; + ZEND_FETCH_CONSTANT = 99; + ZEND_DECLARE_FUNCTION_OR_CLASS = 100; + ZEND_EXT_STMT = 101; + ZEND_EXT_FCALL_BEGIN = 102; + ZEND_EXT_FCALL_END = 103; + ZEND_EXT_NOP = 104; + ZEND_TICKS = 105; + ZEND_SEND_VAR_NO_REF = 106; +{$IFDEF PHP511} + ZEND_CATCH = 107; + ZEND_THROW = 108; + ZEND_FETCH_CLASS = 109; + ZEND_CLONE = 110; + ZEND_INIT_METHOD_CALL = 112; + ZEND_INIT_STATIC_METHOD_CALL = 113; + ZEND_ISSET_ISEMPTY_VAR = 114; + ZEND_ISSET_ISEMPTY_DIM_OBJ = 115; + ZEND_PRE_INC_OBJ = 132; + ZEND_PRE_DEC_OBJ = 133; + ZEND_POST_INC_OBJ = 134; + ZEND_POST_DEC_OBJ = 135; + ZEND_ASSIGN_OBJ = 136; + ZEND_INSTANCEOF = 138; + ZEND_DECLARE_CLASS = 139; + ZEND_DECLARE_INHERITED_CLASS = 140; + ZEND_DECLARE_FUNCTION = 141; + ZEND_RAISE_ABSTRACT_ERROR = 142; + ZEND_ADD_INTERFACE = 144; + ZEND_VERIFY_ABSTRACT_CLASS = 146; + ZEND_ASSIGN_DIM = 147; + ZEND_ISSET_ISEMPTY_PROP_OBJ = 148; + ZEND_HANDLE_EXCEPTION = 149; + ZEND_USER_OPCODE = 150; +{$ENDIF} + + { end of block } + + { global/local fetches } + +const + ZEND_FETCH_GLOBAL = 0; + ZEND_FETCH_LOCAL = 1; + ZEND_FETCH_STATIC = 2; +{$IFDEF PHP511} + ZEND_FETCH_STATIC_MEMBER = 3; + ZEND_FETCH_GLOBAL_LOCK = 4; + + ZEND_FETCH_CLASS_DEFAULT = 0; + ZEND_FETCH_CLASS_SELF = 1; + ZEND_FETCH_CLASS_PARENT = 2; + ZEND_FETCH_CLASS_MAIN = 3; + ZEND_FETCH_CLASS_GLOBAL = 4; + ZEND_FETCH_CLASS_AUTO = 5; + ZEND_FETCH_CLASS_INTERFACE = 6; + ZEND_FETCH_CLASS_NO_AUTOLOAD = $80; +{$ENDIF} + + { var status for backpatching } + +const + BP_VAR_R = 0; + BP_VAR_W = 1; + BP_VAR_RW = 2; + BP_VAR_IS = 3; + BP_VAR_NA = 4 { if not applicable } + ; + BP_VAR_FUNC_ARG = 5; + BP_VAR_UNSET = 6; + ZEND_INTERNAL_FUNCTION = 1; + ZEND_USER_FUNCTION = 2; + ZEND_OVERLOADED_FUNCTION = 3; + ZEND_EVAL_CODE = 4; + ZEND_INTERNAL_CLASS = 1; + ZEND_USER_CLASS = 2; + ZEND_EVAL = (1 shl 0); + ZEND_INCLUDE = (1 shl 1); + ZEND_INCLUDE_ONCE = (1 shl 2); + ZEND_REQUIRE = (1 shl 3); + ZEND_REQUIRE_ONCE = (1 shl 4); + ZEND_ISSET = (1 shl 0); + ZEND_ISEMPTY = (1 shl 1); + ZEND_CT = (1 shl 0); + ZEND_RT = (1 shl 1); + +{$IFDEF PHP530} +type +zend_stream_type = ( + ZEND_HANDLE_FILENAME, + ZEND_HANDLE_FD, + ZEND_HANDLE_FP, + ZEND_HANDLE_STREAM, + ZEND_HANDLE_MAPPED); +{$ELSE} +const + ZEND_HANDLE_FILENAME = 0; + ZEND_HANDLE_FD = 1; + ZEND_HANDLE_FP = 2; + ZEND_HANDLE_STDIOSTREAM = 3; + ZEND_HANDLE_FSTREAM = 4; + + {$IFDEF PHP5} + ZEND_HANDLE_STREAM = 5; + {$ENDIF} +{$ENDIF} + +const + ZEND_FETCH_STANDARD = 0; + ZEND_FETCH_ADD_LOCK = 1; + ZEND_MEMBER_FUNC_CALL = 1 shl 0; + ZEND_CTOR_CALL = 1 shl 1; + ZEND_ARG_SEND_BY_REF = (1 shl 0); + ZEND_ARG_COMPILE_TIME_BOUND = (1 shl 1); + ZEND_RETURN_VAL = 0; + ZEND_RETURN_REF = 1; + + //zend_errors.h +const + E_ERROR = (1 shl 0); + E_WARNING = (1 shl 1); + E_PARSE = (1 shl 2); + E_NOTICE = (1 shl 3); + E_CORE_ERROR = (1 shl 4); + E_CORE_WARNING = (1 shl 5); + E_COMPILE_ERROR = (1 shl 6); + E_COMPILE_WARNING = (1 shl 7); + E_USER_ERROR = (1 shl 8); + E_USER_WARNING = (1 shl 9); + E_USER_NOTICE = (1 shl 10); + E_STRICT = (1 shl 11); + E_RECOVERABLE_ERROR = (1 shl 12); + E_ALL = (E_ERROR or E_WARNING or E_PARSE or E_NOTICE or E_CORE_ERROR or E_CORE_WARNING or E_COMPILE_ERROR or E_COMPILE_WARNING or E_USER_ERROR or E_USER_WARNING or E_USER_NOTICE or E_RECOVERABLE_ERROR); + E_CORE = (E_CORE_ERROR or E_CORE_WARNING); + + //zend.h + //data types +{$IFDEF PHP510} +const + IS_NULL = 0; + IS_LONG = 1; + IS_DOUBLE = 2; + IS_BOOL = 3; + IS_ARRAY = 4; + IS_OBJECT = 5; + IS_STRING= 6; + IS_RESOURCE = 7; + IS_CONSTANT = 8; + IS_CONSTANT_ARRAY = 9; +{$ELSE} +const + IS_NULL = 0; + IS_LONG = 1; + IS_DOUBLE = 2; + IS_STRING = 3; + IS_ARRAY = 4; + IS_OBJECT = 5; + IS_BOOL = 6; + IS_RESOURCE = 7; + IS_CONSTANT = 8; + IS_CONSTANT_ARRAY = 9; +{$ENDIF} + + ZEND_PATHS_SEPARATOR = ';'; + SUCCESS = 0; + FAILURE = -1; { this MUST stay a negative number, or it may affect functions! } + + //zend_modules.h +const +{$IFDEF PHP700} + ZEND_MODULE_API_NO = 20151012; +{$ELSE} + {$IFDEF PHP530} + ZEND_MODULE_API_NO = + {$IFDEF PHP560} + 20131226 + {$ELSE} + {$IFDEF PHP550}20121212{$ELSE}{$IFDEF PHP540}20100525{$ELSE}20090626{$ENDIF}{$ENDIF} + {$ENDIF}; + {$ELSE} + {$IFDEF PHP520} + ZEND_MODULE_API_NO = 20060613; + {$ELSE} + {$IFDEF PHP512} + ZEND_MODULE_API_NO = 20050922; + {$ELSE} + {$IFDEF PHP511} + ZEND_MODULE_API_NO = 20050922; + {$ELSE} + {$IFDEF PHP510} + ZEND_MODULE_API_NO = 20050617; + {$ELSE} + {$IFDEF PHP504} + ZEND_MODULE_API_NO = 20041030; + {$ELSE} + ZEND_MODULE_API_NO = 20040412; + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} +{$ENDIF} +{$IFDEF ZTS} +const + USING_ZTS = 1; +{$ELSE} +const + USING_ZTS = 0; +{$ENDIF} + + +const + NO_VERSION_YET = nil; + MODULE_PERSISTENT = 1; + MODULE_TEMPORARY = 2; + + //zend_alloc.h +const + MEM_BLOCK_START_MAGIC = $7312F8DC; + MEM_BLOCK_END_MAGIC = $2A8FCC84; + MEM_BLOCK_FREED_MAGIC = $99954317; + MEM_BLOCK_CACHED_MAGIC = $FB8277DC; + + +const + MAX_CACHED_MEMORY = 11; + MAX_CACHED_ENTRIES = 256; + PRE_INIT_CACHE_ENTRIES = 32; + + //zend_hash.h +const + HASH_KEY_IS_STRING = 1; + HASH_KEY_IS_LONG = 2; + HASH_KEY_NON_EXISTANT = 3; + HASH_UPDATE = (1 shl 0); + HASH_ADD = (1 shl 1); + HASH_NEXT_INSERT = (1 shl 2); + HASH_DEL_KEY = 0; + HASH_DEL_INDEX = 1; + +const + ZEND_RESOURCE_LIST_TYPE_STD = 1; + ZEND_RESOURCE_LIST_TYPE_EX = 2; + +const + ZEND_HASH_APPLY_KEEP = 0; + ZEND_HASH_APPLY_REMOVE = 1 shl 0; + ZEND_HASH_APPLY_STOP = 1 shl 1; + + //zend_constants.h +const + CONST_CS = (1 shl 0) { Case Sensitive } + ; + CONST_PERSISTENT = (1 shl 1) { Persistent } + ; + + // Debug support +const + TSRM_ERROR_LEVEL_ERROR = 1; + TSRM_ERROR_LEVEL_CORE = 2; + TSRM_ERROR_LEVEL_INFO = 3; + +const + ZVAL_CACHE_LIST = 0; + + +const + STACK_BLOCK_SIZE = 64; + + +const + ZEND_STACK_APPLY_TOPDOWN = 1; + ZEND_STACK_APPLY_BOTTOMUP = 2; + + + //zend_highlight.h +const + HL_COMMENT_COLOR = '#FF8000' { orange } + ; + HL_DEFAULT_COLOR = '#0000BB' { blue } + ; + HL_HTML_COLOR = '#000000' { black } + ; + HL_STRING_COLOR = '#DD0000' { red } + ; + HL_BG_COLOR = '#FFFFFF' { white } + ; + HL_KEYWORD_COLOR = '#007700' { green } + ; + +const + ZEND_INI_USER = (1 shl 0); + ZEND_INI_PERDIR = (1 shl 1); + ZEND_INI_SYSTEM = (1 shl 2); + ZEND_INI_ALL = (ZEND_INI_USER or ZEND_INI_PERDIR or ZEND_INI_SYSTEM); + + ZEND_INI_DISPLAY_ORIG = 1; + ZEND_INI_DISPLAY_ACTIVE = 2; + ZEND_INI_STAGE_STARTUP = (1 shl 0); + ZEND_INI_STAGE_SHUTDOWN = (1 shl 1); + ZEND_INI_STAGE_ACTIVATE = (1 shl 2); + ZEND_INI_STAGE_DEACTIVATE = (1 shl 3); + ZEND_INI_STAGE_RUNTIME = (1 shl 4); + +type + zend_uint = uint; + zend_bool = boolean; + zend_uchar = AnsiChar; + zend_ulong = ulong; + zend_ushort = word; + unsigned_char = byte; + + +type + uint = longword; + PINT = ^Integer; + size_t = cardinal; + ppointer = ^pointer; + pppointer = ^ppointer; + + PStat = ^TStat; + TStat = record + st_dev: Word; + st_ino: Word; + st_mode: Word; + st_nlink: SmallInt; + st_uid: SmallInt; + st_gid: SmallInt; + st_rdev: Word; + st_size: Longint; + st_atime: Longint; + st_mtime: Longint; + st_ctime: Longint; + end; + Stat = TStat; + + Pzend_mem_header = ^Tzend_mem_header; + _zend_mem_header = record + pNext: Pzend_mem_header; + pLast: Pzend_mem_header; + size_cached: integer; + end; + Tzend_mem_header = _zend_mem_header; + + +type + + hash_func_t = function(arKey: PAnsiChar; nKeyLength: uint): ulong; + + compare_func_t = function(_noname1: Pointer; _noname2: Pointer; + TSRMLS_DC: Pointer): integer; + + dtor_func_t = procedure(pDest: Pointer); + + copy_ctor_func_t = procedure(pElement: Pointer); + + PBucket = ^TBucket; + TBucket = record + h: ulong; + nKeyLength: uint; + pData: Pointer; + pDataPtr: Pointer; + pListNext: PBucket; + pListLast: PBucket; + pNext: PBucket; + pLast: PBucket; + arKey: array[0..0] of AnsiChar; + end; + + PHashTable = ^THashTable; + THashTable = + record + nTableSize: uint; + nTableMask: uint; + nNumOfElements: uint; + nNextFreeElement: ulong; + pInternalPointer: PBucket; + pListHead: PBucket; + pListTail: PBucket; + arBuckets: ^PBucket; + pDestructor: pointer; + persistent: boolean; + nApplyCount: Byte; + bApplyProtection: boolean; + end; + + HashPosition = PBucket; + + + {$IFDEF PHP5} + + zend_op_array = + record + _type : zend_uchar; + function_name : PAnsiChar; + scope : pointer; + fn_flags : zend_uint; + prototype : pointer; + num_args : zend_uint; + required_num_args : zend_uint; + arg_info : pointer; + pass_rest_by_reference : zend_bool; + return_reference : Byte; + + {$IFDEF PHP530} + done_pass_two : zend_bool; + {$ENDIF} + + refcount : pointer; + opcodes : pointer; + last :zend_uint ; + size : zend_uint; + T : zend_uint; + brk_cont_array : pointer; + last_brk_cont : zend_uint; + current_brk_cont : zend_uint; + try_catch_array : pointer; + last_try_catch : Integer; + static_variables : PHashTable; + start_op : pointer; + backpatch_count : Integer; + + {$IFDEF PHP530} + this_var : zend_uint; + {$ELSE} + done_pass_two : zend_bool; + uses_this : zend_bool; + {$ENDIF} + + filename : PAnsiChar; + line_start : zend_uint; + line_end : zend_uint; + doc_comment : PAnsiChar; + doc_comment_len : zend_uint; + {$IFDEF PHP530} + early_binding : zend_uint; + {$ENDIF} + reserved : array[0..ZEND_MAX_RESERVED_RESOURCES - 1] of Pointer; + end; + + _zend_internal_function = + record + _type : byte; + function_name : PAnsiChar; + scope : pointer; + fn_flags : zend_uint; + prototype : pointer; + num_args : zend_uint; + required_num_args : zend_uint; + arg_info : pointer; + pass_rest_by_reference : zend_bool; + return_reference : Byte; + handler : pointer; + end; + TZendInternalFunction = _zend_internal_function; + PZendInternalFunction = ^TZendInternalFunction; + + zend_function = + record + case Integer of + 1 : + ( + _type : zend_uchar; + ); + 2 : + ( + common : + record + _type : zend_uchar; + function_name : PAnsiChar; + scope : pointer; + fn_flags : zend_uint; + prototype : pointer; + num_args : zend_uint; + required_num_args : zend_uint; + arg_info : pointer; + pass_rest_by_reference : zend_bool; + return_reference : Byte; + end; + ); + 3 : + ( + op_array : zend_op_array; + ); + 4 : + ( + internal_function : _zend_internal_function; + ); + end; + TZendFunction = zend_function; + PZendFunction = ^TZendFunction; + + PZendObjectIteratorFuncs = ^zend_object_iterator_funcs; + zend_object_iterator_funcs = record + dtor : pointer; + valid : pointer; + get_currect_data : pointer; + get_current_key : pointer; + move_forward : pointer; + rewind : pointer; + end; + + zend_object_iterator = record + data : pointer; + funcs : PZendObjectIteratorFuncs; + index : ulong; + end; + + zend_class_iterator_funcs = record + funcs : pointer; + new_iterator : pointer; + zf_new_iterator : pointer; + zf_valid : pointer; + zf_current : pointer; + zf_key : pointer; + zf_next : pointer; + zf_rewind : pointer; + end; + {$ELSE} + + type zend_op_array = record + _type : zend_uchar; + arg_types : PByte; + function_name : PAnsiChar; + refcount : pointer; + opcodes : pointer; + last : zend_uint; + size : zend_uint; + T : zend_uint; + brk_cont_array : pointer; + last_brk_cont : zend_uint; + current_brk_cont : zend_uint; + uses_globals : zend_bool; + static_variables : PHashTable; + start_op : pointer; + backpatch_count : integer; + + return_reference : boolean; + done_pass_two : boolean; + + filename : PAnsiChar; + reserved : array[0..ZEND_MAX_RESERVED_RESOURCES - 1] of Pointer; + end; + + +type + _zend_internal_function = record + _type : byte; + arg_types : PByte; + function_name : PAnsiChar; + handler : pointer; + end; + PZendInternalFunction = ^_zend_internal_function; + + _zend_overloaded_function = record + _type : byte; + arg_types : PByte; + function_name : PAnsiChar; + _var : zend_uint; + end; + + zend_function = record + case Integer of + 1 : ( _type : zend_uchar; ); + 2 : ( + common : + record + _type : zend_uchar; + arg_types : PByte; + function_name : PAnsiChar; + end; + ); + 3 : + ( + op_array : zend_op_array; + ); + 4 : + ( + internal_function : _zend_internal_function; + ); + 5 : + ( + overloaded_function : _zend_overloaded_function; + ); + end; + + {$ENDIF} + + Pzend_class_entry = ^Tzend_class_entry; + PPZend_class_entry = ^PZend_class_entry; + {$IFDEF PHP4} + Tzend_class_entry = + record + _type: AnsiChar; + name: PAnsiChar; + name_length: uint; + parent: pointer; + refcount: pointer; + constants_updated: boolean; + function_table: THashTable; + default_properties: THashTable; + builtin_functions: pointer; + handle_function_call: pointer; + handle_property_get: pointer; + handle_property_set: pointer; + end; + {$ELSE} + + Tzend_class_entry = record + _type : AnsiChar; + name : PAnsiChar; + name_length : zend_uint; + parent : PZend_class_entry; + refcount : integer; + constants_updated : zend_bool; + ce_flags : zend_uint; + + function_table : THashTable; + default_properties : THashTable; + properties_info : THashTable; + default_static_members : THashTable; + + static_members : PHashTable; + constants_table : THashTable; + builtin_functions : pointer; + + _constructor : PZendFunction; + _destructor : PZendFunction; + clone : PZendFunction; + __get : PZendFunction; + __set : PZendFunction; + //{$IFDEF PHP510} + __unset : PZendFunction; + __isset : PZendFunction; + //{$ENDIF} + __call: PZendFunction; + //{$IFDEF PHP530} + __callstatic : PZendFunction; + //{$ENDIF} + //{$IFDEF PHP520} + __tostring : pointer; + //{$ENDIF} + //{$IFDEF PHP510} + serialize_func : PZendFunction; + unserialize_func : PZendFunction; + // {$ENDIF} + iterator_funcs : zend_class_iterator_funcs; + + create_object : pointer; + get_iterator : pointer; + interface_gets_implemented : pointer; + + get_static_method : pointer; + + serialize : pointer; + unserialize : pointer; + + interfaces : pointer; + num_interfaces : zend_uint; + + filename : PAnsiChar; + line_start : zend_uint; + line_end : zend_uint; + doc_comment : PAnsiChar; + doc_comment_len : zend_uint; + + module : pointer; + end; + {$ENDIF} + + Pzend_Object = ^Tzend_object; + PPzend_Object = ^PZend_Object; + _zend_object = record + ce: Pzend_class_entry; + properties: PHashTable; + {$IFDEF PHP5} + in_get_set : cardinal; + {$ENDIF} + end; + Tzend_Object = _zend_object; + + {$IFDEF PHP5} + + + type + + Tzend_object_get_properties = function (_object : pointer; TSRMLS_DC : pointer) : PHashtable; cdecl; + Pzend_object_get_propeeries = ^Tzend_object_get_properties; + + Tzend_object_get_classname = function(_object : pointer; class_name : pointer; class_name_len : pointer; p : integer; TSRMLS_DC : pointer) : integer; cdecl; + + zend_object_handlers = record + // general object functions + add_ref : pointer; + del_ref : pointer; + clone_obj : pointer; + // individual object functions + read_property : pointer; + write_property : pointer; + read_dimension : pointer; + write_dimension : pointer; + get_property_ptr_ptr : pointer; + _get : pointer; + _set : pointer; + has_property : pointer; + unset_property : pointer; + has_dimension : pointer; + unset_dimension : pointer; + get_properties : Tzend_object_get_properties; + get_method : pointer; + call_method : pointer; + get_constructor : pointer; + get_class_entry : pointer; + get_class_name : Tzend_object_get_classname; + compare_objects : pointer; + cast_object : pointer; + count_elements : pointer; + {$IFDEF PHP530} + get_debug_info : pointer; + get_closure : pointer; + {$ENDIF} + end; + pzend_object_handlers = ^zend_object_handlers; + + zend_object_handle = cardinal; + _zend_object_value = record + handle : zend_object_handle; + handlers : pzend_object_handlers; + end; + TZendObjectValue = _zend_object_value; + PZendObjectValue = ^TZendObjectValue; + {$ENDIF} + + Pzvalue_value = ^zvalue_value; + zvalue_value = record + case longint of + 0: (lval: longint); + 1: (dval: double); + 2: (str: record + val: {$IFDEF PHP_UNICE}PUTF8Char{$ELSE}PAnsiChar{$ENDIF}; + len: integer; + end); + 3: (ht: PHashTable); + {$IFDEF PHP4} + 4: (obj: Tzend_Object); + {$ELSE} + 4 : (obj : _zend_object_value); + {$ENDIF} + end; + + pppzval = ^ppzval; + ppzval = ^pzval; + + + {$IFDEF PHP4} + Pzval = ^zval; + zval = record + value: zvalue_value; + _type: Byte; + is_ref: Byte; + refcount: Smallint; + end; + Tzval = zval; + {$ELSE} + pzval = ^zval; + zval = record + value : zvalue_value; + refcount : zend_uint; + _type : byte; + is_ref : byte; + end; + {$ENDIF} + + ppzval_array = ^pzval_array; + pzval_array = array of ppzval; + pzval_array_ex = array of pzval; + + +type + PZend_rsrc_list_entry = ^zend_rsrc_list_entry; + zend_rsrc_list_entry = record + ptr : pointer; + _type : integer; + refcount : integer; + end; + TZend_rsrc_list_entry = Zend_rsrc_list_entry; + +type + PZendHashKey = ^TZendHashKey; + zend_hash_key = record + arKey: PAnsiChar; + nKeyLength: uint; + h: ulong; + end; + TZendHashKey = zend_hash_key; + + zend_hash_graceful_reverse_destroy_t = procedure(ht: PHashTable); cdecl; + +type + PZendConstant = ^TZendConstant; + zend_constant = record + value: zval; + flags: Integer; + name: PAnsiChar; + name_len: uint; + module_number: Integer; + end; + TZendConstant = zend_constant; + +{$IFDEF PHP5} +type + zend_stream_reader_t = function(handle : pointer; buf : PAnsiChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; + zend_stream_closer_t = procedure(handle : pointer; TSRMLS_DC : pointer); cdecl; + zend_stream_fteller_t = function(handle : pointer; TSRMLS_DC : pointer) : longint; cdecl; + +{$IFDEF PHP530} + zend_stream_fsizer_t = function (handle : pointer; TSRMLS_DC : pointer) : size_t; cdecl; +{$ENDIF} + +{$IFDEF PHP530} +zend_mmap = record + len : size_t; + pos : size_t; + map : pointer; + buf : PAnsiChar; + old_handle : pointer; + old_closer : zend_stream_closer_t; +end; +{$ENDIF} + +{$IFDEF PHP530} + _zend_stream = record + handle : pointer; + isatty : integer; + mmap : zend_mmap; + reader : zend_stream_reader_t; + fsizer : zend_stream_fsizer_t; + closer : zend_stream_closer_t; + end; +{$ELSE} + _zend_stream = record + handle : pointer; + reader : zend_stream_reader_t; + closer : zend_stream_closer_t; + {$IFDEF PHP510} + fteller : zend_stream_fteller_t; + {$ENDIF} + interactive : integer; + end; +{$ENDIF} + + + TZendStream = _zend_stream; + PZendStream = ^TZendStream; + + +{$ENDIF} + + +type + PZendFileHandle = ^TZendFileHandle; + zend_file_handle = + record + {$IFDEF PHP530} + _type : zend_stream_type; + {$ELSE} + _type: uchar; + {$ENDIF} + filename: PAnsiChar; + opened_path: PAnsiChar; + handle: + record + case Integer of + 1: + ( + fd: Integer; + ); + 2: + ( + fp: pointer; + ); + {$IFDEF PHP5} + 3 : + ( + stream : TZendStream; + ); + {$ENDIF} + end; + free_filename: shortint; + end; + TZendFileHandle = zend_file_handle; + + //TSRM.h + + +type + ts_rsrc_id = integer; + pts_rsrc_id = ^ts_rsrc_id; + + + //zend_stack.h +type + pzend_stack = ^Tzend_stack; + zend_stack = + record + top: Integer; + max: Integer; + elements: PPointer; + end; + Tzend_stack = zend_stack; + + +type + Pzend_syntax_highlighter_ini = ^Tzend_syntax_highlighter_ini; + zend_syntax_highlighter_ini = + record + highlight_html : PAnsiChar; + highlight_comment : PAnsiChar; + highlight_default : PAnsiChar; + highlight_string : PAnsiChar; + highlight_keyword : PAnsiChar; + end; + Tzend_syntax_highlighter_ini = zend_syntax_highlighter_ini; + + +type + zend_write_t = function(str: PAnsiChar; str_length: integer): integer; cdecl; + + +type + + {$IFDEF PHP5} + _zend_arg_info = record + name : PAnsiChar; + name_len : zend_uint; + class_name : PAnsiChar; + class_name_len : zend_uint; + {$IFDEF PHP510} + array_type_hint : zend_bool; + {$ENDIF} + allow_null : zend_bool; + pass_by_reference : zend_bool; + return_reference : zend_bool; + required_num_args : integer; + end; + + TZendArgInfo = _zend_arg_info; + PZendArgInfo = ^TZendArgInfo; + {$ENDIF} + + Pzend_function_entry = ^Tzend_function_entry; + zend_function_entry = record + fname: PAnsiChar; + handler: pointer; + {$IFDEF PHP4} + func_arg_types: Pbyte; + {$ELSE} + arg_info : PZendArgInfo; + num_args : zend_uint; + flags : zend_uint; + {$ENDIF} + end; + Tzend_function_entry = zend_function_entry; + TZendFunctionEntry = zend_function_entry; + P_zend_arg_info = ^_zend_arg_info; + zend_object_value = record + handle:Integer; + handlers:Pointer; + end; + _zend_function_entry = record + fname : PAnsiChar; + handler : pointer; + arg_info : P_zend_arg_info; + num_args : uint; + flags : uint; + end; + Pzend_module_entry = ^Tzend_module_entry; + p_zend_module_entry = ^_zend_module_entry; + _zend_module_entry = record + size : word; + zend_api : dword; + zend_debug : byte; + zts : byte; + ini_entry : pointer; + deps : pointer; + name : PAnsiChar; + functions : Pointer; + module_startup_func : pointer; + module_shutdown_func : pointer; + request_startup_func : pointer; + request_shutdown_func : pointer; + info_func : pointer; + version : PAnsiChar; + globals_size : size_t; + globals_id_ptr : pointer; + globals_ctor : pointer; + globals_dtor : pointer; + post_deactivate_func : pointer; + module_started : integer; + _type : byte; + handle : pointer; + module_number : Integer; + build_id : PAnsiChar; + end; + Tzend_module_entry = record + size: word; + zend_api: dword; + zend_debug: byte; + zts: byte; + {$IFDEF PHP5} + ini_entry : pointer; + {$IFDEF PHP510} + deps : pointer; + {$ENDIF} + {$ENDIF} + name: PAnsiChar; + functions: Pointer; + module_startup_func: pointer; + module_shutdown_func: pointer; + request_startup_func: pointer; + request_shutdown_func: pointer; + info_func: pointer; + version: PAnsiChar; + + {$IFDEF PHP5} + {$IFDEF PHP520} + globals_size : size_t; + globals_id_ptr : pointer; + globals_ctor : pointer; + globals_dtor : pointer; + {$ENDIF} + {$ENDIF} + + {$IFDEF PHP5} + post_deactivate_func : pointer; + {$ELSE} + global_startup_func: pointer; + global_shutdown_func: pointer; + {$ENDIF} + + {$IFNDEF PHP520} + global_id: integer; + {$ENDIF} + + module_started: integer; + _type: byte; + handle: pointer; + module_number: longint; + {$IFDEF PHP530} + build_id : PAnsiChar; + {$ENDIF} + end; + + +type + pzend_list_element = ^zend_list_element; + zend_list_element = record + prev: pzend_list_element; + next: pzend_list_element; + data: AnsiChar; + end; + + pzend_llist = ^zend_llist; + zend_llist = record + head: pzend_list_element; + tail: pzend_list_element; + size: size_t; + count: size_t; + dtor: pointer; + persistent: byte; + traverse_ptr: pzend_list_element; + end; + + pzend_overloaded_element = ^Zend_overloaded_element; + zend_overloaded_element = record + _type : integer; + element : zval; + end; + + +type + _zend_property_reference = record + _type: integer; + _object: pzval; + elements_list: pzend_llist; + end; + + Tzend_property_reference = _zend_property_reference; + Pzend_property_reference = ^Tzend_property_reference; + + +type + //Zend internal function + TInternalFunction = procedure(ht: integer; return_value: pzval; this_ptr: pzval; + return_value_used: integer; TSRMLS_DC: pointer); cdecl; + + PInitFunction = ^TInitFunction; + TInitFunction = function(_type: integer; module_number: integer; TSRMLS_DC: pointer): integer; cdecl; + + PShutdownFunction = ^TShutdownFunction; + TShutdownFunction = function(_type: integer; module_number: integer; TSRMLS_DC: pointer): integer; cdecl; + + PZendModuleInfoFunction = ^TZendModuleInfoFunction; + TZendModuleInfoFunction = procedure(zend_module: Pzend_module_entry; TSRMLS_DC: pointer); cdecl; + + //global startup and shutdown function + TZendGlobalFunction = procedure(); cdecl; + + TZendModuleType = (mtPersistent, mtTemporary); + +type + + _znode = record + op_type : Integer; + u : + record + case Integer of + 1 : + ( + constant : zval; + ); + 2 : + ( + _var : zend_uint; + ); + 3 : + ( + opline_num : zend_uint; + { Needs to be signed } + ); + 4 : + ( + op_array : ^zend_op_array; + ); + 5 : + ( + jmp_addr : pointer; + ); + 6 : + ( + EA : + record + _var : zend_uint; + { dummy } + _type : zend_uint; + end; + ); + end; + end; + + _zend_declarables = record + ticks : zval; + end; + zend_declarables = _zend_declarables; + + Pzend_compiler_globals = ^zend_compiler_globals; + zend_compiler_globals = record + bp_stack : zend_stack; + switch_cond_stack : zend_stack; + foreach_copy_stack : zend_stack; + object_stack : zend_stack; + declare_stack : zend_stack; + + + class_entry : PZend_class_entry; + + //variables for list() compilation + list_llist : zend_llist; + dimension_llist : zend_llist; + list_stack : zend_stack; + + function_call_stack : zend_stack; + + compiled_filename : PAnsiChar; + + zend_lineno : integer; + //comment_start_line : integer; + heredoc : PAnsiChar; + heredoc_len : integer; + + active_op_array : pointer; + + function_table : PHashTable; // function symbol table + class_table : PHashTable; // class table + + filenames_table : THashTable; + + auto_globals : PHashTable; + + in_compilation : zend_bool; + short_tags : zend_bool; + asp_tags : zend_bool; + allow_call_time_pass_reference : zend_bool; + + declarables : zend_declarables; + + unclean_shutdown : zend_bool; + ini_parser_unbuffered_errors : zend_bool; + open_files : zend_llist; + + // For extensions support + // extended_info : zend_bool; // generate extension information for debugger/profiler + // handle_op_arrays : zend_bool; // run op_arrays through op_array handlers + + + catch_begin : longint; + + ini_parser_param : pointer; + + interactive : integer; + + start_lineno : zend_uint; + increment_lineno : zend_bool; + + + implementing_class : _znode; + access_type : zend_uint; + doc_comment : PAnsiChar; + doc_comment_len : integer; + end; + Tzend_compiler_globals = zend_compiler_globals; + + + zend_ptr_stack = record + top, max : integer; + elements : pointer; + top_element : pointer; + end; + + jump_buf = array[0..63] of byte; + p_jump_buf = ^jump_buf; + +{$IFDEF PHP5} +type _zend_objects_store = record + object_buckets : pointer; + top : zend_uint; + size : zend_uint; + free_list_head : integer; + end; + +type _zend_property_info = record + flags : zend_uint; + name : PAnsiChar; + name_length : integer; + h : ulong; + {$IFDEF PHP510} + doc_comment : PAnsiChar; + doc_comment_len : integer; + {$ENDIF} + end; + +{$ENDIF} + +type + + Pzend_executor_globals = ^zend_executor_globals; + zend_executor_globals = record + return_value_ptr_ptr : ppzval; + + uninitialized_zval : zval; + uninitialized_zval_ptr : pzval; + + error_zval : zval; + error_zval_ptr : pzval; + + function_state_ptr : pointer; + arg_types_stack : zend_ptr_stack; + + // symbol table cache + symtable_cache : array[0..31] of PHashTable; + symtable_cache_limit : ^PHashTable; + symtable_cache_ptr : ^PHashTable; + + opline_ptr : pointer; + + {$IFDEF PHP4} + current_execute_data : pointer; + {$ENDIF} + + active_symbol_table : PHashTable; + symbol_table : THashTable; // main symbol table + + included_files : THashTable; // files already included */ + + {$IFDEF PHP4} + bailout : jump_buf; + {$ELSE} + bailout : p_jump_buf; + {$ENDIF} + + error_reporting : integer; + orig_error_reporting : integer; + exit_status : integer; + + active_op_array : pointer; + + function_table : PHashTable; // function symbol table */ + class_table : PHashTable; // class table + zend_constants : PHashTable; // constants table */ + + {$IFDEF PHP5} + scope : pointer; + _this : pzval; + {$ENDIF} + + precision : longint; + + ticks_count : integer; + + in_execution : zend_bool; + {$IFDEF PHP5} + in_autoload : PHashTable; + {$IFDEF PHP510} + autoload_func : pointer; + {$ENDIF} + {$ENDIF} + + {$IFDEF PHP4} + bailout_set : zend_bool; + {$ENDIF} + + full_tables_cleanup : zend_bool; + {$IFDEF PHP5} + ze1_compatibility_mode : zend_bool; + {$ENDIF} + + // for extended information support */ + no_extensions : zend_bool; + + timed_out : zend_bool; + + regular_list : THashTable; + persistent_list : ThashTable; + + argument_stack : zend_ptr_stack; + + {$IFNDEF PHP510} + free_op1, free_op2 : pzval; + unary_op : pointer; + binary_op : pointer; + + garbage : array[0..1] of pzval; + garbage_ptr : integer; + {$ENDIF} + + {$IFDEF PHP5} + user_error_handler_error_reporting : integer; + {$ENDIF} + user_error_handler : pzval; + {$IFDEF PHP5} + user_exception_handler : pzval; + user_error_handlers_error_reporting : zend_stack; + {$ENDIF} + + user_error_handlers : zend_ptr_stack; + {$IFDEF PHP5} + user_exception_handlers : zend_ptr_stack; + {$ENDIF} + + //* timeout support */ + timeout_seconds : integer; + lambda_count : integer; + ini_directives : PHashTable; + {$IFDEF PHP5} + + objects_store : _zend_objects_store; + exception : pzval; + opline_before_exception : pointer; + current_execute_data : pointer; + {$IFDEF PHP5} + current_module : pointer; + {$ENDIF} + + std_property_info : _zend_property_info; + {$ENDIF} + //* locale stuff */ + + {$IFNDEF PHP510} + float_separator : AnsiChar; + {$ENDIF} + + reserved: array[0..3] of pointer; + end; + + +{$IFDEF PHP5} + type + TZendObjectReadProperty = function (_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; + TZendObjectReadDimension = function (_object : pzval; offset : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; + TZendObjectWriteProperty = procedure(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; + TZendObjectWriteDimension = procedure(_object : pzval; offset : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; + +{$ENDIF} + +{$IFDEF PHP530} +function ZEND_MODULE_BUILD_ID : AnsiString; +{$ENDIF} + +implementation + +{$IFDEF PHP530} +function ZEND_MODULE_BUILD_ID : AnsiString; +begin + Result := 'API' + IntToStr(ZEND_MODULE_API_NO) + ZEND_BUILD_TS + ZEND_BUILD_DEBUG + ZEND_BUILD_SYSTEM; +end; +{$ENDIF} + +end. diff --git a/license.txt b/license.txt index 8f77bc2..7b99a14 100644 --- a/license.txt +++ b/license.txt @@ -1,68 +1,68 @@ --------------------------------------------------------------------- - The PHP License, version 3.0 -Copyright (c) 1999 - 2002 The PHP Group. All rights reserved. --------------------------------------------------------------------- - -Redistribution and use in source and binary forms, with or without -modification, is permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 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. - - 3. The name "PHP" must not be used to endorse or promote products - derived from this software without prior written permission. For - written permission, please contact group@php.net. - - 4. Products derived from this software may not be called "PHP", nor - may "PHP" appear in their name, without prior written permission - from group@php.net. You may indicate that your software works in - conjunction with PHP by saying "Foo for PHP" instead of calling - it "PHP Foo" or "phpfoo" - - 5. The PHP Group may publish revised and/or new versions of the - license from time to time. Each version will be given a - distinguishing version number. - Once covered code has been published under a particular version - of the license, you may always continue to use it under the terms - of that version. You may also choose to use such covered code - under the terms of any subsequent version of the license - published by the PHP Group. No one other than the PHP Group has - the right to modify the terms applicable to covered code created - under this License. - - 6. Redistributions of any form whatsoever must retain the following - acknowledgment: - "This product includes PHP, freely available from - ". - -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 group@php.net. - -For more information on the PHP Group and the PHP project, -please see . - -This product includes the Zend Engine, freely available at -. +-------------------------------------------------------------------- + The PHP License, version 3.0 +Copyright (c) 1999 - 2002 The PHP Group. All rights reserved. +-------------------------------------------------------------------- + +Redistribution and use in source and binary forms, with or without +modification, is permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 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. + + 3. The name "PHP" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact group@php.net. + + 4. Products derived from this software may not be called "PHP", nor + may "PHP" appear in their name, without prior written permission + from group@php.net. You may indicate that your software works in + conjunction with PHP by saying "Foo for PHP" instead of calling + it "PHP Foo" or "phpfoo" + + 5. The PHP Group may publish revised and/or new versions of the + license from time to time. Each version will be given a + distinguishing version number. + Once covered code has been published under a particular version + of the license, you may always continue to use it under the terms + of that version. You may also choose to use such covered code + under the terms of any subsequent version of the license + published by the PHP Group. No one other than the PHP Group has + the right to modify the terms applicable to covered code created + under this License. + + 6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes PHP, freely available from + ". + +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 group@php.net. + +For more information on the PHP Group and the PHP project, +please see . + +This product includes the Zend Engine, freely available at +. diff --git a/logos.pas b/logos.pas index 4556e15..0732317 100644 --- a/logos.pas +++ b/logos.pas @@ -1,1526 +1,1526 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: logos.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit logos; - -interface - -const - CONTEXT_TYPE_IMAGE_GIF = 'Content-Type: image/gif'; - - zend_logo: array [0..4439] of byte = ( - 71, 73, 70, 56, 57, 97, 100, 0, 58, 0, - 247, 255, 0, 255, 255, 255, 8, 8, 8, 24, - 24, 24, 57, 57, 57, 74, 74, 74, 90, 90, - 90, 99, 99, 99, 123, 123, 123, 132, 132, 132, - 140, 140, 140, 148, 148, 148, 189, 189, 189, 214, - 214, 214, 231, 231, 231, 239, 239, 239, 90, 99, - 99, 222, 231, 239, 57, 66, 74, 165, 173, 181, - 0, 8, 16, 214, 222, 231, 57, 66, 82, 16, - 33, 66, 0, 8, 24, 24, 41, 82, 222, 231, - 255, 57, 66, 90, 198, 206, 231, 181, 189, 214, - 99, 107, 132, 0, 8, 33, 189, 198, 231, 123, - 132, 165, 148, 165, 231, 123, 140, 206, 123, 148, - 239, 49, 66, 132, 24, 33, 66, 49, 74, 165, - 214, 222, 255, 206, 214, 247, 181, 189, 222, 148, - 156, 189, 123, 132, 173, 156, 173, 247, 132, 148, - 214, 99, 115, 181, 49, 57, 90, 41, 49, 82, - 90, 107, 181, 82, 99, 173, 24, 33, 74, 57, - 82, 189, 49, 74, 173, 16, 24, 57, 8, 16, - 49, 198, 206, 247, 181, 189, 231, 165, 173, 214, - 99, 107, 148, 74, 82, 123, 140, 156, 239, 66, - 74, 115, 115, 132, 222, 41, 49, 90, 57, 74, - 165, 49, 66, 148, 49, 66, 156, 41, 57, 140, - 57, 82, 206, 33, 49, 123, 57, 82, 214, 16, - 24, 66, 198, 206, 255, 181, 189, 239, 189, 198, - 255, 156, 165, 214, 140, 148, 198, 132, 140, 189, - 115, 123, 173, 90, 99, 148, 132, 148, 247, 123, - 140, 239, 107, 123, 214, 115, 132, 231, 57, 66, - 115, 107, 123, 222, 115, 132, 239, 57, 66, 123, - 99, 115, 214, 90, 107, 214, 74, 90, 181, 74, - 90, 189, 66, 82, 173, 57, 74, 173, 49, 66, - 165, 66, 90, 231, 49, 66, 173, 24, 33, 90, - 41, 57, 156, 33, 49, 140, 8, 16, 66, 181, - 189, 247, 165, 173, 231, 148, 156, 214, 132, 140, - 198, 115, 123, 181, 82, 90, 148, 49, 57, 115, - 99, 115, 231, 90, 107, 231, 82, 99, 214, 82, - 99, 222, 74, 90, 206, 82, 99, 231, 66, 82, - 189, 33, 41, 99, 57, 74, 189, 57, 74, 198, - 57, 74, 206, 49, 66, 181, 41, 57, 165, 24, - 33, 99, 16, 24, 82, 8, 16, 74, 173, 181, - 247, 173, 181, 255, 165, 173, 247, 140, 148, 214, - 156, 165, 239, 165, 173, 255, 156, 165, 247, 132, - 140, 214, 140, 148, 231, 99, 107, 173, 107, 115, - 189, 115, 123, 206, 123, 132, 222, 99, 107, 189, - 82, 90, 165, 90, 99, 181, 74, 82, 156, 82, - 90, 173, 90, 99, 189, 66, 74, 140, 57, 66, - 140, 57, 66, 148, 41, 49, 115, 74, 90, 222, - 74, 90, 231, 41, 49, 132, 66, 82, 222, 33, - 41, 115, 33, 41, 123, 24, 33, 107, 24, 33, - 123, 16, 24, 90, 148, 156, 247, 140, 148, 239, - 132, 140, 231, 140, 148, 247, 132, 140, 239, 123, - 132, 231, 107, 115, 206, 123, 132, 239, 123, 132, - 247, 99, 107, 206, 99, 107, 214, 82, 90, 181, - 90, 99, 206, 49, 57, 148, 41, 49, 148, 33, - 41, 140, 239, 239, 247, 247, 247, 255, 198, 198, - 206, 214, 214, 222, 173, 173, 181, 189, 189, 198, - 148, 148, 156, 156, 156, 165, 231, 231, 247, 239, - 239, 255, 173, 173, 189, 90, 90, 99, 231, 231, - 255, 222, 222, 247, 140, 140, 156, 66, 66, 74, - 132, 132, 148, 198, 198, 222, 123, 123, 140, 173, - 173, 198, 107, 107, 123, 222, 222, 255, 57, 57, - 66, 49, 49, 57, 156, 156, 181, 198, 198, 231, - 140, 140, 165, 181, 181, 214, 90, 90, 107, 214, - 214, 255, 165, 165, 198, 82, 82, 99, 123, 123, - 148, 74, 74, 90, 115, 115, 140, 33, 33, 41, - 99, 99, 123, 156, 156, 198, 90, 90, 115, 132, - 132, 173, 173, 173, 231, 165, 165, 222, 24, 24, - 33, 82, 82, 115, 156, 156, 222, 115, 115, 165, - 57, 57, 82, 107, 107, 156, 123, 123, 181, 33, - 33, 49, 156, 156, 231, 82, 82, 123, 49, 49, - 74, 107, 107, 165, 74, 74, 115, 148, 148, 231, - 57, 57, 90, 41, 41, 66, 82, 82, 132, 66, - 66, 107, 132, 132, 214, 140, 140, 231, 99, 99, - 165, 123, 123, 206, 66, 66, 115, 82, 82, 148, - 123, 123, 222, 66, 66, 123, 8, 8, 16, 41, - 41, 82, 49, 49, 99, 24, 24, 49, 41, 41, - 90, 24, 24, 66, 8, 8, 24, 16, 16, 57, - 8, 8, 41, 8, 8, 49, 8, 8, 57, 0, - 0, 8, 0, 0, 16, 0, 0, 24, 0, 0, - 0, 44, 0, 0, 0, 0, 100, 0, 58, 0, - 0, 8, 255, 0, 255, 9, 28, 72, 176, 160, - 193, 131, 8, 19, 42, 92, 200, 176, 161, 195, - 135, 188, 146, 37, 131, 246, 176, 226, 193, 94, - 188, 10, 6, 203, 104, 177, 99, 67, 99, 31, - 140, 25, 75, 230, 177, 227, 200, 130, 39, 75, - 170, 60, 104, 12, 87, 128, 103, 198, 40, 174, - 108, 248, 1, 87, 193, 154, 51, 115, 10, 52, - 198, 236, 31, 175, 15, 196, 124, 246, 58, 150, - 17, 227, 203, 0, 2, 122, 9, 240, 121, 140, - 232, 191, 94, 201, 130, 57, 229, 213, 148, 227, - 63, 103, 199, 96, 218, 36, 104, 172, 89, 47, - 140, 2, 159, 57, 19, 232, 236, 153, 206, 143, - 199, 130, 33, 43, 118, 213, 216, 50, 96, 31, - 4, 24, 139, 230, 204, 152, 179, 100, 198, 4, - 240, 50, 166, 2, 88, 76, 144, 200, 144, 17, - 53, 86, 12, 46, 69, 188, 133, 113, 114, 229, - 11, 55, 104, 49, 14, 1, 226, 113, 56, 118, - 150, 33, 72, 99, 207, 2, 252, 3, 70, 249, - 222, 200, 98, 199, 122, 141, 236, 165, 226, 159, - 138, 98, 206, 150, 113, 240, 92, 44, 192, 215, - 211, 169, 145, 45, 93, 214, 235, 95, 128, 148, - 3, 63, 4, 179, 13, 172, 54, 177, 145, 184, - 140, 5, 173, 172, 176, 37, 87, 146, 255, 70, - 23, 251, 0, 90, 119, 114, 99, 28, 158, 45, - 197, 45, 50, 250, 210, 228, 200, 21, 15, 52, - 254, 175, 169, 192, 99, 129, 41, 19, 255, 231, - 103, 142, 31, 203, 158, 3, 139, 45, 227, 5, - 19, 26, 94, 96, 204, 66, 82, 124, 187, 173, - 236, 94, 244, 255, 150, 173, 103, 159, 177, 24, - 178, 8, 120, 225, 183, 211, 49, 196, 224, 149, - 76, 63, 252, 252, 6, 212, 66, 252, 152, 87, - 145, 57, 30, 176, 132, 156, 64, 208, 112, 0, - 82, 52, 255, 64, 163, 155, 0, 31, 44, 67, - 33, 50, 74, 228, 128, 12, 52, 184, 85, 8, - 24, 69, 208, 32, 35, 18, 78, 14, 254, 19, - 82, 72, 102, 245, 211, 207, 63, 130, 49, 56, - 163, 69, 48, 208, 115, 16, 52, 154, 17, 20, - 0, 49, 215, 253, 131, 75, 60, 255, 108, 227, - 141, 64, 252, 208, 163, 193, 112, 60, 22, 68, - 204, 112, 3, 17, 3, 141, 0, 68, 182, 56, - 37, 49, 247, 8, 116, 207, 5, 117, 89, 117, - 80, 63, 19, 180, 248, 144, 61, 230, 204, 196, - 15, 130, 252, 120, 83, 130, 152, 30, 177, 57, - 80, 63, 30, 168, 224, 97, 66, 112, 186, 217, - 208, 61, 224, 220, 168, 210, 4, 253, 204, 80, - 142, 78, 13, 30, 196, 143, 7, 214, 96, 67, - 103, 62, 122, 90, 196, 79, 59, 24, 204, 212, - 79, 60, 232, 228, 3, 168, 157, 255, 240, 147, - 143, 62, 148, 122, 224, 1, 165, 13, 149, 160, - 205, 13, 156, 50, 228, 79, 62, 80, 72, 170, - 83, 162, 5, 121, 80, 70, 62, 108, 242, 51, - 65, 62, 155, 170, 255, 212, 15, 15, 226, 220, - 224, 15, 159, 97, 226, 10, 230, 174, 97, 54, - 24, 232, 160, 85, 156, 147, 37, 160, 168, 34, - 233, 1, 31, 248, 120, 208, 107, 131, 23, 232, - 147, 44, 167, 215, 228, 115, 77, 177, 72, 222, - 144, 134, 19, 24, 224, 3, 171, 7, 247, 116, - 219, 45, 183, 223, 198, 19, 79, 0, 174, 246, - 67, 135, 33, 166, 2, 122, 129, 160, 249, 240, - 177, 71, 62, 247, 140, 27, 192, 61, 250, 240, - 161, 15, 181, 3, 221, 67, 79, 56, 229, 192, - 96, 14, 168, 3, 241, 19, 128, 7, 108, 4, - 98, 141, 59, 24, 216, 99, 195, 194, 12, 51, - 76, 15, 61, 210, 114, 235, 129, 61, 46, 208, - 17, 79, 168, 22, 249, 211, 42, 63, 55, 136, - 161, 7, 18, 55, 72, 124, 195, 30, 72, 196, - 202, 96, 60, 54, 148, 179, 195, 57, 155, 186, - 26, 207, 61, 54, 72, 130, 130, 25, 138, 68, - 194, 198, 36, 56, 231, 140, 51, 29, 98, 204, - 96, 129, 13, 244, 76, 130, 134, 17, 218, 226, - 235, 209, 5, 254, 20, 196, 207, 61, 248, 232, - 145, 137, 30, 51, 148, 64, 143, 13, 30, 235, - 67, 228, 67, 150, 142, 115, 142, 61, 19, 220, - 35, 173, 13, 108, 120, 146, 203, 18, 158, 88, - 49, 69, 22, 103, 79, 113, 202, 217, 169, 116, - 65, 2, 29, 116, 44, 242, 13, 36, 249, 228, - 179, 79, 62, 73, 43, 250, 101, 132, 72, 242, - 255, 19, 143, 7, 72, 104, 194, 10, 17, 152, - 96, 48, 131, 38, 152, 204, 224, 193, 197, 21, - 45, 61, 79, 19, 240, 212, 51, 3, 6, 24, - 24, 241, 67, 18, 174, 228, 146, 196, 18, 156, - 115, 190, 249, 18, 130, 128, 194, 69, 23, 228, - 152, 33, 9, 61, 209, 210, 83, 198, 13, 23, - 152, 23, 232, 5, 30, 92, 19, 175, 140, 247, - 132, 121, 177, 157, 253, 232, 179, 110, 131, 127, - 95, 51, 3, 38, 171, 124, 177, 138, 17, 70, - 168, 66, 7, 62, 215, 244, 26, 112, 131, 50, - 226, 126, 13, 36, 213, 144, 19, 131, 36, 108, - 64, 50, 133, 31, 185, 0, 0, 128, 43, 220, - 111, 207, 125, 230, 126, 72, 177, 4, 14, 93, - 248, 140, 4, 29, 152, 32, 206, 70, 21, 243, - 200, 83, 78, 57, 219, 208, 115, 65, 60, 176, - 75, 235, 79, 188, 189, 146, 75, 16, 63, 251, - 232, 115, 143, 223, 250, 154, 129, 24, 44, 49, - 4, 46, 60, 162, 17, 142, 24, 67, 61, 44, - 128, 4, 120, 45, 235, 76, 19, 208, 212, 176, - 12, 210, 143, 124, 96, 33, 16, 56, 240, 132, - 41, 136, 113, 13, 1, 64, 163, 131, 83, 10, - 161, 7, 71, 8, 141, 10, 173, 65, 18, 139, - 64, 68, 54, 190, 145, 142, 67, 24, 129, 14, - 51, 136, 161, 13, 22, 39, 174, 111, 105, 10, - 92, 241, 242, 155, 175, 252, 182, 15, 36, 220, - 205, 3, 55, 176, 128, 24, 255, 38, 65, 132, - 24, 112, 224, 131, 196, 88, 132, 17, 48, 161, - 135, 61, 36, 235, 30, 254, 64, 218, 61, 36, - 72, 169, 165, 221, 192, 29, 223, 80, 70, 18, - 130, 212, 144, 3, 228, 226, 15, 102, 248, 195, - 33, 26, 177, 10, 34, 104, 98, 6, 72, 128, - 88, 180, 174, 113, 13, 77, 229, 227, 6, 55, - 88, 216, 195, 110, 208, 70, 111, 141, 235, 101, - 251, 224, 4, 39, 98, 136, 129, 122, 16, 81, - 8, 136, 128, 133, 102, 4, 16, 131, 49, 172, - 34, 19, 154, 216, 195, 221, 46, 85, 55, 88, - 5, 74, 80, 241, 200, 135, 5, 136, 48, 133, - 36, 200, 164, 33, 3, 112, 133, 45, 146, 48, - 10, 35, 120, 12, 19, 155, 96, 162, 24, 12, - 103, 1, 123, 32, 97, 97, 37, 40, 193, 228, - 48, 48, 202, 61, 76, 78, 106, 106, 236, 86, - 62, 108, 160, 7, 77, 100, 2, 19, 153, 176, - 4, 17, 134, 16, 132, 64, 106, 230, 26, 169, - 192, 195, 42, 44, 161, 9, 78, 32, 161, 12, - 251, 184, 193, 182, 254, 87, 197, 8, 218, 0, - 3, 68, 24, 197, 53, 4, 114, 0, 90, 40, - 64, 1, 214, 196, 102, 2, 122, 244, 143, 5, - 0, 224, 15, 93, 152, 68, 61, 244, 64, 7, - 75, 144, 161, 140, 150, 120, 33, 220, 198, 57, - 78, 244, 101, 194, 8, 233, 92, 34, 220, 48, - 144, 74, 160, 77, 13, 3, 182, 36, 3, 17, - 86, 49, 255, 134, 47, 212, 160, 14, 63, 16, - 228, 63, 4, 144, 5, 47, 172, 130, 137, 122, - 68, 22, 188, 186, 165, 49, 133, 136, 139, 30, - 208, 252, 196, 117, 24, 160, 73, 87, 120, 15, - 0, 10, 24, 72, 1, 0, 224, 135, 57, 168, - 179, 156, 252, 12, 131, 72, 195, 96, 130, 49, - 8, 65, 8, 68, 72, 233, 42, 134, 240, 133, - 48, 124, 1, 15, 97, 168, 193, 23, 136, 96, - 137, 121, 174, 18, 19, 68, 24, 67, 30, 90, - 234, 133, 158, 210, 32, 160, 154, 129, 70, 22, - 194, 64, 4, 158, 113, 130, 100, 250, 192, 155, - 140, 16, 148, 16, 129, 121, 109, 18, 159, 176, - 69, 1, 8, 64, 0, 6, 36, 193, 15, 75, - 224, 158, 50, 100, 209, 35, 1, 52, 64, 25, - 169, 136, 196, 11, 49, 161, 203, 49, 132, 1, - 15, 115, 136, 195, 35, 82, 193, 5, 60, 224, - 161, 167, 117, 240, 66, 29, 236, 96, 135, 59, - 164, 53, 21, 143, 216, 66, 35, 134, 64, 4, - 156, 97, 2, 158, 121, 16, 41, 30, 234, 192, - 133, 84, 164, 226, 13, 63, 104, 192, 32, 181, - 16, 6, 98, 138, 225, 168, 253, 83, 214, 163, - 152, 218, 212, 123, 148, 128, 17, 202, 88, 2, - 10, 114, 193, 89, 63, 68, 97, 9, 0, 56, - 65, 18, 134, 49, 16, 90, 184, 226, 10, 38, - 176, 4, 206, 140, 144, 83, 19, 112, 225, 16, - 211, 136, 192, 147, 152, 241, 4, 45, 255, 20, - 225, 8, 69, 200, 130, 26, 180, 112, 132, 31, - 104, 195, 25, 79, 170, 64, 52, 92, 224, 5, - 33, 68, 66, 8, 47, 29, 108, 29, 70, 225, - 4, 102, 12, 131, 24, 195, 152, 70, 44, 130, - 154, 133, 47, 212, 84, 12, 123, 80, 100, 200, - 226, 209, 60, 78, 249, 45, 31, 116, 168, 6, - 14, 78, 225, 136, 69, 40, 34, 11, 109, 16, - 196, 38, 205, 48, 139, 129, 16, 0, 0, 102, - 224, 66, 95, 233, 48, 9, 18, 32, 247, 17, - 29, 224, 162, 64, 152, 33, 2, 74, 180, 161, - 25, 241, 56, 70, 19, 6, 96, 16, 1, 116, - 96, 11, 255, 164, 171, 29, 226, 192, 4, 3, - 112, 83, 32, 93, 29, 170, 37, 244, 128, 93, - 146, 193, 138, 187, 143, 106, 230, 196, 214, 144, - 132, 63, 160, 226, 164, 65, 208, 130, 25, 132, - 225, 7, 65, 80, 96, 154, 3, 109, 64, 46, - 74, 225, 5, 44, 76, 130, 172, 95, 152, 67, - 58, 182, 114, 16, 98, 84, 163, 52, 182, 185, - 218, 65, 162, 17, 135, 34, 220, 246, 13, 41, - 240, 146, 65, 160, 97, 138, 26, 212, 116, 15, - 144, 213, 135, 7, 118, 69, 89, 131, 44, 45, - 31, 51, 88, 135, 25, 112, 80, 8, 68, 168, - 227, 15, 73, 232, 195, 21, 212, 107, 128, 129, - 40, 0, 0, 75, 40, 69, 28, 186, 16, 132, - 71, 152, 226, 19, 228, 216, 141, 64, 226, 97, - 128, 4, 32, 32, 255, 40, 1, 136, 5, 10, - 40, 64, 128, 130, 16, 32, 1, 9, 192, 15, - 63, 156, 112, 132, 75, 196, 161, 15, 248, 129, - 70, 48, 20, 16, 140, 32, 9, 64, 11, 214, - 213, 68, 133, 241, 161, 100, 127, 112, 247, 145, - 78, 134, 147, 13, 230, 97, 8, 52, 152, 193, - 12, 125, 72, 135, 35, 226, 224, 7, 87, 112, - 85, 32, 196, 216, 222, 85, 253, 208, 135, 68, - 252, 128, 173, 77, 232, 17, 47, 24, 144, 1, - 205, 66, 160, 154, 56, 176, 130, 39, 40, 64, - 96, 219, 208, 98, 108, 56, 104, 197, 116, 5, - 130, 11, 55, 92, 34, 20, 18, 24, 136, 1, - 40, 176, 1, 28, 216, 162, 1, 5, 160, 144, - 41, 172, 107, 84, 69, 42, 25, 195, 77, 118, - 114, 0, 250, 225, 53, 123, 204, 67, 156, 154, - 216, 130, 25, 92, 161, 139, 225, 4, 224, 21, - 218, 115, 69, 6, 250, 112, 138, 26, 212, 128, - 6, 90, 232, 242, 63, 136, 225, 128, 64, 248, - 186, 18, 159, 64, 1, 14, 220, 0, 6, 48, - 4, 130, 22, 2, 33, 192, 18, 172, 64, 137, - 74, 80, 1, 5, 25, 29, 168, 40, 42, 145, - 3, 153, 48, 99, 3, 87, 168, 4, 37, 172, - 128, 3, 197, 14, 84, 194, 154, 192, 64, 118, - 35, 203, 221, 71, 51, 200, 101, 23, 160, 135, - 17, 216, 161, 12, 205, 97, 72, 32, 193, 8, - 119, 18, 72, 81, 4, 185, 114, 193, 20, 104, - 255, 144, 137, 2, 62, 144, 182, 44, 200, 65, - 14, 112, 0, 195, 37, 46, 209, 134, 93, 228, - 91, 20, 245, 190, 4, 37, 164, 0, 129, 171, - 165, 193, 10, 183, 128, 48, 7, 124, 61, 243, - 75, 80, 129, 2, 65, 77, 69, 99, 233, 128, - 100, 39, 42, 121, 169, 209, 174, 108, 61, 92, - 96, 134, 19, 152, 161, 19, 77, 24, 136, 0, - 28, 224, 10, 18, 183, 129, 176, 113, 240, 47, - 1, 184, 25, 128, 178, 151, 29, 26, 33, 184, - 132, 204, 213, 238, 6, 155, 255, 131, 0, 35, - 152, 121, 191, 229, 128, 130, 90, 175, 96, 4, - 1, 231, 69, 40, 212, 206, 247, 43, 8, 84, - 0, 203, 46, 234, 99, 157, 173, 172, 71, 99, - 140, 31, 54, 192, 130, 33, 206, 144, 229, 40, - 148, 34, 10, 164, 21, 72, 44, 92, 177, 132, - 78, 148, 66, 10, 140, 95, 66, 20, 164, 32, - 100, 130, 8, 160, 26, 107, 151, 121, 27, 18, - 144, 111, 82, 168, 93, 230, 149, 88, 66, 157, - 255, 177, 130, 30, 32, 64, 32, 5, 104, 131, - 204, 103, 47, 10, 129, 10, 245, 11, 47, 60, - 234, 30, 86, 181, 56, 4, 69, 189, 32, 253, - 192, 64, 19, 86, 152, 142, 31, 156, 162, 13, - 109, 216, 129, 123, 1, 96, 11, 206, 157, 64, - 24, 202, 16, 134, 43, 146, 16, 138, 206, 107, - 253, 12, 106, 127, 185, 27, 174, 224, 118, 2, - 72, 129, 18, 148, 224, 187, 255, 18, 86, 223, - 122, 210, 251, 196, 215, 179, 55, 250, 223, 171, - 251, 194, 236, 42, 116, 201, 221, 69, 72, 60, - 110, 0, 133, 38, 184, 163, 10, 144, 112, 196, - 90, 219, 160, 142, 235, 4, 128, 1, 218, 195, - 124, 87, 245, 7, 125, 80, 11, 40, 16, 10, - 178, 16, 11, 215, 129, 0, 177, 208, 128, 177, - 176, 0, 125, 32, 7, 200, 87, 9, 96, 208, - 118, 55, 151, 126, 151, 96, 6, 228, 23, 10, - 177, 32, 16, 2, 240, 3, 51, 71, 123, 72, - 55, 80, 169, 48, 4, 158, 52, 3, 72, 197, - 45, 59, 36, 40, 212, 118, 14, 58, 208, 14, - 51, 80, 5, 141, 176, 127, 165, 128, 31, 8, - 176, 61, 2, 120, 2, 182, 80, 104, 2, 32, - 1, 161, 48, 2, 102, 160, 110, 5, 96, 117, - 75, 96, 6, 75, 48, 8, 161, 112, 5, 107, - 87, 115, 249, 38, 5, 124, 167, 118, 26, 40, - 16, 43, 112, 116, 87, 19, 13, 49, 199, 119, - 84, 0, 1, 65, 245, 8, 145, 64, 7, 24, - 128, 4, 72, 160, 100, 247, 64, 89, 110, 194, - 60, 215, 112, 14, 213, 176, 14, 238, 112, 8, - 234, 224, 9, 81, 48, 8, 108, 145, 111, 1, - 200, 124, 39, 160, 61, 201, 246, 15, 180, 48, - 8, 143, 183, 0, 3, 17, 12, 74, 112, 5, - 110, 208, 6, 82, 64, 13, 221, 32, 7, 106, - 55, 122, 55, 87, 116, 50, 55, 126, 2, 65, - 13, 116, 255, 103, 126, 252, 176, 3, 68, 39, - 7, 103, 96, 126, 132, 100, 4, 245, 128, 4, - 140, 54, 134, 190, 98, 35, 55, 240, 4, 214, - 128, 3, 40, 160, 12, 186, 32, 12, 181, 112, - 73, 4, 16, 12, 6, 160, 138, 170, 184, 138, - 50, 113, 107, 202, 208, 113, 119, 248, 15, 222, - 16, 12, 218, 192, 13, 117, 22, 15, 210, 0, - 7, 151, 96, 129, 111, 39, 10, 69, 167, 118, - 125, 176, 122, 212, 112, 9, 61, 208, 10, 80, - 18, 1, 59, 0, 2, 191, 16, 121, 235, 22, - 3, 147, 48, 3, 16, 83, 59, 24, 179, 63, - 150, 50, 3, 88, 224, 8, 136, 64, 8, 133, - 208, 1, 21, 65, 11, 39, 240, 7, 161, 240, - 9, 27, 0, 37, 67, 150, 13, 148, 160, 5, - 110, 199, 11, 137, 64, 87, 113, 112, 4, 71, - 16, 133, 255, 0, 2, 151, 0, 7, 31, 240, - 10, 250, 69, 16, 241, 80, 12, 93, 128, 9, - 22, 32, 59, 58, 134, 53, 93, 51, 75, 208, - 164, 6, 22, 65, 11, 61, 64, 3, 65, 16, - 4, 34, 192, 0, 2, 18, 37, 177, 240, 1, - 71, 160, 5, 181, 241, 15, 3, 128, 8, 38, - 240, 79, 62, 86, 13, 28, 1, 2, 240, 152, - 5, 186, 240, 10, 181, 86, 16, 188, 32, 11, - 136, 144, 7, 116, 80, 2, 139, 83, 141, 144, - 228, 1, 244, 64, 2, 128, 48, 11, 5, 96, - 0, 52, 89, 147, 54, 121, 147, 6, 255, 240, - 10, 202, 176, 5, 186, 20, 4, 236, 0, 1, - 177, 96, 0, 3, 80, 66, 5, 64, 11, 13, - 144, 3, 169, 96, 7, 169, 112, 11, 52, 169, - 0, 79, 112, 92, 95, 48, 87, 57, 160, 0, - 52, 169, 2, 115, 32, 87, 89, 176, 1, 174, - 64, 11, 5, 80, 66, 196, 96, 0, 177, 224, - 11, 46, 96, 72, 116, 64, 15, 226, 194, 146, - 210, 70, 15, 144, 208, 7, 228, 160, 3, 27, - 176, 89, 22, 53, 135, 114, 201, 124, 40, 96, - 12, 56, 96, 6, 142, 64, 7, 36, 176, 10, - 143, 144, 13, 40, 160, 11, 181, 80, 11, 20, - 128, 12, 135, 16, 4, 66, 96, 2, 142, 160, - 3, 190, 224, 11, 28, 176, 6, 116, 0, 79, - 253, 36, 2, 34, 97, 12, 78, 32, 4, 67, - 160, 10, 95, 208, 5, 45, 240, 1, 186, 208, - 10, 181, 0, 1, 41, 224, 4, 144, 128, 9, - 100, 165, 7, 55, 240, 63, 109, 130, 50, 139, - 96, 6, 139, 128, 1, 147, 224, 8, 160, 160, - 12, 182, 240, 61, 180, 201, 61, 182, 144, 1, - 127, 224, 8, 70, 32, 4, 132, 240, 7, 144, - 128, 62, 171, 144, 7, 93, 32, 3, 50, 208, - 8, 238, 96, 4, 171, 69, 60, 150, 224, 98, - 243, 64, 7, 64, 0, 55, 172, 69, 4, 40, - 133, 5, 99, 5, 79, 252, 20, 4, 142, 32, - 3, 139, 224, 14, 108, 0, 55, 64, 32, 6, - 233, 211, 64, 97, 255, 98, 17, 55, 48, 15, - 238, 128, 6, 235, 80, 15, 11, 83, 15, 143, - 96, 6, 185, 96, 11, 39, 16, 139, 242, 41, - 159, 89, 150, 8, 150, 16, 53, 24, 192, 8, - 103, 208, 8, 191, 179, 10, 100, 80, 83, 60, - 83, 15, 125, 36, 6, 236, 100, 56, 62, 19, - 67, 98, 0, 55, 152, 96, 83, 148, 163, 160, - 240, 4, 160, 134, 83, 2, 63, 3, 134, 217, - 85, 50, 104, 249, 15, 254, 160, 50, 220, 32, - 14, 24, 112, 49, 94, 35, 6, 138, 176, 4, - 154, 131, 105, 127, 80, 162, 38, 90, 162, 234, - 208, 8, 245, 0, 49, 249, 80, 2, 144, 32, - 2, 104, 132, 75, 122, 64, 74, 11, 99, 1, - 22, 16, 67, 104, 36, 71, 83, 131, 4, 172, - 68, 97, 72, 160, 48, 54, 96, 74, 24, 64, - 78, 154, 64, 97, 51, 0, 52, 209, 178, 45, - 30, 160, 15, 145, 197, 146, 23, 80, 14, 47, - 176, 80, 174, 243, 55, 245, 128, 8, 162, 24, - 8, 228, 64, 8, 234, 176, 165, 92, 170, 14, - 233, 192, 8, 147, 176, 15, 220, 34, 46, 30, - 0, 15, 80, 128, 15, 72, 160, 7, 31, 3, - 71, 215, 160, 76, 55, 128, 15, 101, 112, 74, - 110, 250, 166, 72, 224, 46, 21, 10, 71, 116, - 138, 100, 106, 42, 6, 167, - 4, 43, 221, 34, 47, 211, 6, 68, 254, 131, - 49, 247, 16, 14, 124, 179, 63, 3, 83, 15, - 104, 128, 2, 214, 255, 192, 14, 134, 96, 8, - 235, 16, 169, 146, 186, 14, 80, 128, 14, 42, - 121, 150, 126, 131, 15, 162, 89, 167, 198, 164, - 76, 117, 3, 71, 61, 84, 6, 248, 0, 71, - 111, 116, 3, 117, 154, 93, 36, 163, 45, 111, - 234, 46, 122, 164, 71, 32, 67, 67, 191, 34, - 16, 21, 148, 44, 191, 151, 47, 244, 80, 69, - 247, 0, 5, 74, 144, 6, 231, 208, 14, 47, - 80, 15, 47, 48, 15, 47, 16, 172, 243, 32, - 172, 51, 112, 154, 14, 226, 58, 248, 0, 5, - 108, 80, 161, 154, 114, 1, 223, 114, 41, 73, - 245, 172, 83, 84, 55, 76, 250, 67, 83, 228, - 1, 118, 83, 167, 238, 210, 64, 204, 116, 16, - 23, 208, 72, 173, 243, 37, 183, 218, 84, 51, - 224, 4, 91, 211, 72, 55, 36, 65, 235, 106, - 113, 4, 209, 15, 123, 224, 14, 98, 128, 55, - 227, 178, 67, 13, 18, 38, 228, 66, 46, 190, - 18, 15, 19, 96, 120, 2, 243, 40, 110, 196, - 45, 70, 83, 41, 174, 114, 63, 13, 165, 143, - 215, 16, 42, 30, 176, 3, 232, 176, 146, 249, - 154, 175, 13, 82, 118, 2, 3, 105, 111, 178, - 15, 108, 208, 14, 172, 210, 56, 149, 34, 40, - 145, 193, 93, 88, 179, 52, 209, 54, 176, 2, - 33, 15, 207, 224, 1, 250, 170, 52, 27, 203, - 32, 118, 99, 3, 225, 144, 46, 57, 225, 58, - 23, 138, 36, 227, 137, 53, 227, 240, 2, 140, - 61, 163, 18, 131, 146, 15, 220, 229, 13, 19, - 100, 38, 20, 139, 53, 34, 171, 52, 224, 80, - 14, 181, 90, 17, 21, 212, 58, 253, 48, 45, - 47, 187, 130, 29, 241, 179, 10, 193, 15, 225, - 16, 14, 183, 131, 36, 109, 2, 173, 14, 114, - 179, 12, 225, 58, 78, 102, 175, 109, 226, 32, - 1, 1, 0, 59 ); - - php_logo : array [0..2961] of byte = ( - 71, 73, 70, 56, 57, 97, 130, 0, 67, 0, - 213, 255, 0, 0, 0, 0, 48, 47, 49, 2, - 2, 3, 7, 7, 10, 152, 152, 203, 153, 153, - 204, 150, 150, 200, 147, 147, 195, 3, 3, 4, - 91, 91, 105, 164, 164, 178, 69, 69, 73, 196, - 196, 206, 141, 142, 189, 136, 137, 180, 152, 153, - 187, 101, 103, 134, 126, 129, 172, 176, 178, 205, - 25, 26, 36, 49, 52, 73, 33, 35, 49, 69, - 73, 100, 82, 88, 127, 111, 119, 168, 201, 204, - 221, 81, 95, 159, 85, 99, 163, 97, 105, 147, - 13, 14, 19, 162, 169, 205, 183, 189, 220, 88, - 103, 165, 92, 106, 169, 90, 104, 165, 91, 105, - 166, 95, 110, 172, 102, 115, 174, 93, 105, 158, - 139, 150, 197, 148, 158, 202, 219, 221, 229, 192, - 192, 192, 2, 2, 1, 3, 3, 2, 7, 7, - 6, 15, 15, 14, 133, 133, 131, 152, 152, 151, - 114, 113, 110, 5, 4, 3, 20, 19, 18, 31, - 30, 29, 39, 38, 37, 10, 9, 9, 25, 24, - 24, 61, 60, 60, 183, 183, 183, 81, 81, 81, - 12, 12, 12, 5, 5, 5, 1, 1, 1, 255, - 255, 255, 0, 0, 0, 33, 249, 4, 1, 0, - 0, 42, 0, 44, 0, 0, 0, 0, 130, 0, - 67, 0, 64, 6, 255, 64, 149, 112, 72, 44, - 26, 143, 200, 100, 146, 192, 108, 58, 159, 80, - 130, 114, 74, 173, 90, 175, 70, 130, 225, 112, - 48, 72, 24, 169, 112, 42, 227, 105, 96, 66, - 155, 52, 72, 36, 26, 185, 223, 240, 184, 124, - 78, 15, 185, 69, 38, 14, 100, 15, 73, 236, - 49, 14, 13, 92, 6, 88, 133, 72, 91, 13, - 15, 138, 24, 32, 32, 116, 143, 144, 112, 26, - 30, 48, 0, 150, 150, 59, 25, 140, 145, 156, - 157, 111, 33, 33, 23, 11, 1, 1, 11, 128, - 13, 132, 134, 66, 4, 7, 17, 24, 24, 158, - 35, 27, 31, 9, 151, 150, 51, 9, 49, 186, - 49, 58, 56, 46, 182, 151, 60, 57, 40, 25, - 51, 192, 52, 58, 201, 201, 56, 52, 192, 150, - 45, 12, 17, 62, 49, 192, 59, 185, 187, 9, - 190, 206, 0, 44, 48, 37, 142, 115, 33, 32, - 19, 0, 19, 16, 17, 168, 84, 91, 28, 28, - 38, 177, 27, 39, 57, 43, 192, 48, 30, 27, - 114, 26, 31, 212, 244, 149, 182, 52, 41, 223, - 36, 125, 120, 1, 204, 6, 131, 15, 12, 16, - 0, 123, 241, 65, 3, 190, 15, 253, 108, 197, - 136, 0, 238, 17, 137, 11, 2, 120, 248, 137, - 112, 128, 74, 43, 118, 109, 34, 129, 200, 176, - 96, 155, 73, 75, 60, 22, 228, 72, 129, 65, - 67, 132, 12, 60, 22, 54, 132, 3, 2, 67, - 134, 22, 192, 98, 100, 240, 81, 235, 228, 54, - 255, 22, 56, 20, 124, 32, 113, 175, 19, 9, - 13, 3, 0, 4, 216, 216, 17, 139, 1, 3, - 13, 34, 236, 105, 247, 102, 3, 10, 5, 206, - 114, 156, 40, 26, 171, 235, 195, 28, 206, 94, - 4, 244, 10, 39, 196, 197, 14, 0, 6, 80, - 240, 3, 168, 169, 42, 117, 7, 26, 56, 136, - 160, 135, 15, 132, 118, 33, 201, 234, 245, 100, - 54, 132, 137, 11, 22, 2, 212, 160, 65, 163, - 194, 218, 11, 16, 48, 68, 112, 208, 229, 173, - 227, 199, 66, 158, 110, 225, 210, 64, 174, 131, - 203, 17, 50, 107, 222, 204, 153, 243, 229, 203, - 149, 185, 116, 73, 5, 185, 180, 233, 44, 90, - 38, 115, 41, 224, 65, 130, 107, 6, 176, 25, - 184, 158, 173, 64, 129, 34, 69, 152, 51, 191, - 194, 192, 174, 119, 111, 197, 139, 67, 143, 38, - 125, 186, 184, 138, 201, 15, 90, 203, 110, 80, - 34, 77, 222, 189, 179, 98, 184, 152, 62, 29, - 71, 10, 18, 21, 247, 134, 243, 203, 33, 129, - 178, 4, 167, 26, 27, 223, 162, 121, 44, 29, - 16, 36, 82, 4, 160, 206, 190, 189, 139, 25, - 53, 116, 188, 200, 144, 161, 185, 172, 6, 57, - 88, 0, 107, 177, 195, 253, 141, 0, 242, 101, - 48, 84, 35, 210, 248, 226, 158, 123, 240, 201, - 39, 155, 56, 116, 92, 116, 131, 12, 230, 160, - 67, 156, 58, 116, 113, 208, 149, 6, 18, 68, - 100, 137, 65, 155, 208, 68, 255, 66, 6, 53, - 0, 115, 131, 15, 37, 217, 178, 64, 6, 35, - 228, 37, 194, 72, 58, 0, 19, 64, 6, 41, - 96, 101, 11, 11, 57, 56, 144, 93, 138, 34, - 100, 128, 3, 48, 51, 120, 16, 194, 115, 113, - 160, 129, 86, 0, 231, 52, 48, 5, 43, 188, - 185, 211, 9, 8, 37, 164, 240, 139, 68, 62, - 124, 32, 229, 7, 244, 229, 208, 98, 88, 62, - 200, 120, 201, 10, 57, 52, 192, 149, 44, 241, - 244, 64, 15, 140, 205, 216, 162, 67, 148, 83, - 86, 217, 83, 78, 246, 24, 69, 1, 0, 55, - 248, 193, 152, 21, 80, 233, 97, 33, 29, 249, - 16, 100, 203, 12, 0, 109, 208, 200, 159, 107, - 0, 249, 6, 160, 128, 158, 71, 104, 35, 41, - 104, 8, 128, 11, 10, 136, 115, 40, 27, 100, - 97, 71, 206, 14, 22, 92, 192, 193, 156, 144, - 33, 66, 215, 84, 28, 60, 170, 157, 118, 43, - 122, 218, 149, 89, 26, 88, 128, 86, 57, 149, - 38, 22, 200, 132, 198, 169, 131, 136, 92, 174, - 212, 101, 215, 172, 119, 245, 102, 194, 173, 184, - 178, 161, 43, 174, 183, 246, 182, 199, 5, 9, - 4, 171, 140, 14, 11, 20, 187, 128, 5, 9, - 32, 118, 151, 98, 129, 140, 214, 234, 179, 88, - 164, 38, 153, 106, 148, 85, 102, 237, 181, 215, - 138, 54, 200, 180, 79, 65, 235, 173, 21, 169, - 13, 242, 5, 140, 98, 132, 193, 128, 7, 7, - 204, 133, 255, 65, 9, 118, 172, 168, 198, 161, - 128, 66, 250, 6, 30, 184, 178, 67, 235, 93, - 193, 9, 210, 237, 183, 111, 105, 193, 133, 114, - 244, 73, 96, 134, 8, 126, 222, 216, 137, 8, - 37, 36, 172, 48, 187, 130, 238, 101, 71, 30, - 125, 4, 203, 86, 179, 172, 126, 139, 156, 2, - 30, 120, 224, 0, 81, 13, 239, 85, 83, 6, - 59, 200, 228, 208, 167, 157, 252, 120, 65, 47, - 56, 232, 192, 1, 58, 226, 157, 182, 197, 103, - 17, 164, 72, 71, 27, 11, 215, 108, 51, 118, - 26, 100, 215, 134, 142, 192, 232, 80, 223, 205, - 32, 228, 12, 135, 8, 33, 216, 108, 116, 194, - 216, 249, 89, 71, 8, 22, 212, 112, 67, 5, - 69, 186, 85, 8, 43, 14, 40, 214, 33, 36, - 86, 129, 229, 211, 73, 58, 176, 148, 207, 62, - 91, 111, 163, 128, 4, 249, 48, 32, 64, 216, - 219, 44, 48, 96, 131, 22, 136, 73, 193, 202, - 82, 31, 121, 64, 146, 177, 124, 108, 67, 78, - 13, 105, 160, 247, 61, 37, 100, 160, 40, 0, - 56, 100, 185, 95, 52, 5, 175, 145, 222, 154, - 150, 208, 248, 129, 147, 120, 235, 189, 247, 8, - 125, 43, 48, 143, 45, 1, 180, 249, 72, 8, - 21, 148, 83, 100, 197, 68, 176, 146, 135, 146, - 7, 135, 144, 65, 0, 61, 103, 176, 70, 28, - 118, 3, 179, 0, 3, 56, 217, 82, 207, 200, - 110, 128, 16, 1, 235, 57, 165, 64, 255, 34, - 48, 56, 100, 240, 35, 234, 77, 26, 67, 185, - 229, 22, 89, 0, 64, 7, 150, 58, 192, 121, - 100, 7, 176, 3, 58, 39, 95, 31, 115, 157, - 35, 108, 4, 29, 66, 10, 122, 154, 233, 67, - 153, 151, 36, 144, 193, 151, 34, 124, 24, 162, - 137, 59, 85, 111, 137, 11, 245, 129, 179, 98, - 206, 126, 59, 179, 0, 240, 22, 93, 208, 131, - 70, 231, 196, 109, 132, 1, 14, 40, 223, 201, - 6, 30, 104, 137, 118, 207, 41, 68, 64, 11, - 238, 186, 123, 78, 116, 142, 81, 165, 253, 165, - 141, 1, 230, 129, 196, 69, 4, 208, 3, 10, - 92, 0, 16, 199, 35, 66, 43, 238, 98, 2, - 59, 156, 199, 1, 12, 144, 65, 237, 232, 195, - 193, 48, 208, 231, 3, 13, 64, 67, 27, 54, - 16, 129, 49, 112, 144, 131, 36, 16, 96, 9, - 79, 200, 193, 197, 181, 46, 123, 44, 36, 151, - 128, 36, 64, 145, 47, 113, 130, 4, 109, 3, - 192, 90, 226, 87, 8, 242, 76, 69, 14, 76, - 74, 193, 13, 128, 161, 61, 27, 146, 44, 18, - 27, 112, 128, 15, 190, 119, 137, 5, 160, 192, - 136, 122, 33, 74, 230, 16, 176, 67, 9, 61, - 230, 41, 233, 170, 75, 59, 172, 82, 46, 49, - 124, 64, 94, 71, 228, 196, 138, 22, 215, 197, - 20, 176, 175, 43, 36, 184, 8, 57, 80, 133, - 152, 197, 200, 207, 101, 113, 217, 20, 31, 168, - 98, 193, 48, 218, 255, 17, 18, 125, 1, 204, - 4, 118, 192, 131, 14, 44, 5, 49, 225, 225, - 151, 18, 16, 161, 46, 89, 217, 165, 29, 38, - 104, 67, 29, 239, 248, 9, 80, 60, 140, 3, - 23, 16, 197, 2, 112, 128, 3, 82, 224, 96, - 1, 201, 194, 23, 197, 4, 233, 178, 201, 88, - 70, 55, 134, 188, 23, 31, 36, 70, 202, 82, - 154, 50, 147, 83, 121, 69, 102, 2, 161, 175, - 8, 114, 242, 149, 157, 139, 130, 44, 103, 217, - 4, 88, 218, 242, 52, 210, 226, 150, 46, 119, - 185, 175, 91, 250, 242, 72, 210, 210, 22, 23, - 110, 67, 204, 98, 230, 70, 55, 187, 1, 14, - 43, 5, 177, 173, 94, 254, 18, 90, 225, 90, - 141, 4, 168, 68, 46, 19, 198, 70, 2, 30, - 120, 192, 39, 145, 153, 204, 110, 246, 202, 55, - 190, 90, 214, 98, 154, 229, 172, 103, 190, 5, - 139, 7, 40, 128, 4, 170, 233, 65, 116, 69, - 128, 93, 32, 72, 67, 193, 116, 117, 199, 111, - 222, 139, 89, 173, 52, 231, 18, 38, 163, 78, - 250, 132, 225, 3, 173, 64, 131, 159, 58, 38, - 135, 80, 17, 138, 160, 94, 129, 88, 196, 130, - 117, 142, 77, 234, 19, 57, 95, 128, 205, 3, - 98, 54, 80, 232, 156, 192, 132, 29, 68, 145, - 193, 62, 245, 176, 136, 233, 32, 88, 225, 113, - 229, 120, 134, 233, 26, 141, 17, 101, 163, 100, - 33, 218, 232, 74, 135, 82, 59, 254, 168, 59, - 255, 198, 186, 128, 27, 69, 234, 24, 68, 60, - 160, 54, 14, 104, 14, 66, 245, 2, 15, 121, - 0, 67, 1, 79, 100, 36, 30, 255, 66, 73, - 28, 36, 96, 166, 35, 189, 204, 3, 54, 134, - 82, 131, 194, 75, 84, 113, 104, 158, 45, 106, - 144, 2, 71, 29, 116, 14, 79, 125, 42, 24, - 229, 32, 142, 166, 213, 224, 109, 86, 204, 84, - 186, 46, 195, 8, 130, 110, 64, 2, 24, 141, - 225, 9, 61, 248, 1, 12, 40, 109, 4, 76, - 202, 192, 147, 178, 151, 86, 127, 126, 208, 173, - 208, 75, 79, 93, 213, 218, 66, 15, 52, 7, - 165, 23, 161, 129, 11, 34, 36, 136, 115, 166, - 43, 51, 9, 196, 234, 236, 98, 98, 64, 56, - 189, 32, 5, 14, 72, 3, 37, 26, 107, 9, - 26, 192, 32, 5, 35, 208, 0, 10, 82, 112, - 183, 198, 206, 32, 6, 31, 72, 236, 27, 46, - 114, 55, 168, 133, 245, 10, 80, 217, 205, 78, - 221, 128, 161, 191, 25, 48, 6, 41, 24, 201, - 142, 40, 107, 137, 0, 96, 54, 70, 180, 189, - 132, 14, 206, 8, 7, 18, 188, 105, 0, 224, - 193, 84, 21, 234, 132, 129, 20, 30, 204, 123, - 61, 67, 83, 154, 252, 22, 178, 218, 229, 64, - 33, 174, 75, 1, 53, 253, 169, 128, 230, 94, - 162, 7, 57, 240, 128, 15, 102, 123, 9, 235, - 76, 73, 74, 244, 129, 129, 239, 204, 180, 149, - 224, 1, 160, 7, 22, 184, 255, 212, 27, 231, - 215, 0, 251, 121, 162, 167, 98, 114, 93, 80, - 231, 181, 129, 38, 205, 181, 178, 62, 16, 31, - 0, 254, 129, 29, 93, 137, 64, 170, 151, 32, - 31, 66, 160, 123, 137, 23, 144, 109, 104, 27, - 72, 15, 246, 44, 113, 3, 9, 32, 20, 135, - 0, 224, 65, 122, 133, 139, 4, 36, 81, 229, - 29, 250, 0, 6, 85, 141, 235, 161, 12, 12, - 113, 170, 66, 108, 28, 77, 154, 180, 96, 0, - 248, 44, 191, 34, 2, 200, 141, 84, 74, 58, - 91, 52, 184, 165, 110, 240, 109, 57, 30, 152, - 142, 36, 172, 227, 194, 75, 178, 137, 117, 45, - 1, 90, 216, 85, 5, 5, 57, 136, 239, 37, - 98, 160, 191, 8, 71, 35, 59, 86, 41, 50, - 0, 96, 0, 163, 241, 90, 162, 136, 114, 216, - 64, 3, 24, 160, 31, 19, 149, 87, 129, 23, - 72, 139, 156, 214, 139, 60, 247, 118, 98, 18, - 138, 226, 193, 145, 227, 176, 1, 12, 164, 160, - 196, 46, 72, 193, 149, 186, 27, 64, 56, 204, - 2, 113, 0, 168, 65, 1, 109, 209, 3, 5, - 92, 185, 42, 77, 106, 241, 37, 108, 160, 128, - 18, 236, 116, 129, 240, 227, 136, 18, 88, 161, - 188, 69, 62, 98, 103, 220, 181, 196, 137, 228, - 185, 129, 162, 109, 22, 6, 147, 219, 51, 140, - 24, 91, 224, 3, 15, 202, 38, 157, 29, 242, - 78, 214, 92, 91, 211, 105, 32, 13, 69, 187, - 168, 2, 255, 50, 253, 140, 62, 195, 56, 198, - 194, 179, 6, 15, 149, 240, 145, 59, 113, 66, - 202, 25, 212, 240, 71, 133, 181, 30, 147, 116, - 109, 32, 60, 82, 177, 36, 50, 4, 12, 97, - 80, 233, 133, 150, 136, 143, 196, 122, 225, 100, - 19, 125, 96, 119, 157, 32, 71, 5, 18, 112, - 41, 87, 222, 216, 213, 144, 200, 83, 110, 89, - 0, 91, 27, 129, 136, 136, 219, 27, 154, 232, - 244, 172, 104, 24, 185, 22, 109, 9, 64, 224, - 169, 71, 251, 166, 14, 88, 96, 115, 234, 104, - 47, 59, 68, 210, 59, 96, 32, 0, 65, 52, - 0, 208, 11, 86, 130, 130, 120, 246, 212, 61, - 90, 249, 210, 189, 219, 195, 228, 20, 48, 209, - 18, 50, 128, 55, 128, 98, 144, 131, 12, 108, - 101, 220, 228, 6, 0, 165, 30, 104, 60, 58, - 205, 237, 46, 102, 189, 10, 48, 4, 160, 21, - 163, 137, 227, 211, 207, 233, 158, 205, 144, 237, - 33, 155, 129, 224, 3, 90, 187, 238, 11, 114, - 90, 51, 18, 160, 33, 103, 171, 237, 173, 6, - 208, 50, 1, 182, 212, 216, 225, 245, 187, 203, - 121, 50, 192, 105, 192, 181, 89, 168, 231, 41, - 1, 79, 52, 44, 1, 40, 70, 81, 4, 153, - 75, 73, 27, 95, 238, 148, 9, 66, 156, 38, - 139, 21, 25, 206, 31, 161, 89, 206, 18, 209, - 70, 71, 60, 10, 57, 120, 176, 195, 182, 92, - 145, 60, 90, 100, 45, 68, 102, 192, 219, 117, - 174, 83, 85, 180, 75, 79, 17, 8, 98, 212, - 117, 174, 211, 64, 1, 28, 254, 57, 5, 206, - 214, 129, 5, 0, 146, 194, 98, 173, 218, 28, - 17, 102, 51, 153, 133, 125, 14, 52, 171, 187, - 94, 72, 181, 246, 180, 44, 5, 95, 133, 125, - 214, 83, 228, 130, 129, 57, 114, 128, 104, 119, - 79, 188, 27, 72, 101, 129, 9, 136, 169, 3, - 59, 92, 25, 99, 104, 90, 154, 151, 201, 113, - 42, 137, 28, 129, 161, 21, 239, 149, 190, 108, - 224, 2, 20, 168, 1, 215, 255, 147, 42, 197, - 232, 235, 153, 132, 188, 252, 28, 111, 197, 249, - 203, 57, 242, 191, 128, 169, 164, 96, 2, 64, - 129, 84, 113, 128, 89, 45, 211, 231, 16, 176, - 8, 171, 194, 139, 82, 121, 172, 255, 132, 230, - 55, 207, 85, 71, 26, 63, 69, 16, 3, 86, - 50, 138, 85, 212, 99, 101, 242, 246, 193, 201, - 189, 238, 7, 249, 170, 185, 196, 74, 148, 216, - 191, 215, 41, 73, 57, 44, 29, 32, 11, 149, - 208, 143, 190, 244, 167, 175, 10, 201, 84, 235, - 152, 175, 176, 87, 246, 215, 207, 14, 85, 174, - 146, 149, 229, 36, 63, 44, 167, 37, 204, 250, - 219, 255, 254, 206, 52, 103, 16, 0, 0, 59, - 10, 124, 165, 92, 136, 65, 105, 236, 247, 73, - 168, 224, 1, 35, 240, 0, 23, 226, 0, 154, - 225, 54, 178, 247, 74, 94, 17, 75, 229, 34, - 22, 137, 33, 128, 174, 3, 88, 10, 143, 65, - 21, 34, 48, 1, 51, 160, 3, 207, 151, 127, - 104, 37, 126, 248, 196, 4, 196, 18, 46, 202, - 52, 75, 2, 50, 129, 21, 88, 7, 209, 100, - 114, 95, 97, 12, 172, 96, 92, 36, 176, 128, - 104, 213, 128, 10, 117, 76, 254, 71, 8, 175, - 80, 130, 203, 164, 46, 186, 176, 130, 20, 24, - 7, 62, 24, 77, 199, 52, 47, 247, 177, 54, - 19, 128, 90, 60, 240, 43, 229, 132, 86, 180, - 161, 121, 58, 85, 11, 46, 115, 8, 175, 49, - 25, 155, 17, 8, 58, 184, 76, 9, 80, 46, - 3, 0, 85, 80, 165, 78, 235, 52, 13, 247, - 178, 47, 241, 164, 26, 177, 65, 27, 221, 241, - 132, 183, 193, 86, 189, 49, 78, 228, 84, 78, - 110, 248, 134, 112, 24, 135, 242, 68, 134, 28, - 37, 42, 103, 136, 134, 33, 104, 48, 39, 35, - 27, 109, 160, 48, 220, 242, 135, 21, 224, 25, - 220, 2, 49, 7, 53, 49, 32, 21, 4, 0, - 59, 0 ); - - php_egg_logo : array [0..7537] of byte = ( - 71, 73, 70, 56, 57, 97, 130, 0, 67, 0, - 247, 255, 0, 152, 134, 136, 108, 76, 84, 73, - 70, 71, 166, 138, 148, 136, 108, 119, 192, 192, - 192, 122, 106, 117, 139, 123, 134, 75, 59, 71, - 167, 162, 166, 91, 85, 90, 41, 28, 39, 104, - 91, 102, 152, 138, 150, 87, 75, 86, 105, 100, - 105, 41, 39, 41, 152, 150, 152, 55, 43, 57, - 160, 149, 166, 156, 140, 167, 56, 55, 57, 84, - 76, 100, 92, 84, 116, 92, 84, 124, 116, 108, - 148, 116, 114, 138, 85, 84, 107, 132, 131, 150, - 84, 84, 116, 108, 108, 148, 132, 132, 180, 92, - 92, 124, 140, 140, 188, 124, 124, 165, 105, 105, - 140, 76, 76, 101, 100, 100, 132, 116, 116, 153, - 156, 156, 204, 148, 148, 194, 132, 132, 172, 69, - 69, 90, 140, 140, 180, 169, 169, 214, 92, 92, - 116, 184, 184, 227, 203, 203, 246, 164, 165, 204, - 232, 233, 249, 40, 41, 56, 52, 54, 72, 27, - 31, 47, 106, 108, 116, 123, 125, 132, 106, 121, - 166, 25, 27, 33, 17, 18, 21, 140, 156, 196, - 108, 116, 136, 56, 65, 86, 80, 100, 136, 88, - 94, 104, 76, 87, 101, 41, 52, 52, 71, 91, - 88, 138, 167, 161, 183, 197, 194, 172, 183, 177, - 100, 136, 115, 118, 177, 139, 156, 200, 172, 148, - 223, 173, 131, 195, 153, 94, 126, 105, 105, 165, - 123, 85, 114, 94, 88, 149, 105, 137, 165, 145, - 73, 131, 88, 76, 153, 92, 106, 184, 123, 90, - 167, 105, 141, 212, 152, 157, 180, 159, 120, 187, - 123, 131, 198, 135, 106, 152, 108, 122, 168, 124, - 77, 111, 78, 87, 151, 88, 137, 213, 138, 148, - 225, 148, 104, 169, 103, 74, 154, 70, 70, 132, - 67, 106, 183, 102, 140, 182, 138, 91, 135, 88, - 154, 198, 151, 176, 228, 169, 91, 169, 78, 122, - 199, 108, 163, 218, 153, 86, 156, 70, 105, 183, - 88, 103, 169, 88, 138, 215, 120, 151, 216, 137, - 49, 121, 31, 120, 185, 104, 136, 200, 120, 66, - 122, 49, 134, 184, 120, 151, 228, 124, 121, 170, - 104, 68, 96, 59, 180, 205, 171, 44, 93, 25, - 79, 147, 52, 87, 135, 68, 105, 183, 72, 121, - 201, 86, 138, 214, 105, 103, 150, 83, 154, 200, - 135, 87, 162, 51, 104, 168, 74, 119, 185, 89, - 134, 195, 104, 69, 132, 36, 154, 215, 120, 70, - 148, 25, 102, 176, 57, 119, 167, 90, 176, 233, - 143, 98, 161, 57, 164, 230, 122, 151, 199, 119, - 92, 166, 37, 122, 192, 74, 135, 204, 86, 150, - 216, 103, 145, 202, 104, 116, 190, 57, 45, 69, - 26, 92, 172, 20, 118, 176, 69, 132, 186, 87, - 168, 218, 124, 35, 50, 20, 152, 177, 112, 142, - 162, 98, 70, 71, 38, 88, 87, 57, 166, 165, - 109, 202, 200, 143, 173, 166, 91, 180, 177, 143, - 134, 127, 89, 92, 84, 44, 88, 85, 71, 73, - 69, 55, 57, 53, 40, 185, 168, 118, 114, 100, - 63, 123, 118, 106, 156, 149, 134, 105, 84, 41, - 230, 177, 85, 87, 71, 43, 239, 199, 124, 235, - 205, 148, 170, 152, 119, 167, 121, 48, 51, 42, - 27, 206, 173, 121, 167, 109, 22, 190, 132, 42, - 202, 145, 60, 181, 143, 86, 228, 179, 109, 145, - 116, 72, 201, 163, 107, 105, 86, 58, 37, 31, - 22, 206, 151, 80, 216, 164, 91, 184, 151, 105, - 166, 137, 99, 231, 207, 176, 111, 101, 87, 127, - 78, 15, 150, 105, 52, 122, 87, 42, 152, 135, - 114, 104, 58, 6, 72, 57, 41, 225, 185, 141, - 179, 126, 70, 161, 115, 69, 138, 102, 64, 155, - 122, 87, 183, 151, 118, 77, 49, 24, 114, 75, - 39, 121, 88, 57, 168, 152, 137, 95, 57, 26, - 103, 69, 40, 188, 138, 96, 88, 71, 56, 65, - 35, 11, 143, 107, 79, 217, 171, 136, 88, 59, - 39, 105, 86, 73, 225, 189, 163, 129, 94, 71, - 199, 160, 135, 129, 103, 88, 148, 121, 105, 207, - 172, 153, 137, 117, 105, 103, 73, 57, 188, 143, - 121, 198, 182, 174, 204, 198, 195, 101, 60, 42, - 116, 76, 57, 119, 88, 74, 166, 127, 109, 69, - 43, 34, 55, 43, 39, 165, 133, 123, 182, 149, - 139, 185, 162, 156, 135, 107, 101, 167, 154, 151, - 84, 50, 44, 87, 59, 54, 139, 133, 132, 102, - 76, 72, 119, 90, 86, 71, 58, 56, 150, 124, - 120, 87, 73, 71, 136, 121, 119, 167, 139, 136, - 182, 138, 134, 120, 104, 103, 116, 76, 76, 103, - 87, 87, 122, 120, 120, 255, 255, 255, 0, 0, - 0, 33, 249, 4, 1, 0, 0, 5, 0, 44, - 0, 0, 0, 0, 130, 0, 67, 0, 64, 8, - 255, 0, 11, 8, 28, 72, 176, 160, 193, 131, - 8, 13, 162, 88, 24, 34, 196, 138, 15, 41, - 82, 136, 16, 97, 194, 132, 135, 18, 37, 64, - 180, 184, 192, 177, 99, 199, 22, 32, 64, 148, - 24, 225, 193, 196, 68, 17, 41, 62, 124, 104, - 24, 98, 33, 138, 132, 48, 99, 202, 156, 121, - 144, 97, 10, 19, 32, 54, 144, 32, 161, 162, - 39, 147, 34, 81, 214, 0, 50, 99, 166, 74, - 20, 35, 73, 162, 36, 65, 194, 101, 138, 83, - 51, 110, 246, 108, 177, 178, 134, 205, 158, 70, - 101, 188, 164, 49, 147, 38, 205, 155, 41, 70, - 164, 72, 137, 178, 100, 73, 19, 179, 79, 180, - 148, 69, 43, 230, 75, 19, 43, 85, 2, 169, - 209, 130, 6, 208, 220, 43, 74, 152, 248, 232, - 112, 33, 164, 200, 12, 34, 86, 44, 164, 73, - 184, 0, 138, 15, 30, 116, 170, 224, 193, 132, - 143, 23, 41, 110, 182, 156, 177, 50, 167, 207, - 27, 48, 108, 186, 148, 241, 83, 40, 16, 32, - 70, 143, 2, 173, 113, 3, 168, 210, 35, 74, - 140, 246, 116, 113, 66, 100, 8, 145, 8, 17, - 226, 217, 168, 241, 160, 223, 0, 118, 184, 217, - 121, 243, 102, 173, 247, 182, 109, 187, 189, 101, - 243, 69, 156, 120, 182, 109, 221, 192, 201, 155, - 55, 204, 147, 243, 56, 115, 164, 116, 153, 94, - 133, 52, 164, 73, 106, 202, 100, 93, 228, 231, - 77, 152, 58, 97, 240, 48, 255, 193, 56, 82, - 196, 135, 151, 52, 67, 136, 80, 172, 224, 30, - 0, 0, 13, 26, 0, 168, 7, 224, 25, 62, - 0, 248, 220, 185, 3, 16, 175, 193, 1, 27, - 54, 112, 64, 1, 5, 19, 36, 64, 196, 129, - 84, 28, 113, 68, 28, 125, 80, 113, 74, 55, - 191, 252, 98, 138, 2, 51, 204, 64, 3, 14, - 56, 84, 96, 10, 0, 6, 164, 179, 0, 2, - 218, 32, 115, 204, 44, 210, 132, 179, 77, 62, - 4, 224, 179, 77, 56, 199, 244, 82, 15, 3, - 7, 74, 96, 78, 55, 240, 72, 176, 0, 4, - 252, 152, 50, 140, 53, 156, 244, 193, 198, 27, - 80, 85, 177, 5, 87, 129, 196, 129, 197, 24, - 88, 24, 161, 198, 29, 101, 104, 225, 214, 21, - 78, 226, 161, 198, 21, 21, 153, 112, 30, 76, - 57, 145, 0, 142, 57, 230, 204, 179, 28, 55, - 221, 168, 179, 78, 3, 28, 28, 80, 15, 62, - 234, 212, 211, 205, 55, 237, 180, 217, 230, 61, - 112, 126, 99, 128, 1, 250, 212, 105, 74, 43, - 189, 216, 34, 204, 53, 242, 32, 32, 0, 4, - 57, 224, 112, 33, 14, 57, 228, 96, 207, 47, - 154, 100, 2, 202, 47, 247, 204, 121, 192, 123, - 7, 16, 112, 64, 3, 3, 172, 227, 141, 49, - 198, 172, 82, 203, 46, 208, 192, 35, 202, 52, - 175, 136, 162, 137, 51, 189, 220, 2, 11, 44, - 180, 240, 226, 201, 24, 75, 222, 129, 8, 24, - 94, 160, 255, 97, 70, 25, 105, 168, 145, 198, - 26, 104, 8, 130, 198, 146, 105, 176, 17, 136, - 33, 113, 136, 225, 208, 7, 48, 133, 128, 83, - 11, 14, 168, 2, 142, 51, 201, 40, 227, 172, - 50, 220, 152, 131, 141, 114, 243, 204, 195, 165, - 57, 252, 32, 80, 225, 12, 60, 144, 160, 0, - 63, 252, 40, 160, 0, 3, 42, 252, 96, 138, - 3, 14, 240, 243, 13, 55, 21, 208, 32, 3, - 4, 25, 166, 3, 47, 14, 185, 212, 43, 202, - 47, 161, 152, 2, 231, 3, 60, 240, 16, 132, - 2, 53, 24, 16, 79, 13, 10, 180, 194, 74, - 43, 154, 136, 82, 1, 16, 16, 52, 76, 207, - 40, 244, 124, 211, 202, 50, 188, 180, 114, 197, - 28, 138, 196, 145, 70, 30, 107, 128, 129, 134, - 31, 121, 96, 167, 134, 31, 110, 92, 33, 200, - 29, 133, 44, 66, 200, 36, 113, 16, 241, 130, - 11, 39, 160, 39, 211, 97, 38, 140, 48, 66, - 9, 27, 20, 195, 204, 206, 215, 144, 67, 78, - 52, 209, 144, 3, 13, 51, 233, 224, 32, 3, - 2, 242, 152, 163, 13, 55, 213, 50, 192, 143, - 3, 22, 218, 51, 205, 52, 206, 128, 67, 15, - 14, 64, 228, 242, 202, 40, 92, 143, 130, 206, - 52, 212, 52, 227, 202, 44, 178, 148, 29, 75, - 44, 193, 8, 147, 76, 170, 164, 144, 194, 203, - 219, 157, 108, 178, 9, 38, 110, 116, 33, 70, - 162, 162, 20, 3, 113, 215, 153, 216, 255, 178, - 201, 28, 134, 204, 113, 73, 32, 140, 64, 82, - 8, 35, 140, 80, 210, 200, 36, 136, 20, 242, - 135, 26, 227, 248, 19, 195, 11, 48, 12, 86, - 24, 76, 54, 81, 84, 101, 6, 27, 72, 128, - 3, 4, 244, 76, 35, 15, 46, 206, 104, 147, - 76, 50, 34, 142, 56, 139, 43, 157, 22, 19, - 141, 54, 216, 60, 60, 141, 61, 246, 96, 243, - 77, 56, 181, 240, 226, 246, 219, 164, 44, 221, - 205, 51, 226, 180, 226, 11, 39, 115, 136, 113, - 135, 31, 119, 220, 161, 71, 30, 121, 44, 255, - 135, 32, 109, 216, 33, 189, 29, 112, 220, 65, - 8, 33, 214, 223, 113, 5, 17, 49, 76, 254, - 114, 229, 150, 95, 46, 254, 248, 46, 177, 244, - 16, 68, 18, 69, 164, 254, 10, 236, 179, 228, - 254, 251, 13, 185, 180, 208, 9, 244, 199, 44, - 255, 253, 46, 141, 175, 255, 254, 5, 49, 4, - 81, 205, 32, 232, 192, 6, 116, 178, 19, 158, - 244, 36, 8, 65, 96, 194, 19, 206, 178, 4, - 41, 84, 193, 10, 112, 129, 32, 4, 151, 0, - 7, 59, 124, 65, 13, 96, 104, 194, 89, 132, - 96, 4, 37, 60, 225, 11, 95, 120, 194, 21, - 138, 144, 151, 32, 252, 96, 128, 27, 232, 128, - 10, 251, 18, 146, 18, 152, 36, 5, 43, 104, - 137, 204, 248, 119, 57, 20, 132, 32, 5, 137, - 217, 201, 1, 181, 240, 135, 59, 180, 161, 12, - 102, 216, 131, 30, 255, 26, 193, 8, 61, 172, - 97, 16, 135, 56, 132, 35, 20, 65, 134, 42, - 216, 74, 15, 111, 232, 195, 25, 206, 80, 135, - 58, 16, 225, 8, 68, 160, 66, 18, 166, 128, - 5, 44, 132, 225, 64, 173, 25, 135, 24, 199, - 72, 70, 50, 14, 97, 8, 99, 28, 66, 21, - 195, 240, 134, 55, 168, 161, 11, 128, 112, 131, - 21, 216, 208, 7, 55, 168, 97, 74, 95, 96, - 146, 26, 248, 160, 4, 191, 96, 196, 74, 45, - 217, 159, 122, 64, 192, 19, 30, 48, 160, 30, - 103, 114, 7, 110, 18, 64, 5, 39, 96, 97, - 9, 70, 24, 195, 25, 222, 144, 6, 52, 96, - 102, 50, 96, 216, 66, 20, 204, 16, 136, 57, - 128, 225, 17, 125, 56, 66, 21, 197, 113, 138, - 120, 68, 128, 3, 27, 152, 1, 134, 32, 16, - 10, 129, 225, 71, 29, 42, 242, 205, 111, 194, - 145, 143, 117, 228, 35, 28, 183, 216, 197, 46, - 120, 97, 13, 95, 28, 199, 28, 244, 144, 129, - 12, 20, 240, 141, 101, 176, 162, 71, 93, 184, - 130, 24, 194, 16, 135, 49, 144, 161, 14, 94, - 196, 194, 23, 4, 1, 136, 71, 168, 225, 11, - 109, 240, 3, 35, 208, 208, 5, 56, 100, 193, - 102, 37, 185, 82, 76, 56, 199, 19, 126, 232, - 163, 29, 221, 24, 198, 55, 234, 129, 27, 10, - 112, 32, 30, 195, 128, 37, 154, 234, 113, 15, - 2, 220, 227, 0, 241, 136, 7, 0, 78, 33, - 255, 159, 3, 224, 51, 2, 167, 120, 6, 59, - 134, 193, 13, 112, 160, 131, 30, 127, 162, 129, - 66, 9, 37, 129, 7, 48, 64, 1, 246, 16, - 128, 10, 72, 96, 1, 167, 205, 131, 0, 0, - 24, 192, 4, 38, 192, 14, 113, 120, 3, 22, - 214, 192, 148, 166, 106, 81, 141, 119, 24, 52, - 29, 244, 224, 70, 47, 96, 129, 41, 76, 252, - 65, 14, 105, 64, 89, 32, 2, 241, 7, 55, - 60, 98, 13, 85, 88, 66, 21, 226, 240, 6, - 55, 248, 244, 13, 108, 0, 195, 31, 30, 49, - 7, 56, 40, 97, 34, 196, 74, 136, 7, 46, - 176, 1, 4, 76, 3, 27, 92, 194, 6, 55, - 218, 33, 143, 164, 113, 105, 30, 110, 106, 71, - 181, 230, 129, 141, 170, 202, 67, 0, 51, 152, - 168, 5, 4, 32, 0, 218, 69, 72, 25, 216, - 138, 150, 4, 222, 181, 0, 12, 21, 234, 173, - 185, 0, 69, 41, 64, 49, 13, 125, 0, 32, - 2, 144, 106, 135, 1, 28, 106, 131, 1, 8, - 135, 21, 183, 64, 69, 49, 52, 49, 10, 8, - 228, 98, 20, 175, 80, 69, 43, 120, 161, 12, - 88, 156, 34, 8, 89, 152, 27, 37, 244, 160, - 135, 61, 152, 161, 112, 168, 129, 4, 35, 182, - 208, 83, 196, 65, 162, 17, 160, 101, 196, 28, - 156, 192, 130, 152, 197, 132, 102, 25, 1, 65, - 49, 122, 230, 51, 114, 128, 163, 28, 92, 2, - 7, 60, 192, 65, 91, 112, 255, 188, 67, 94, - 160, 179, 7, 184, 194, 197, 128, 7, 40, 160, - 39, 36, 120, 192, 57, 185, 17, 204, 119, 65, - 32, 29, 163, 16, 5, 58, 138, 161, 51, 98, - 16, 3, 24, 209, 152, 198, 61, 250, 241, 11, - 165, 125, 66, 21, 175, 200, 46, 51, 108, 193, - 10, 86, 192, 2, 19, 224, 205, 66, 97, 37, - 48, 3, 178, 134, 130, 31, 18, 106, 5, 41, - 48, 129, 8, 63, 252, 225, 13, 128, 248, 76, - 104, 11, 1, 134, 46, 168, 193, 51, 51, 37, - 4, 28, 248, 208, 61, 202, 133, 175, 48, 40, - 88, 129, 8, 60, 64, 224, 139, 32, 0, 29, - 59, 219, 217, 43, 110, 36, 1, 164, 65, 85, - 27, 16, 214, 70, 53, 170, 161, 13, 85, 228, - 226, 26, 224, 160, 70, 52, 202, 81, 12, 132, - 142, 194, 30, 161, 80, 197, 52, 126, 129, 11, - 92, 40, 227, 22, 181, 168, 197, 42, 86, 204, - 226, 21, 179, 66, 83, 183, 232, 68, 220, 46, - 17, 7, 64, 228, 1, 16, 124, 176, 131, 37, - 34, 145, 137, 72, 88, 194, 18, 116, 240, 49, - 30, 148, 240, 11, 60, 224, 65, 11, 88, 136, - 130, 29, 4, 225, 7, 236, 197, 161, 123, 147, - 131, 217, 127, 105, 56, 179, 134, 124, 224, 36, - 88, 158, 136, 9, 12, 208, 14, 101, 28, 131, - 22, 186, 208, 229, 46, 116, 65, 230, 89, 28, - 195, 21, 174, 56, 134, 52, 104, 145, 170, 93, - 164, 184, 255, 22, 186, 72, 70, 55, 72, 209, - 221, 99, 94, 226, 15, 128, 40, 131, 26, 128, - 148, 6, 63, 44, 162, 16, 126, 190, 195, 28, - 176, 32, 4, 22, 184, 224, 208, 136, 102, 1, - 12, 236, 55, 101, 42, 59, 90, 33, 54, 12, - 1, 68, 40, 114, 179, 11, 8, 16, 133, 5, - 204, 180, 166, 55, 173, 105, 20, 162, 80, 133, - 124, 1, 9, 8, 70, 144, 1, 147, 124, 32, - 134, 249, 123, 180, 170, 9, 98, 19, 19, 224, - 172, 128, 61, 57, 96, 90, 180, 240, 132, 177, - 72, 193, 11, 95, 240, 66, 25, 34, 195, 5, - 77, 10, 201, 10, 81, 136, 66, 26, 170, 144, - 20, 41, 36, 161, 11, 80, 128, 130, 20, 52, - 120, 133, 38, 92, 1, 146, 143, 44, 203, 19, - 52, 131, 6, 45, 104, 161, 10, 197, 203, 66, - 16, 124, 144, 66, 190, 248, 101, 4, 38, 128, - 97, 32, 87, 93, 229, 155, 100, 41, 214, 89, - 184, 66, 23, 192, 112, 21, 51, 128, 1, 12, - 107, 144, 195, 27, 206, 224, 20, 46, 176, 225, - 12, 100, 56, 3, 18, 200, 48, 5, 43, 76, - 1, 9, 253, 54, 195, 22, 146, 144, 132, 8, - 214, 183, 139, 72, 33, 248, 17, 134, 160, 160, - 36, 8, 33, 9, 71, 176, 130, 17, 176, 160, - 160, 58, 80, 33, 12, 97, 240, 98, 21, 202, - 192, 60, 55, 212, 202, 129, 106, 248, 195, 31, - 240, 144, 5, 81, 139, 100, 4, 230, 255, 25, - 183, 170, 105, 118, 1, 3, 170, 128, 9, 125, - 176, 204, 26, 222, 64, 134, 62, 128, 193, 12, - 133, 128, 4, 36, 160, 232, 8, 74, 84, 66, - 52, 138, 8, 68, 37, 200, 96, 133, 46, 36, - 97, 42, 75, 240, 226, 129, 18, 144, 0, 216, - 68, 64, 145, 186, 17, 7, 110, 130, 35, 117, - 113, 88, 221, 56, 197, 17, 7, 62, 234, 17, - 208, 117, 120, 162, 138, 88, 152, 195, 27, 212, - 82, 5, 47, 50, 40, 17, 108, 48, 66, 176, - 193, 224, 83, 43, 44, 161, 143, 34, 193, 72, - 96, 102, 8, 224, 15, 152, 64, 49, 47, 199, - 130, 34, 180, 64, 240, 55, 228, 186, 223, 51, - 13, 4, 27, 226, 8, 6, 43, 152, 65, 13, - 148, 96, 158, 25, 244, 64, 137, 71, 84, 98, - 232, 85, 92, 122, 211, 125, 80, 1, 8, 72, - 192, 1, 253, 216, 231, 51, 158, 177, 140, 101, - 244, 198, 55, 38, 242, 134, 110, 132, 147, 141, - 221, 24, 99, 27, 231, 192, 134, 135, 14, 181, - 142, 108, 112, 130, 15, 124, 0, 195, 28, 170, - 128, 7, 67, 188, 161, 11, 145, 140, 3, 30, - 192, 112, 235, 66, 128, 114, 14, 62, 85, 67, - 22, 70, 98, 51, 17, 168, 60, 38, 234, 81, - 140, 3, 218, 65, 159, 1, 12, 0, 31, 206, - 31, 64, 124, 164, 191, 209, 2, 49, 50, 12, - 129, 195, 62, 37, 28, 145, 136, 61, 188, 27, - 16, 138, 8, 131, 255, 39, 158, 81, 15, 125, - 29, 128, 4, 60, 144, 129, 160, 32, 240, 139, - 83, 120, 212, 26, 186, 152, 197, 44, 220, 108, - 141, 223, 164, 105, 29, 225, 144, 134, 138, 87, - 1, 11, 224, 16, 103, 25, 240, 176, 0, 50, - 32, 1, 250, 240, 13, 116, 198, 9, 138, 160, - 8, 82, 212, 7, 142, 208, 8, 240, 5, 8, - 91, 16, 77, 31, 147, 7, 123, 48, 8, 63, - 114, 71, 82, 160, 5, 53, 224, 1, 165, 38, - 78, 9, 145, 2, 132, 164, 2, 14, 160, 15, - 247, 80, 15, 234, 0, 0, 254, 244, 30, 239, - 129, 15, 235, 112, 31, 40, 232, 79, 255, 145, - 130, 239, 209, 0, 250, 209, 116, 79, 247, 12, - 173, 0, 45, 216, 112, 94, 21, 32, 76, 52, - 80, 40, 11, 32, 0, 232, 183, 86, 60, 192, - 1, 51, 80, 1, 230, 112, 14, 245, 80, 75, - 7, 80, 41, 188, 113, 14, 117, 98, 87, 236, - 96, 12, 231, 240, 14, 183, 37, 3, 14, 240, - 13, 195, 0, 11, 156, 80, 7, 65, 119, 7, - 107, 16, 134, 80, 81, 43, 90, 48, 29, 86, - 208, 4, 79, 176, 4, 73, 128, 5, 12, 18, - 7, 93, 128, 103, 128, 64, 37, 19, 17, 2, - 48, 241, 106, 246, 48, 15, 220, 48, 85, 221, - 80, 75, 47, 104, 0, 246, 100, 130, 234, 16, - 136, 245, 240, 13, 4, 128, 72, 136, 4, 39, - 249, 244, 30, 167, 16, 80, 173, 160, 39, 204, - 255, 208, 97, 244, 48, 47, 110, 149, 3, 161, - 160, 15, 12, 16, 10, 184, 0, 14, 57, 178, - 87, 6, 240, 40, 240, 209, 0, 9, 160, 27, - 217, 96, 12, 47, 150, 98, 183, 32, 91, 6, - 69, 15, 161, 160, 13, 43, 101, 13, 166, 194, - 9, 127, 80, 6, 185, 242, 7, 209, 81, 95, - 99, 224, 6, 96, 80, 71, 144, 0, 8, 156, - 225, 7, 136, 192, 8, 133, 80, 8, 147, 128, - 7, 98, 160, 62, 88, 210, 1, 36, 32, 15, - 93, 101, 14, 76, 131, 46, 1, 128, 85, 76, - 195, 13, 223, 208, 13, 89, 69, 97, 75, 147, - 135, 243, 16, 46, 223, 130, 94, 250, 212, 14, - 182, 144, 12, 224, 192, 13, 246, 176, 48, 185, - 144, 3, 10, 5, 87, 138, 130, 11, 165, 208, - 14, 216, 192, 15, 158, 8, 131, 254, 228, 135, - 219, 48, 138, 154, 18, 12, 203, 149, 93, 185, - 160, 10, 197, 80, 10, 188, 32, 13, 183, 64, - 10, 159, 240, 9, 155, 112, 9, 88, 96, 95, - 127, 128, 8, 128, 64, 9, 110, 224, 73, 119, - 116, 65, 128, 16, 8, 111, 48, 83, 107, 160, - 6, 110, 16, 7, 87, 176, 16, 43, 0, 19, - 34, 0, 2, 23, 96, 1, 175, 85, 14, 18, - 150, 135, 220, 208, 85, 246, 240, 37, 250, 176, - 85, 252, 208, 85, 14, 176, 24, 60, 160, 2, - 22, 224, 3, 223, 130, 46, 34, 104, 10, 237, - 160, 91, 121, 72, 15, 52, 255, 208, 48, 24, - 66, 40, 111, 149, 3, 137, 165, 44, 166, 32, - 31, 100, 146, 2, 55, 80, 148, 69, 41, 2, - 28, 224, 13, 172, 48, 12, 161, 144, 14, 2, - 80, 121, 199, 149, 14, 197, 80, 76, 202, 192, - 11, 219, 16, 15, 98, 112, 9, 52, 246, 7, - 123, 144, 6, 128, 118, 144, 214, 67, 8, 146, - 240, 103, 41, 227, 7, 147, 0, 90, 110, 96, - 8, 48, 224, 2, 149, 131, 57, 136, 17, 18, - 22, 112, 13, 61, 19, 13, 206, 128, 12, 180, - 208, 11, 218, 160, 52, 218, 224, 12, 229, 80, - 14, 180, 85, 35, 228, 53, 3, 14, 176, 141, - 227, 226, 80, 60, 176, 1, 15, 240, 0, 6, - 96, 10, 221, 32, 15, 238, 98, 33, 199, 53, - 10, 122, 163, 10, 215, 64, 13, 150, 41, 0, - 181, 17, 133, 9, 229, 147, 163, 32, 0, 8, - 48, 12, 152, 2, 144, 116, 0, 1, 57, 73, - 154, 195, 228, 0, 2, 160, 15, 19, 67, 10, - 131, 67, 9, 87, 177, 7, 123, 80, 77, 111, - 224, 8, 144, 144, 7, 53, 101, 8, 124, 48, - 9, 219, 20, 56, 112, 48, 4, 147, 3, 62, - 85, 38, 2, 228, 177, 1, 232, 112, 13, 239, - 48, 151, 64, 227, 51, 209, 208, 12, 209, 0, - 13, 183, 5, 58, 216, 96, 45, 237, 200, 15, - 12, 240, 80, 51, 32, 3, 62, 192, 15, 214, - 34, 15, 13, 83, 121, 90, 83, 12, 202, 53, - 13, 163, 255, 64, 13, 192, 112, 54, 177, 0, - 12, 194, 80, 10, 216, 160, 13, 182, 160, 12, - 189, 208, 13, 221, 192, 13, 202, 176, 12, 176, - 64, 10, 189, 128, 9, 131, 131, 7, 116, 80, - 1, 8, 37, 10, 252, 80, 86, 252, 16, 10, - 159, 192, 11, 46, 197, 49, 114, 0, 8, 135, - 3, 9, 139, 48, 9, 133, 224, 21, 149, 224, - 8, 241, 181, 43, 145, 19, 3, 82, 70, 62, - 118, 103, 51, 55, 115, 96, 59, 3, 13, 203, - 73, 14, 204, 64, 13, 185, 0, 1, 21, 80, - 146, 15, 6, 97, 210, 34, 15, 246, 0, 1, - 175, 48, 13, 215, 144, 12, 168, 0, 14, 185, - 80, 1, 135, 53, 59, 162, 240, 41, 37, 230, - 10, 186, 144, 10, 241, 39, 127, 242, 151, 10, - 62, 186, 10, 165, 184, 11, 255, 120, 9, 128, - 3, 7, 94, 128, 7, 63, 102, 9, 91, 147, - 11, 74, 90, 47, 154, 16, 144, 151, 192, 76, - 110, 224, 5, 199, 115, 61, 132, 80, 8, 136, - 32, 8, 152, 16, 3, 146, 227, 95, 116, 183, - 63, 54, 116, 101, 25, 48, 166, 22, 97, 1, - 239, 0, 13, 208, 64, 13, 2, 88, 1, 211, - 0, 14, 184, 16, 97, 220, 80, 13, 200, 128, - 12, 105, 179, 51, 197, 128, 14, 37, 54, 13, - 197, 128, 13, 216, 80, 12, 211, 96, 14, 206, - 82, 13, 243, 208, 11, 111, 86, 168, 100, 70, - 11, 164, 176, 13, 235, 149, 155, 127, 255, 22, - 8, 123, 144, 7, 32, 115, 7, 58, 86, 65, - 59, 38, 6, 150, 96, 7, 133, 144, 7, 180, - 134, 7, 112, 80, 65, 112, 112, 5, 84, 208, - 95, 47, 99, 63, 228, 150, 16, 54, 180, 2, - 18, 81, 37, 85, 2, 2, 168, 9, 15, 84, - 83, 151, 199, 112, 12, 97, 166, 75, 179, 128, - 12, 182, 80, 53, 180, 101, 15, 163, 144, 14, - 175, 0, 13, 164, 35, 97, 182, 80, 13, 201, - 160, 54, 170, 96, 15, 158, 48, 60, 156, 192, - 154, 142, 17, 43, 84, 10, 50, 138, 195, 8, - 136, 112, 7, 15, 249, 7, 142, 35, 6, 69, - 144, 0, 47, 144, 173, 47, 195, 150, 242, 83, - 170, 252, 83, 62, 15, 33, 17, 89, 166, 62, - 234, 83, 38, 240, 233, 44, 115, 202, 102, 119, - 169, 12, 233, 52, 12, 164, 112, 42, 156, 144, - 172, 115, 195, 7, 196, 120, 5, 35, 196, 1, - 43, 112, 2, 48, 192, 2, 252, 218, 175, 138, - 70, 63, 248, 227, 173, 2, 59, 176, 4, 91, - 176, 4, 203, 16, 146, 118, 101, 20, 113, 17, - 33, 1, 106, 158, 246, 176, 16, 59, 64, 160, - 22, 106, 162, 54, 18, 165, 134, 18, 167, 38, - 67, 95, 106, 176, 43, 23, 166, 169, 58, 2, - 1, 52, 64, 156, 182, 19, 63, 240, 3, 144, - 197, 4, 40, 91, 4, 205, 214, 4, 70, 134, - 7, 213, 70, 7, 89, 16, 179, 8, 52, 179, - 5, 244, 105, 43, 255, 84, 177, 37, 145, 114, - 50, 196, 177, 250, 147, 57, 32, 43, 178, 176, - 166, 2, 8, 196, 4, 103, 17, 5, 98, 225, - 111, 70, 224, 111, 78, 49, 21, 68, 177, 5, - 253, 6, 66, 77, 240, 110, 98, 1, 73, 144, - 116, 22, 70, 112, 22, 88, 80, 4, 105, 241, - 5, 90, 32, 6, 40, 123, 66, 221, 214, 1, - 21, 107, 106, 59, 203, 179, 166, 106, 67, 230, - 70, 64, 177, 22, 4, 74, 80, 4, 75, 48, - 29, 106, 0, 5, 74, 97, 180, 98, 33, 5, - 239, 102, 6, 142, 80, 20, 85, 128, 4, 91, - 176, 5, 96, 144, 7, 2, 39, 36, 154, 4, - 5, 93, 240, 64, 80, 96, 109, 118, 115, 5, - 73, 178, 22, 5, 169, 5, 77, 224, 64, 108, - 224, 6, 95, 192, 77, 77, 192, 4, 63, 176, - 66, 126, 68, 182, 27, 123, 176, 55, 132, 19, - 120, 39, 180, 98, 224, 83, 81, 112, 115, 141, - 32, 21, 72, 128, 4, 73, 161, 180, 78, 27, - 112, 108, 208, 107, 92, 224, 110, 68, 17, 108, - 107, 231, 6, 15, 148, 4, 85, 96, 4, 70, - 112, 4, 99, 128, 187, 75, 112, 5, 85, 208, - 5, 144, 148, 4, 73, 7, 73, 85, 80, 188, - 93, 32, 5, 106, 48, 20, 122, 166, 110, 180, - 198, 4, 98, 155, 185, 41, 112, 124, 222, 122, - 24, 194, 249, 185, 89, 128, 7, 119, 192, 118, - 111, 112, 21, 148, 101, 6, 114, 128, 111, 135, - 255, 192, 6, 83, 176, 113, 107, 80, 9, 248, - 198, 111, 99, 48, 6, 10, 114, 4, 91, 20, - 108, 17, 148, 113, 78, 64, 5, 173, 113, 70, - 103, 52, 14, 244, 171, 70, 9, 114, 32, 174, - 161, 187, 72, 210, 7, 113, 128, 6, 104, 64, - 43, 96, 48, 73, 238, 246, 7, 104, 208, 169, - 67, 102, 114, 37, 224, 1, 115, 183, 185, 61, - 171, 30, 37, 160, 67, 229, 2, 20, 86, 16, - 124, 94, 144, 7, 144, 192, 189, 107, 144, 8, - 149, 112, 8, 149, 192, 8, 131, 144, 111, 108, - 96, 6, 128, 203, 73, 129, 48, 6, 117, 224, - 26, 96, 68, 5, 44, 76, 4, 86, 247, 194, - 48, 252, 194, 99, 148, 117, 49, 44, 14, 117, - 144, 111, 61, 5, 6, 119, 176, 103, 115, 16, - 7, 113, 96, 5, 70, 98, 109, 122, 6, 6, - 85, 112, 5, 62, 208, 66, 11, 108, 124, 14, - 76, 24, 135, 65, 78, 7, 36, 6, 192, 71, - 192, 115, 16, 6, 99, 192, 83, 101, 112, 61, - 140, 176, 189, 141, 240, 115, 69, 81, 77, 131, - 208, 70, 91, 64, 108, 235, 187, 116, 17, 96, - 3, 253, 96, 74, 185, 49, 117, 193, 33, 122, - 187, 49, 28, 190, 84, 28, 217, 176, 14, 90, - 53, 15, 221, 224, 117, 23, 7, 23, 103, 145, - 83, 108, 24, 8, 141, 16, 8, 112, 145, 29, - 121, 224, 21, 4, 231, 4, 71, 140, 17, 40, - 231, 129, 53, 132, 24, 138, 255, 193, 24, 129, - 128, 6, 74, 49, 145, 78, 97, 5, 129, 144, - 6, 101, 240, 35, 108, 48, 145, 27, 51, 9, - 147, 16, 8, 114, 192, 120, 73, 116, 8, 17, - 57, 6, 96, 212, 116, 54, 160, 0, 168, 137, - 121, 155, 39, 80, 191, 241, 121, 167, 247, 27, - 193, 225, 198, 190, 116, 28, 231, 32, 15, 163, - 128, 0, 252, 48, 12, 174, 71, 164, 111, 52, - 29, 93, 224, 6, 129, 128, 8, 104, 144, 129, - 106, 224, 5, 177, 82, 6, 52, 23, 7, 101, - 0, 6, 69, 96, 200, 40, 39, 189, 167, 101, - 44, 120, 247, 0, 0, 224, 14, 158, 224, 4, - 78, 16, 113, 90, 0, 7, 101, 208, 5, 81, - 160, 8, 131, 176, 6, 94, 225, 20, 112, 116, - 160, 187, 6, 6, 15, 105, 129, 207, 100, 69, - 238, 16, 1, 19, 160, 1, 60, 112, 33, 11, - 96, 15, 103, 76, 31, 129, 184, 14, 190, 81, - 127, 225, 176, 14, 250, 188, 14, 219, 96, 13, - 253, 39, 28, 222, 16, 14, 230, 144, 14, 52, - 80, 1, 234, 194, 9, 172, 224, 9, 134, 176, - 71, 124, 16, 56, 16, 84, 7, 99, 48, 7, - 121, 148, 21, 140, 80, 9, 134, 16, 43, 122, - 160, 6, 222, 68, 124, 30, 16, 189, 52, 113, - 24, 30, 96, 64, 10, 80, 15, 206, 135, 31, - 80, 151, 0, 226, 64, 4, 6, 66, 4, 117, - 16, 7, 197, 107, 206, 243, 118, 6, 108, 192, - 6, 135, 255, 144, 8, 246, 21, 8, 125, 128, - 194, 164, 116, 15, 253, 81, 3, 233, 183, 74, - 242, 12, 117, 234, 224, 143, 32, 85, 127, 43, - 34, 38, 249, 231, 102, 181, 16, 82, 110, 252, - 13, 145, 40, 3, 2, 192, 152, 164, 136, 128, - 61, 124, 36, 103, 16, 8, 124, 208, 5, 125, - 112, 181, 104, 240, 8, 179, 34, 204, 118, 209, - 5, 214, 166, 4, 5, 166, 196, 167, 245, 1, - 35, 96, 64, 191, 64, 136, 239, 65, 31, 25, - 181, 130, 3, 128, 130, 241, 209, 0, 27, 197, - 116, 141, 132, 5, 115, 68, 111, 83, 16, 5, - 110, 160, 8, 84, 224, 14, 195, 96, 10, 140, - 226, 211, 63, 141, 53, 250, 160, 31, 245, 160, - 12, 96, 70, 102, 66, 250, 27, 40, 162, 34, - 210, 160, 11, 181, 16, 14, 74, 72, 0, 237, - 16, 208, 1, 184, 0, 21, 240, 0, 119, 98, - 12, 61, 226, 35, 145, 27, 95, 224, 252, 7, - 101, 23, 6, 87, 32, 5, 101, 112, 56, 56, - 214, 5, 115, 144, 21, 95, 192, 7, 59, 112, - 177, 206, 76, 16, 136, 97, 64, 5, 184, 78, - 51, 232, 14, 234, 224, 30, 238, 208, 130, 248, - 48, 215, 28, 96, 3, 24, 161, 1, 28, 16, - 31, 5, 98, 125, 140, 52, 126, 4, 245, 11, - 230, 4, 86, 50, 48, 40, 56, 242, 0, 8, - 240, 10, 50, 128, 1, 19, 64, 15, 184, 144, - 12, 210, 112, 14, 180, 148, 34, 252, 255, 28, - 14, 223, 64, 48, 54, 160, 1, 253, 176, 14, - 234, 112, 167, 16, 48, 76, 247, 112, 10, 92, - 88, 7, 190, 2, 68, 198, 187, 21, 61, 213, - 70, 86, 0, 5, 112, 80, 134, 77, 144, 113, - 87, 240, 4, 115, 176, 36, 59, 80, 17, 30, - 157, 16, 235, 81, 78, 231, 180, 38, 236, 180, - 31, 48, 104, 130, 248, 224, 130, 240, 8, 31, - 42, 152, 136, 52, 152, 0, 250, 161, 14, 220, - 160, 13, 211, 64, 15, 41, 250, 220, 63, 152, - 3, 16, 192, 0, 62, 48, 81, 221, 194, 3, - 97, 165, 15, 220, 224, 221, 148, 50, 122, 219, - 160, 14, 189, 176, 13, 221, 85, 11, 202, 112, - 156, 232, 0, 58, 140, 201, 82, 156, 112, 9, - 118, 241, 7, 107, 96, 6, 97, 152, 7, 122, - 38, 214, 88, 155, 4, 70, 176, 4, 113, 16, - 116, 110, 144, 7, 142, 240, 6, 124, 96, 18, - 230, 1, 19, 35, 160, 19, 14, 128, 135, 232, - 4, 75, 244, 180, 206, 145, 162, 224, 243, 68, - 0, 250, 96, 79, 138, 24, 15, 253, 112, 79, - 137, 248, 12, 238, 240, 12, 202, 160, 13, 215, - 240, 10, 244, 16, 137, 24, 114, 33, 57, 176, - 0, 137, 169, 0, 161, 192, 167, 252, 32, 92, - 113, 110, 38, 0, 64, 32, 184, 145, 13, 189, - 225, 11, 172, 240, 102, 206, 96, 82, 232, 208, - 153, 42, 117, 11, 198, 192, 133, 138, 160, 7, - 96, 0, 7, 132, 255, 16, 8, 87, 16, 204, - 93, 192, 6, 112, 49, 73, 135, 115, 99, 129, - 224, 113, 136, 99, 8, 196, 104, 140, 9, 145, - 37, 224, 176, 15, 251, 16, 0, 1, 160, 15, - 245, 176, 14, 236, 224, 14, 54, 48, 39, 133, - 24, 136, 231, 160, 14, 212, 216, 14, 220, 80, - 39, 223, 192, 211, 60, 125, 0, 112, 114, 15, - 235, 208, 11, 201, 208, 12, 204, 48, 13, 79, - 9, 40, 59, 73, 40, 163, 240, 0, 248, 50, - 13, 184, 32, 33, 142, 162, 130, 254, 212, 0, - 162, 72, 138, 171, 224, 102, 201, 80, 12, 174, - 106, 230, 154, 192, 138, 166, 2, 11, 255, 216, - 7, 253, 237, 5, 251, 149, 29, 123, 22, 114, - 253, 29, 71, 215, 211, 6, 212, 100, 71, 118, - 113, 5, 225, 138, 37, 58, 241, 90, 93, 98, - 14, 242, 224, 0, 1, 32, 141, 141, 82, 128, - 136, 52, 141, 108, 34, 146, 237, 240, 13, 235, - 242, 11, 14, 69, 157, 140, 242, 12, 231, 128, - 12, 201, 160, 10, 230, 16, 81, 134, 21, 40, - 147, 152, 14, 33, 6, 10, 184, 240, 13, 150, - 152, 121, 254, 225, 79, 28, 80, 38, 234, 208, - 207, 153, 178, 10, 199, 240, 136, 206, 158, 11, - 211, 160, 10, 184, 240, 54, 245, 217, 11, 189, - 192, 154, 253, 157, 60, 1, 156, 204, 122, 6, - 192, 101, 32, 114, 68, 124, 95, 131, 48, 233, - 86, 112, 145, 14, 81, 135, 2, 52, 91, 80, - 255, 197, 140, 217, 168, 157, 158, 142, 85, 245, - 62, 239, 209, 114, 45, 213, 194, 15, 98, 53, - 152, 12, 208, 15, 166, 128, 13, 99, 206, 140, - 216, 176, 86, 243, 178, 225, 133, 146, 11, 153, - 80, 10, 165, 144, 137, 191, 48, 41, 40, 104, - 3, 146, 98, 0, 12, 64, 0, 173, 151, 13, - 154, 34, 12, 224, 249, 10, 245, 146, 9, 163, - 176, 241, 189, 32, 13, 176, 96, 10, 116, 32, - 144, 152, 48, 7, 124, 220, 8, 67, 196, 120, - 120, 230, 6, 70, 80, 5, 105, 240, 89, 140, - 208, 199, 128, 96, 8, 201, 68, 63, 116, 152, - 16, 56, 209, 1, 14, 48, 91, 233, 110, 14, - 90, 85, 85, 209, 89, 45, 109, 194, 52, 61, - 143, 46, 14, 208, 47, 20, 101, 202, 246, 128, - 0, 8, 160, 0, 191, 208, 13, 237, 88, 225, - 193, 164, 147, 147, 184, 244, 197, 128, 11, 47, - 26, 148, 192, 205, 1, 26, 96, 51, 38, 192, - 1, 238, 48, 138, 173, 144, 55, 161, 16, 137, - 135, 21, 42, 195, 176, 12, 243, 233, 9, 253, - 144, 5, 224, 165, 49, 129, 64, 89, 193, 168, - 155, 41, 163, 155, 136, 19, 140, 143, 224, 8, - 122, 32, 90, 66, 192, 173, 48, 145, 2, 25, - 209, 1, 246, 208, 151, 206, 80, 13, 207, 18, - 45, 242, 0, 15, 242, 224, 233, 242, 176, 15, - 210, 226, 37, 218, 34, 3, 97, 181, 1, 219, - 56, 152, 59, 113, 15, 255, 255, 201, 15, 121, - 216, 46, 239, 194, 225, 146, 8, 132, 161, 160, - 9, 197, 176, 33, 47, 210, 3, 69, 217, 3, - 30, 112, 3, 31, 160, 3, 28, 224, 9, 7, - 243, 11, 162, 240, 148, 12, 3, 1, 136, 133, - 13, 234, 48, 49, 203, 0, 16, 167, 174, 24, - 122, 20, 167, 140, 25, 51, 82, 180, 228, 249, - 51, 73, 16, 33, 66, 139, 238, 220, 241, 131, - 72, 210, 34, 69, 113, 176, 188, 112, 1, 3, - 69, 1, 144, 33, 69, 134, 16, 1, 2, 196, - 5, 122, 240, 162, 149, 171, 166, 140, 22, 173, - 106, 230, 180, 105, 195, 5, 206, 38, 184, 105, - 244, 36, 200, 152, 49, 67, 133, 143, 7, 12, - 248, 41, 80, 208, 66, 197, 15, 125, 10, 30, - 252, 234, 246, 75, 6, 79, 8, 16, 70, 165, - 27, 5, 33, 29, 58, 106, 89, 237, 153, 234, - 103, 128, 43, 132, 92, 185, 94, 137, 18, 245, - 42, 199, 43, 94, 198, 54, 137, 17, 5, 65, - 6, 14, 184, 244, 66, 1, 177, 119, 239, 25, - 47, 82, 151, 2, 41, 234, 99, 6, 208, 27, - 64, 128, 204, 232, 41, 148, 199, 144, 33, 76, - 98, 4, 49, 98, 244, 231, 15, 31, 44, 49, - 56, 162, 248, 40, 210, 114, 1, 146, 37, 76, - 34, 184, 70, 14, 92, 180, 104, 206, 170, 85, - 227, 86, 206, 28, 54, 112, 229, 202, 129, 131, - 71, 79, 167, 0, 7, 10, 134, 18, 13, 170, - 162, 133, 255, 133, 26, 250, 190, 181, 179, 199, - 83, 2, 13, 169, 162, 138, 161, 83, 5, 45, - 43, 180, 98, 14, 226, 245, 211, 247, 75, 159, - 61, 171, 163, 94, 77, 211, 183, 141, 21, 172, - 86, 152, 240, 136, 2, 238, 91, 128, 130, 80, - 252, 134, 145, 34, 133, 105, 18, 163, 70, 122, - 242, 228, 41, 212, 200, 81, 35, 70, 128, 212, - 252, 9, 164, 87, 207, 29, 52, 127, 34, 79, - 174, 124, 217, 114, 136, 20, 70, 40, 161, 132, - 11, 138, 185, 230, 64, 112, 200, 33, 231, 154, - 104, 22, 76, 173, 65, 116, 22, 88, 32, 29, - 123, 230, 249, 133, 31, 126, 24, 8, 74, 129, - 25, 100, 216, 128, 1, 125, 184, 153, 39, 29, - 28, 128, 136, 110, 20, 81, 208, 41, 230, 21, - 106, 128, 113, 17, 152, 102, 126, 233, 231, 23, - 109, 146, 233, 101, 25, 110, 166, 81, 165, 154, - 101, 140, 97, 165, 60, 76, 2, 193, 131, 14, - 8, 42, 128, 205, 30, 123, 176, 249, 229, 151, - 94, 202, 35, 228, 14, 51, 222, 152, 195, 141, - 71, 26, 129, 164, 145, 66, 222, 176, 34, 14, - 55, 12, 9, 4, 144, 59, 180, 24, 199, 31, - 254, 252, 51, 19, 133, 21, 76, 16, 176, 132, - 13, 138, 97, 230, 192, 206, 82, 43, 39, 26, - 104, 160, 185, 38, 194, 5, 16, 144, 103, 31, - 115, 230, 153, 39, 67, 6, 20, 224, 65, 6, - 5, 146, 44, 71, 158, 81, 74, 132, 255, 224, - 149, 87, 138, 41, 38, 157, 105, 224, 161, 134, - 24, 89, 100, 137, 229, 210, 96, 154, 81, 165, - 20, 91, 122, 233, 165, 27, 79, 151, 225, 165, - 151, 77, 54, 185, 196, 13, 53, 178, 8, 165, - 152, 80, 70, 9, 197, 30, 81, 94, 45, 133, - 150, 77, 222, 72, 227, 15, 64, 16, 41, 4, - 146, 66, 38, 161, 228, 145, 52, 252, 184, 146, - 145, 60, 248, 24, 83, 50, 143, 250, 51, 211, - 63, 20, 62, 80, 115, 132, 17, 64, 160, 7, - 29, 102, 222, 164, 19, 26, 5, 175, 121, 101, - 129, 10, 16, 72, 82, 38, 63, 255, 180, 167, - 2, 28, 70, 153, 230, 154, 100, 80, 17, 5, - 135, 10, 114, 72, 167, 24, 215, 28, 197, 230, - 154, 96, 102, 209, 101, 150, 89, 42, 149, 5, - 95, 87, 92, 161, 229, 22, 128, 97, 129, 133, - 20, 83, 13, 81, 163, 11, 49, 50, 25, 101, - 97, 233, 194, 178, 196, 146, 82, 62, 193, 164, - 143, 51, 250, 8, 228, 143, 66, 22, 209, 24, - 145, 73, 38, 89, 68, 144, 57, 98, 240, 71, - 50, 22, 40, 91, 246, 228, 144, 154, 21, 193, - 3, 104, 61, 176, 96, 148, 106, 235, 132, 134, - 153, 8, 139, 180, 71, 30, 108, 100, 154, 137, - 27, 115, 204, 1, 103, 148, 92, 222, 97, 176, - 25, 112, 210, 161, 39, 157, 116, 66, 17, 69, - 149, 80, 176, 193, 5, 23, 100, 118, 169, 165, - 150, 84, 170, 174, 255, 186, 150, 85, 86, 97, - 133, 149, 85, 106, 185, 165, 19, 83, 231, 48, - 36, 141, 52, 196, 136, 228, 236, 72, 70, 121, - 248, 225, 92, 52, 249, 228, 19, 67, 230, 184, - 34, 9, 40, 218, 184, 99, 17, 136, 238, 48, - 164, 142, 145, 145, 53, 25, 101, 192, 65, 66, - 1, 64, 19, 60, 48, 220, 131, 22, 232, 169, - 150, 230, 5, 220, 170, 96, 26, 112, 156, 113, - 70, 27, 153, 170, 65, 38, 152, 114, 138, 161, - 230, 154, 81, 174, 41, 7, 23, 10, 229, 145, - 171, 20, 92, 156, 225, 166, 20, 109, 110, 169, - 101, 151, 172, 91, 159, 218, 107, 88, 190, 238, - 4, 19, 74, 2, 9, 36, 141, 245, 242, 128, - 227, 236, 221, 31, 54, 219, 146, 63, 212, 16, - 131, 9, 60, 224, 128, 195, 11, 65, 38, 185, - 3, 143, 33, 98, 144, 236, 133, 146, 255, 14, - 124, 122, 193, 1, 20, 193, 4, 236, 77, 200, - 64, 1, 205, 115, 129, 64, 2, 4, 166, 145, - 71, 103, 203, 145, 57, 230, 24, 87, 130, 137, - 230, 209, 98, 74, 49, 71, 20, 20, 53, 153, - 6, 27, 110, 90, 89, 230, 156, 94, 98, 191, - 197, 26, 99, 72, 225, 69, 25, 82, 136, 195, - 19, 156, 240, 196, 28, 212, 112, 7, 66, 180, - 193, 15, 234, 201, 131, 31, 10, 193, 7, 59, - 192, 193, 14, 118, 160, 195, 217, 4, 129, 183, - 50, 116, 161, 12, 248, 249, 2, 21, 156, 247, - 255, 2, 142, 36, 75, 89, 212, 35, 97, 245, - 86, 144, 130, 235, 101, 207, 4, 37, 80, 193, - 12, 232, 49, 13, 92, 168, 166, 70, 193, 56, - 134, 189, 116, 161, 11, 87, 52, 163, 38, 224, - 192, 134, 210, 80, 100, 52, 92, 104, 3, 25, - 203, 216, 134, 167, 180, 17, 141, 106, 21, 195, - 20, 167, 128, 5, 43, 124, 17, 6, 60, 104, - 1, 12, 106, 64, 67, 33, 172, 248, 136, 65, - 252, 161, 13, 118, 104, 3, 28, 240, 224, 24, - 47, 108, 209, 14, 87, 24, 2, 8, 65, 216, - 145, 19, 80, 102, 132, 37, 100, 163, 72, 6, - 119, 194, 20, 154, 64, 4, 115, 92, 33, 3, - 176, 225, 140, 100, 152, 79, 23, 187, 216, 133, - 213, 110, 152, 62, 97, 36, 35, 25, 194, 24, - 90, 75, 104, 129, 175, 89, 184, 2, 28, 161, - 248, 133, 47, 124, 193, 138, 75, 240, 97, 14, - 95, 248, 2, 26, 208, 224, 5, 4, 34, 34, - 15, 140, 128, 196, 36, 16, 241, 135, 57, 204, - 1, 11, 68, 112, 129, 25, 93, 224, 2, 22, - 164, 81, 141, 109, 100, 101, 224, 40, 19, 130, - 21, 124, 0, 133, 115, 164, 101, 45, 15, 80, - 15, 252, 29, 50, 95, 250, 146, 197, 49, 164, - 113, 195, 170, 173, 2, 59, 195, 88, 135, 19, - 183, 198, 9, 78, 24, 226, 15, 183, 242, 131, - 32, 208, 128, 8, 63, 252, 225, 10, 88, 16, - 2, 11, 78, 121, 77, 22, 79, 176, 0, 6, - 170, 84, 227, 26, 91, 249, 77, 192, 169, 49, - 4, 176, 148, 229, 44, 231, 152, 2, 116, 166, - 51, 5, 31, 88, 193, 10, 198, 25, 130, 110, - 198, 83, 158, 40, 56, 1, 12, 236, 121, 79, - 124, 158, 128, 155, 241, 4, 103, 63, 253, 153, - 50, 113, 190, 51, 150, 229, 68, 39, 59, 219, - 121, 80, 132, 38, 244, 160, 239, 100, 232, 56, - 249, 249, 207, 233, 5, 4, 0, 59 ); - -implementation - -end. - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: logos.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit logos; + +interface + +const + CONTEXT_TYPE_IMAGE_GIF = 'Content-Type: image/gif'; + + zend_logo: array [0..4439] of byte = ( + 71, 73, 70, 56, 57, 97, 100, 0, 58, 0, + 247, 255, 0, 255, 255, 255, 8, 8, 8, 24, + 24, 24, 57, 57, 57, 74, 74, 74, 90, 90, + 90, 99, 99, 99, 123, 123, 123, 132, 132, 132, + 140, 140, 140, 148, 148, 148, 189, 189, 189, 214, + 214, 214, 231, 231, 231, 239, 239, 239, 90, 99, + 99, 222, 231, 239, 57, 66, 74, 165, 173, 181, + 0, 8, 16, 214, 222, 231, 57, 66, 82, 16, + 33, 66, 0, 8, 24, 24, 41, 82, 222, 231, + 255, 57, 66, 90, 198, 206, 231, 181, 189, 214, + 99, 107, 132, 0, 8, 33, 189, 198, 231, 123, + 132, 165, 148, 165, 231, 123, 140, 206, 123, 148, + 239, 49, 66, 132, 24, 33, 66, 49, 74, 165, + 214, 222, 255, 206, 214, 247, 181, 189, 222, 148, + 156, 189, 123, 132, 173, 156, 173, 247, 132, 148, + 214, 99, 115, 181, 49, 57, 90, 41, 49, 82, + 90, 107, 181, 82, 99, 173, 24, 33, 74, 57, + 82, 189, 49, 74, 173, 16, 24, 57, 8, 16, + 49, 198, 206, 247, 181, 189, 231, 165, 173, 214, + 99, 107, 148, 74, 82, 123, 140, 156, 239, 66, + 74, 115, 115, 132, 222, 41, 49, 90, 57, 74, + 165, 49, 66, 148, 49, 66, 156, 41, 57, 140, + 57, 82, 206, 33, 49, 123, 57, 82, 214, 16, + 24, 66, 198, 206, 255, 181, 189, 239, 189, 198, + 255, 156, 165, 214, 140, 148, 198, 132, 140, 189, + 115, 123, 173, 90, 99, 148, 132, 148, 247, 123, + 140, 239, 107, 123, 214, 115, 132, 231, 57, 66, + 115, 107, 123, 222, 115, 132, 239, 57, 66, 123, + 99, 115, 214, 90, 107, 214, 74, 90, 181, 74, + 90, 189, 66, 82, 173, 57, 74, 173, 49, 66, + 165, 66, 90, 231, 49, 66, 173, 24, 33, 90, + 41, 57, 156, 33, 49, 140, 8, 16, 66, 181, + 189, 247, 165, 173, 231, 148, 156, 214, 132, 140, + 198, 115, 123, 181, 82, 90, 148, 49, 57, 115, + 99, 115, 231, 90, 107, 231, 82, 99, 214, 82, + 99, 222, 74, 90, 206, 82, 99, 231, 66, 82, + 189, 33, 41, 99, 57, 74, 189, 57, 74, 198, + 57, 74, 206, 49, 66, 181, 41, 57, 165, 24, + 33, 99, 16, 24, 82, 8, 16, 74, 173, 181, + 247, 173, 181, 255, 165, 173, 247, 140, 148, 214, + 156, 165, 239, 165, 173, 255, 156, 165, 247, 132, + 140, 214, 140, 148, 231, 99, 107, 173, 107, 115, + 189, 115, 123, 206, 123, 132, 222, 99, 107, 189, + 82, 90, 165, 90, 99, 181, 74, 82, 156, 82, + 90, 173, 90, 99, 189, 66, 74, 140, 57, 66, + 140, 57, 66, 148, 41, 49, 115, 74, 90, 222, + 74, 90, 231, 41, 49, 132, 66, 82, 222, 33, + 41, 115, 33, 41, 123, 24, 33, 107, 24, 33, + 123, 16, 24, 90, 148, 156, 247, 140, 148, 239, + 132, 140, 231, 140, 148, 247, 132, 140, 239, 123, + 132, 231, 107, 115, 206, 123, 132, 239, 123, 132, + 247, 99, 107, 206, 99, 107, 214, 82, 90, 181, + 90, 99, 206, 49, 57, 148, 41, 49, 148, 33, + 41, 140, 239, 239, 247, 247, 247, 255, 198, 198, + 206, 214, 214, 222, 173, 173, 181, 189, 189, 198, + 148, 148, 156, 156, 156, 165, 231, 231, 247, 239, + 239, 255, 173, 173, 189, 90, 90, 99, 231, 231, + 255, 222, 222, 247, 140, 140, 156, 66, 66, 74, + 132, 132, 148, 198, 198, 222, 123, 123, 140, 173, + 173, 198, 107, 107, 123, 222, 222, 255, 57, 57, + 66, 49, 49, 57, 156, 156, 181, 198, 198, 231, + 140, 140, 165, 181, 181, 214, 90, 90, 107, 214, + 214, 255, 165, 165, 198, 82, 82, 99, 123, 123, + 148, 74, 74, 90, 115, 115, 140, 33, 33, 41, + 99, 99, 123, 156, 156, 198, 90, 90, 115, 132, + 132, 173, 173, 173, 231, 165, 165, 222, 24, 24, + 33, 82, 82, 115, 156, 156, 222, 115, 115, 165, + 57, 57, 82, 107, 107, 156, 123, 123, 181, 33, + 33, 49, 156, 156, 231, 82, 82, 123, 49, 49, + 74, 107, 107, 165, 74, 74, 115, 148, 148, 231, + 57, 57, 90, 41, 41, 66, 82, 82, 132, 66, + 66, 107, 132, 132, 214, 140, 140, 231, 99, 99, + 165, 123, 123, 206, 66, 66, 115, 82, 82, 148, + 123, 123, 222, 66, 66, 123, 8, 8, 16, 41, + 41, 82, 49, 49, 99, 24, 24, 49, 41, 41, + 90, 24, 24, 66, 8, 8, 24, 16, 16, 57, + 8, 8, 41, 8, 8, 49, 8, 8, 57, 0, + 0, 8, 0, 0, 16, 0, 0, 24, 0, 0, + 0, 44, 0, 0, 0, 0, 100, 0, 58, 0, + 0, 8, 255, 0, 255, 9, 28, 72, 176, 160, + 193, 131, 8, 19, 42, 92, 200, 176, 161, 195, + 135, 188, 146, 37, 131, 246, 176, 226, 193, 94, + 188, 10, 6, 203, 104, 177, 99, 67, 99, 31, + 140, 25, 75, 230, 177, 227, 200, 130, 39, 75, + 170, 60, 104, 12, 87, 128, 103, 198, 40, 174, + 108, 248, 1, 87, 193, 154, 51, 115, 10, 52, + 198, 236, 31, 175, 15, 196, 124, 246, 58, 150, + 17, 227, 203, 0, 2, 122, 9, 240, 121, 140, + 232, 191, 94, 201, 130, 57, 229, 213, 148, 227, + 63, 103, 199, 96, 218, 36, 104, 172, 89, 47, + 140, 2, 159, 57, 19, 232, 236, 153, 206, 143, + 199, 130, 33, 43, 118, 213, 216, 50, 96, 31, + 4, 24, 139, 230, 204, 152, 179, 100, 198, 4, + 240, 50, 166, 2, 88, 76, 144, 200, 144, 17, + 53, 86, 12, 46, 69, 188, 133, 113, 114, 229, + 11, 55, 104, 49, 14, 1, 226, 113, 56, 118, + 150, 33, 72, 99, 207, 2, 252, 3, 70, 249, + 222, 200, 98, 199, 122, 141, 236, 165, 226, 159, + 138, 98, 206, 150, 113, 240, 92, 44, 192, 215, + 211, 169, 145, 45, 93, 214, 235, 95, 128, 148, + 3, 63, 4, 179, 13, 172, 54, 177, 145, 184, + 140, 5, 173, 172, 176, 37, 87, 146, 255, 70, + 23, 251, 0, 90, 119, 114, 99, 28, 158, 45, + 197, 45, 50, 250, 210, 228, 200, 21, 15, 52, + 254, 175, 169, 192, 99, 129, 41, 19, 255, 231, + 103, 142, 31, 203, 158, 3, 139, 45, 227, 5, + 19, 26, 94, 96, 204, 66, 82, 124, 187, 173, + 236, 94, 244, 255, 150, 173, 103, 159, 177, 24, + 178, 8, 120, 225, 183, 211, 49, 196, 224, 149, + 76, 63, 252, 252, 6, 212, 66, 252, 152, 87, + 145, 57, 30, 176, 132, 156, 64, 208, 112, 0, + 82, 52, 255, 64, 163, 155, 0, 31, 44, 67, + 33, 50, 74, 228, 128, 12, 52, 184, 85, 8, + 24, 69, 208, 32, 35, 18, 78, 14, 254, 19, + 82, 72, 102, 245, 211, 207, 63, 130, 49, 56, + 163, 69, 48, 208, 115, 16, 52, 154, 17, 20, + 0, 49, 215, 253, 131, 75, 60, 255, 108, 227, + 141, 64, 252, 208, 163, 193, 112, 60, 22, 68, + 204, 112, 3, 17, 3, 141, 0, 68, 182, 56, + 37, 49, 247, 8, 116, 207, 5, 117, 89, 117, + 80, 63, 19, 180, 248, 144, 61, 230, 204, 196, + 15, 130, 252, 120, 83, 130, 152, 30, 177, 57, + 80, 63, 30, 168, 224, 97, 66, 112, 186, 217, + 208, 61, 224, 220, 168, 210, 4, 253, 204, 80, + 142, 78, 13, 30, 196, 143, 7, 214, 96, 67, + 103, 62, 122, 90, 196, 79, 59, 24, 204, 212, + 79, 60, 232, 228, 3, 168, 157, 255, 240, 147, + 143, 62, 148, 122, 224, 1, 165, 13, 149, 160, + 205, 13, 156, 50, 228, 79, 62, 80, 72, 170, + 83, 162, 5, 121, 80, 70, 62, 108, 242, 51, + 65, 62, 155, 170, 255, 212, 15, 15, 226, 220, + 224, 15, 159, 97, 226, 10, 230, 174, 97, 54, + 24, 232, 160, 85, 156, 147, 37, 160, 168, 34, + 233, 1, 31, 248, 120, 208, 107, 131, 23, 232, + 147, 44, 167, 215, 228, 115, 77, 177, 72, 222, + 144, 134, 19, 24, 224, 3, 171, 7, 247, 116, + 219, 45, 183, 223, 198, 19, 79, 0, 174, 246, + 67, 135, 33, 166, 2, 122, 129, 160, 249, 240, + 177, 71, 62, 247, 140, 27, 192, 61, 250, 240, + 161, 15, 181, 3, 221, 67, 79, 56, 229, 192, + 96, 14, 168, 3, 241, 19, 128, 7, 108, 4, + 98, 141, 59, 24, 216, 99, 195, 194, 12, 51, + 76, 15, 61, 210, 114, 235, 129, 61, 46, 208, + 17, 79, 168, 22, 249, 211, 42, 63, 55, 136, + 161, 7, 18, 55, 72, 124, 195, 30, 72, 196, + 202, 96, 60, 54, 148, 179, 195, 57, 155, 186, + 26, 207, 61, 54, 72, 130, 130, 25, 138, 68, + 194, 198, 36, 56, 231, 140, 51, 29, 98, 204, + 96, 129, 13, 244, 76, 130, 134, 17, 218, 226, + 235, 209, 5, 254, 20, 196, 207, 61, 248, 232, + 145, 137, 30, 51, 148, 64, 143, 13, 30, 235, + 67, 228, 67, 150, 142, 115, 142, 61, 19, 220, + 35, 173, 13, 108, 120, 146, 203, 18, 158, 88, + 49, 69, 22, 103, 79, 113, 202, 217, 169, 116, + 65, 2, 29, 116, 44, 242, 13, 36, 249, 228, + 179, 79, 62, 73, 43, 250, 101, 132, 72, 242, + 255, 19, 143, 7, 72, 104, 194, 10, 17, 152, + 96, 48, 131, 38, 152, 204, 224, 193, 197, 21, + 45, 61, 79, 19, 240, 212, 51, 3, 6, 24, + 24, 241, 67, 18, 174, 228, 146, 196, 18, 156, + 115, 190, 249, 18, 130, 128, 194, 69, 23, 228, + 152, 33, 9, 61, 209, 210, 83, 198, 13, 23, + 152, 23, 232, 5, 30, 92, 19, 175, 140, 247, + 132, 121, 177, 157, 253, 232, 179, 110, 131, 127, + 95, 51, 3, 38, 171, 124, 177, 138, 17, 70, + 168, 66, 7, 62, 215, 244, 26, 112, 131, 50, + 226, 126, 13, 36, 213, 144, 19, 131, 36, 108, + 64, 50, 133, 31, 185, 0, 0, 128, 43, 220, + 111, 207, 125, 230, 126, 72, 177, 4, 14, 93, + 248, 140, 4, 29, 152, 32, 206, 70, 21, 243, + 200, 83, 78, 57, 219, 208, 115, 65, 60, 176, + 75, 235, 79, 188, 189, 146, 75, 16, 63, 251, + 232, 115, 143, 223, 250, 154, 129, 24, 44, 49, + 4, 46, 60, 162, 17, 142, 24, 67, 61, 44, + 128, 4, 120, 45, 235, 76, 19, 208, 212, 176, + 12, 210, 143, 124, 96, 33, 16, 56, 240, 132, + 41, 136, 113, 13, 1, 64, 163, 131, 83, 10, + 161, 7, 71, 8, 141, 10, 173, 65, 18, 139, + 64, 68, 54, 190, 145, 142, 67, 24, 129, 14, + 51, 136, 161, 13, 22, 39, 174, 111, 105, 10, + 92, 241, 242, 155, 175, 252, 182, 15, 36, 220, + 205, 3, 55, 176, 128, 24, 255, 38, 65, 132, + 24, 112, 224, 131, 196, 88, 132, 17, 48, 161, + 135, 61, 36, 235, 30, 254, 64, 218, 61, 36, + 72, 169, 165, 221, 192, 29, 223, 80, 70, 18, + 130, 212, 144, 3, 228, 226, 15, 102, 248, 195, + 33, 26, 177, 10, 34, 104, 98, 6, 72, 128, + 88, 180, 174, 113, 13, 77, 229, 227, 6, 55, + 88, 216, 195, 110, 208, 70, 111, 141, 235, 101, + 251, 224, 4, 39, 98, 136, 129, 122, 16, 81, + 8, 136, 128, 133, 102, 4, 16, 131, 49, 172, + 34, 19, 154, 216, 195, 221, 46, 85, 55, 88, + 5, 74, 80, 241, 200, 135, 5, 136, 48, 133, + 36, 200, 164, 33, 3, 112, 133, 45, 146, 48, + 10, 35, 120, 12, 19, 155, 96, 162, 24, 12, + 103, 1, 123, 32, 97, 97, 37, 40, 193, 228, + 48, 48, 202, 61, 76, 78, 106, 106, 236, 86, + 62, 108, 160, 7, 77, 100, 2, 19, 153, 176, + 4, 17, 134, 16, 132, 64, 106, 230, 26, 169, + 192, 195, 42, 44, 161, 9, 78, 32, 161, 12, + 251, 184, 193, 182, 254, 87, 197, 8, 218, 0, + 3, 68, 24, 197, 53, 4, 114, 0, 90, 40, + 64, 1, 214, 196, 102, 2, 122, 244, 143, 5, + 0, 224, 15, 93, 152, 68, 61, 244, 64, 7, + 75, 144, 161, 140, 150, 120, 33, 220, 198, 57, + 78, 244, 101, 194, 8, 233, 92, 34, 220, 48, + 144, 74, 160, 77, 13, 3, 182, 36, 3, 17, + 86, 49, 255, 134, 47, 212, 160, 14, 63, 16, + 228, 63, 4, 144, 5, 47, 172, 130, 137, 122, + 68, 22, 188, 186, 165, 49, 133, 136, 139, 30, + 208, 252, 196, 117, 24, 160, 73, 87, 120, 15, + 0, 10, 24, 72, 1, 0, 224, 135, 57, 168, + 179, 156, 252, 12, 131, 72, 195, 96, 130, 49, + 8, 65, 8, 68, 72, 233, 42, 134, 240, 133, + 48, 124, 1, 15, 97, 168, 193, 23, 136, 96, + 137, 121, 174, 18, 19, 68, 24, 67, 30, 90, + 234, 133, 158, 210, 32, 160, 154, 129, 70, 22, + 194, 64, 4, 158, 113, 130, 100, 250, 192, 155, + 140, 16, 148, 16, 129, 121, 109, 18, 159, 176, + 69, 1, 8, 64, 0, 6, 36, 193, 15, 75, + 224, 158, 50, 100, 209, 35, 1, 52, 64, 25, + 169, 136, 196, 11, 49, 161, 203, 49, 132, 1, + 15, 115, 136, 195, 35, 82, 193, 5, 60, 224, + 161, 167, 117, 240, 66, 29, 236, 96, 135, 59, + 164, 53, 21, 143, 216, 66, 35, 134, 64, 4, + 156, 97, 2, 158, 121, 16, 41, 30, 234, 192, + 133, 84, 164, 226, 13, 63, 104, 192, 32, 181, + 16, 6, 98, 138, 225, 168, 253, 83, 214, 163, + 152, 218, 212, 123, 148, 128, 17, 202, 88, 2, + 10, 114, 193, 89, 63, 68, 97, 9, 0, 56, + 65, 18, 134, 49, 16, 90, 184, 226, 10, 38, + 176, 4, 206, 140, 144, 83, 19, 112, 225, 16, + 211, 136, 192, 147, 152, 241, 4, 45, 255, 20, + 225, 8, 69, 200, 130, 26, 180, 112, 132, 31, + 104, 195, 25, 79, 170, 64, 52, 92, 224, 5, + 33, 68, 66, 8, 47, 29, 108, 29, 70, 225, + 4, 102, 12, 131, 24, 195, 152, 70, 44, 130, + 154, 133, 47, 212, 84, 12, 123, 80, 100, 200, + 226, 209, 60, 78, 249, 45, 31, 116, 168, 6, + 14, 78, 225, 136, 69, 40, 34, 11, 109, 16, + 196, 38, 205, 48, 139, 129, 16, 0, 0, 102, + 224, 66, 95, 233, 48, 9, 18, 32, 247, 17, + 29, 224, 162, 64, 152, 33, 2, 74, 180, 161, + 25, 241, 56, 70, 19, 6, 96, 16, 1, 116, + 96, 11, 255, 164, 171, 29, 226, 192, 4, 3, + 112, 83, 32, 93, 29, 170, 37, 244, 128, 93, + 146, 193, 138, 187, 143, 106, 230, 196, 214, 144, + 132, 63, 160, 226, 164, 65, 208, 130, 25, 132, + 225, 7, 65, 80, 96, 154, 3, 109, 64, 46, + 74, 225, 5, 44, 76, 130, 172, 95, 152, 67, + 58, 182, 114, 16, 98, 84, 163, 52, 182, 185, + 218, 65, 162, 17, 135, 34, 220, 246, 13, 41, + 240, 146, 65, 160, 97, 138, 26, 212, 116, 15, + 144, 213, 135, 7, 118, 69, 89, 131, 44, 45, + 31, 51, 88, 135, 25, 112, 80, 8, 68, 168, + 227, 15, 73, 232, 195, 21, 212, 107, 128, 129, + 40, 0, 0, 75, 40, 69, 28, 186, 16, 132, + 71, 152, 226, 19, 228, 216, 141, 64, 226, 97, + 128, 4, 32, 32, 255, 40, 1, 136, 5, 10, + 40, 64, 128, 130, 16, 32, 1, 9, 192, 15, + 63, 156, 112, 132, 75, 196, 161, 15, 248, 129, + 70, 48, 20, 16, 140, 32, 9, 64, 11, 214, + 213, 68, 133, 241, 161, 100, 127, 112, 247, 145, + 78, 134, 147, 13, 230, 97, 8, 52, 152, 193, + 12, 125, 72, 135, 35, 226, 224, 7, 87, 112, + 85, 32, 196, 216, 222, 85, 253, 208, 135, 68, + 252, 128, 173, 77, 232, 17, 47, 24, 144, 1, + 205, 66, 160, 154, 56, 176, 130, 39, 40, 64, + 96, 219, 208, 98, 108, 56, 104, 197, 116, 5, + 130, 11, 55, 92, 34, 20, 18, 24, 136, 1, + 40, 176, 1, 28, 216, 162, 1, 5, 160, 144, + 41, 172, 107, 84, 69, 42, 25, 195, 77, 118, + 114, 0, 250, 225, 53, 123, 204, 67, 156, 154, + 216, 130, 25, 92, 161, 139, 225, 4, 224, 21, + 218, 115, 69, 6, 250, 112, 138, 26, 212, 128, + 6, 90, 232, 242, 63, 136, 225, 128, 64, 248, + 186, 18, 159, 64, 1, 14, 220, 0, 6, 48, + 4, 130, 22, 2, 33, 192, 18, 172, 64, 137, + 74, 80, 1, 5, 25, 29, 168, 40, 42, 145, + 3, 153, 48, 99, 3, 87, 168, 4, 37, 172, + 128, 3, 197, 14, 84, 194, 154, 192, 64, 118, + 35, 203, 221, 71, 51, 200, 101, 23, 160, 135, + 17, 216, 161, 12, 205, 97, 72, 32, 193, 8, + 119, 18, 72, 81, 4, 185, 114, 193, 20, 104, + 255, 144, 137, 2, 62, 144, 182, 44, 200, 65, + 14, 112, 0, 195, 37, 46, 209, 134, 93, 228, + 91, 20, 245, 190, 4, 37, 164, 0, 129, 171, + 165, 193, 10, 183, 128, 48, 7, 124, 61, 243, + 75, 80, 129, 2, 65, 77, 69, 99, 233, 128, + 100, 39, 42, 121, 169, 209, 174, 108, 61, 92, + 96, 134, 19, 152, 161, 19, 77, 24, 136, 0, + 28, 224, 10, 18, 183, 129, 176, 113, 240, 47, + 1, 184, 25, 128, 178, 151, 29, 26, 33, 184, + 132, 204, 213, 238, 6, 155, 255, 131, 0, 35, + 152, 121, 191, 229, 128, 130, 90, 175, 96, 4, + 1, 231, 69, 40, 212, 206, 247, 43, 8, 84, + 0, 203, 46, 234, 99, 157, 173, 172, 71, 99, + 140, 31, 54, 192, 130, 33, 206, 144, 229, 40, + 148, 34, 10, 164, 21, 72, 44, 92, 177, 132, + 78, 148, 66, 10, 140, 95, 66, 20, 164, 32, + 100, 130, 8, 160, 26, 107, 151, 121, 27, 18, + 144, 111, 82, 168, 93, 230, 149, 88, 66, 157, + 255, 177, 130, 30, 32, 64, 32, 5, 104, 131, + 204, 103, 47, 10, 129, 10, 245, 11, 47, 60, + 234, 30, 86, 181, 56, 4, 69, 189, 32, 253, + 192, 64, 19, 86, 152, 142, 31, 156, 162, 13, + 109, 216, 129, 123, 1, 96, 11, 206, 157, 64, + 24, 202, 16, 134, 43, 146, 16, 138, 206, 107, + 253, 12, 106, 127, 185, 27, 174, 224, 118, 2, + 72, 129, 18, 148, 224, 187, 255, 18, 86, 223, + 122, 210, 251, 196, 215, 179, 55, 250, 223, 171, + 251, 194, 236, 42, 116, 201, 221, 69, 72, 60, + 110, 0, 133, 38, 184, 163, 10, 144, 112, 196, + 90, 219, 160, 142, 235, 4, 128, 1, 218, 195, + 124, 87, 245, 7, 125, 80, 11, 40, 16, 10, + 178, 16, 11, 215, 129, 0, 177, 208, 128, 177, + 176, 0, 125, 32, 7, 200, 87, 9, 96, 208, + 118, 55, 151, 126, 151, 96, 6, 228, 23, 10, + 177, 32, 16, 2, 240, 3, 51, 71, 123, 72, + 55, 80, 169, 48, 4, 158, 52, 3, 72, 197, + 45, 59, 36, 40, 212, 118, 14, 58, 208, 14, + 51, 80, 5, 141, 176, 127, 165, 128, 31, 8, + 176, 61, 2, 120, 2, 182, 80, 104, 2, 32, + 1, 161, 48, 2, 102, 160, 110, 5, 96, 117, + 75, 96, 6, 75, 48, 8, 161, 112, 5, 107, + 87, 115, 249, 38, 5, 124, 167, 118, 26, 40, + 16, 43, 112, 116, 87, 19, 13, 49, 199, 119, + 84, 0, 1, 65, 245, 8, 145, 64, 7, 24, + 128, 4, 72, 160, 100, 247, 64, 89, 110, 194, + 60, 215, 112, 14, 213, 176, 14, 238, 112, 8, + 234, 224, 9, 81, 48, 8, 108, 145, 111, 1, + 200, 124, 39, 160, 61, 201, 246, 15, 180, 48, + 8, 143, 183, 0, 3, 17, 12, 74, 112, 5, + 110, 208, 6, 82, 64, 13, 221, 32, 7, 106, + 55, 122, 55, 87, 116, 50, 55, 126, 2, 65, + 13, 116, 255, 103, 126, 252, 176, 3, 68, 39, + 7, 103, 96, 126, 132, 100, 4, 245, 128, 4, + 140, 54, 134, 190, 98, 35, 55, 240, 4, 214, + 128, 3, 40, 160, 12, 186, 32, 12, 181, 112, + 73, 4, 16, 12, 6, 160, 138, 170, 184, 138, + 50, 113, 107, 202, 208, 113, 119, 248, 15, 222, + 16, 12, 218, 192, 13, 117, 22, 15, 210, 0, + 7, 151, 96, 129, 111, 39, 10, 69, 167, 118, + 125, 176, 122, 212, 112, 9, 61, 208, 10, 80, + 18, 1, 59, 0, 2, 191, 16, 121, 235, 22, + 3, 147, 48, 3, 16, 83, 59, 24, 179, 63, + 150, 50, 3, 88, 224, 8, 136, 64, 8, 133, + 208, 1, 21, 65, 11, 39, 240, 7, 161, 240, + 9, 27, 0, 37, 67, 150, 13, 148, 160, 5, + 110, 199, 11, 137, 64, 87, 113, 112, 4, 71, + 16, 133, 255, 0, 2, 151, 0, 7, 31, 240, + 10, 250, 69, 16, 241, 80, 12, 93, 128, 9, + 22, 32, 59, 58, 134, 53, 93, 51, 75, 208, + 164, 6, 22, 65, 11, 61, 64, 3, 65, 16, + 4, 34, 192, 0, 2, 18, 37, 177, 240, 1, + 71, 160, 5, 181, 241, 15, 3, 128, 8, 38, + 240, 79, 62, 86, 13, 28, 1, 2, 240, 152, + 5, 186, 240, 10, 181, 86, 16, 188, 32, 11, + 136, 144, 7, 116, 80, 2, 139, 83, 141, 144, + 228, 1, 244, 64, 2, 128, 48, 11, 5, 96, + 0, 52, 89, 147, 54, 121, 147, 6, 255, 240, + 10, 202, 176, 5, 186, 20, 4, 236, 0, 1, + 177, 96, 0, 3, 80, 66, 5, 64, 11, 13, + 144, 3, 169, 96, 7, 169, 112, 11, 52, 169, + 0, 79, 112, 92, 95, 48, 87, 57, 160, 0, + 52, 169, 2, 115, 32, 87, 89, 176, 1, 174, + 64, 11, 5, 80, 66, 196, 96, 0, 177, 224, + 11, 46, 96, 72, 116, 64, 15, 226, 194, 146, + 210, 70, 15, 144, 208, 7, 228, 160, 3, 27, + 176, 89, 22, 53, 135, 114, 201, 124, 40, 96, + 12, 56, 96, 6, 142, 64, 7, 36, 176, 10, + 143, 144, 13, 40, 160, 11, 181, 80, 11, 20, + 128, 12, 135, 16, 4, 66, 96, 2, 142, 160, + 3, 190, 224, 11, 28, 176, 6, 116, 0, 79, + 253, 36, 2, 34, 97, 12, 78, 32, 4, 67, + 160, 10, 95, 208, 5, 45, 240, 1, 186, 208, + 10, 181, 0, 1, 41, 224, 4, 144, 128, 9, + 100, 165, 7, 55, 240, 63, 109, 130, 50, 139, + 96, 6, 139, 128, 1, 147, 224, 8, 160, 160, + 12, 182, 240, 61, 180, 201, 61, 182, 144, 1, + 127, 224, 8, 70, 32, 4, 132, 240, 7, 144, + 128, 62, 171, 144, 7, 93, 32, 3, 50, 208, + 8, 238, 96, 4, 171, 69, 60, 150, 224, 98, + 243, 64, 7, 64, 0, 55, 172, 69, 4, 40, + 133, 5, 99, 5, 79, 252, 20, 4, 142, 32, + 3, 139, 224, 14, 108, 0, 55, 64, 32, 6, + 233, 211, 64, 97, 255, 98, 17, 55, 48, 15, + 238, 128, 6, 235, 80, 15, 11, 83, 15, 143, + 96, 6, 185, 96, 11, 39, 16, 139, 242, 41, + 159, 89, 150, 8, 150, 16, 53, 24, 192, 8, + 103, 208, 8, 191, 179, 10, 100, 80, 83, 60, + 83, 15, 125, 36, 6, 236, 100, 56, 62, 19, + 67, 98, 0, 55, 152, 96, 83, 148, 163, 160, + 240, 4, 160, 134, 83, 2, 63, 3, 134, 217, + 85, 50, 104, 249, 15, 254, 160, 50, 220, 32, + 14, 24, 112, 49, 94, 35, 6, 138, 176, 4, + 154, 131, 105, 127, 80, 162, 38, 90, 162, 234, + 208, 8, 245, 0, 49, 249, 80, 2, 144, 32, + 2, 104, 132, 75, 122, 64, 74, 11, 99, 1, + 22, 16, 67, 104, 36, 71, 83, 131, 4, 172, + 68, 97, 72, 160, 48, 54, 96, 74, 24, 64, + 78, 154, 64, 97, 51, 0, 52, 209, 178, 45, + 30, 160, 15, 145, 197, 146, 23, 80, 14, 47, + 176, 80, 174, 243, 55, 245, 128, 8, 162, 24, + 8, 228, 64, 8, 234, 176, 165, 92, 170, 14, + 233, 192, 8, 147, 176, 15, 220, 34, 46, 30, + 0, 15, 80, 128, 15, 72, 160, 7, 31, 3, + 71, 215, 160, 76, 55, 128, 15, 101, 112, 74, + 110, 250, 166, 72, 224, 46, 21, 10, 71, 116, + 138, 100, 106, 42, 6, 167, + 4, 43, 221, 34, 47, 211, 6, 68, 254, 131, + 49, 247, 16, 14, 124, 179, 63, 3, 83, 15, + 104, 128, 2, 214, 255, 192, 14, 134, 96, 8, + 235, 16, 169, 146, 186, 14, 80, 128, 14, 42, + 121, 150, 126, 131, 15, 162, 89, 167, 198, 164, + 76, 117, 3, 71, 61, 84, 6, 248, 0, 71, + 111, 116, 3, 117, 154, 93, 36, 163, 45, 111, + 234, 46, 122, 164, 71, 32, 67, 67, 191, 34, + 16, 21, 148, 44, 191, 151, 47, 244, 80, 69, + 247, 0, 5, 74, 144, 6, 231, 208, 14, 47, + 80, 15, 47, 48, 15, 47, 16, 172, 243, 32, + 172, 51, 112, 154, 14, 226, 58, 248, 0, 5, + 108, 80, 161, 154, 114, 1, 223, 114, 41, 73, + 245, 172, 83, 84, 55, 76, 250, 67, 83, 228, + 1, 118, 83, 167, 238, 210, 64, 204, 116, 16, + 23, 208, 72, 173, 243, 37, 183, 218, 84, 51, + 224, 4, 91, 211, 72, 55, 36, 65, 235, 106, + 113, 4, 209, 15, 123, 224, 14, 98, 128, 55, + 227, 178, 67, 13, 18, 38, 228, 66, 46, 190, + 18, 15, 19, 96, 120, 2, 243, 40, 110, 196, + 45, 70, 83, 41, 174, 114, 63, 13, 165, 143, + 215, 16, 42, 30, 176, 3, 232, 176, 146, 249, + 154, 175, 13, 82, 118, 2, 3, 105, 111, 178, + 15, 108, 208, 14, 172, 210, 56, 149, 34, 40, + 145, 193, 93, 88, 179, 52, 209, 54, 176, 2, + 33, 15, 207, 224, 1, 250, 170, 52, 27, 203, + 32, 118, 99, 3, 225, 144, 46, 57, 225, 58, + 23, 138, 36, 227, 137, 53, 227, 240, 2, 140, + 61, 163, 18, 131, 146, 15, 220, 229, 13, 19, + 100, 38, 20, 139, 53, 34, 171, 52, 224, 80, + 14, 181, 90, 17, 21, 212, 58, 253, 48, 45, + 47, 187, 130, 29, 241, 179, 10, 193, 15, 225, + 16, 14, 183, 131, 36, 109, 2, 173, 14, 114, + 179, 12, 225, 58, 78, 102, 175, 109, 226, 32, + 1, 1, 0, 59 ); + + php_logo : array [0..2961] of byte = ( + 71, 73, 70, 56, 57, 97, 130, 0, 67, 0, + 213, 255, 0, 0, 0, 0, 48, 47, 49, 2, + 2, 3, 7, 7, 10, 152, 152, 203, 153, 153, + 204, 150, 150, 200, 147, 147, 195, 3, 3, 4, + 91, 91, 105, 164, 164, 178, 69, 69, 73, 196, + 196, 206, 141, 142, 189, 136, 137, 180, 152, 153, + 187, 101, 103, 134, 126, 129, 172, 176, 178, 205, + 25, 26, 36, 49, 52, 73, 33, 35, 49, 69, + 73, 100, 82, 88, 127, 111, 119, 168, 201, 204, + 221, 81, 95, 159, 85, 99, 163, 97, 105, 147, + 13, 14, 19, 162, 169, 205, 183, 189, 220, 88, + 103, 165, 92, 106, 169, 90, 104, 165, 91, 105, + 166, 95, 110, 172, 102, 115, 174, 93, 105, 158, + 139, 150, 197, 148, 158, 202, 219, 221, 229, 192, + 192, 192, 2, 2, 1, 3, 3, 2, 7, 7, + 6, 15, 15, 14, 133, 133, 131, 152, 152, 151, + 114, 113, 110, 5, 4, 3, 20, 19, 18, 31, + 30, 29, 39, 38, 37, 10, 9, 9, 25, 24, + 24, 61, 60, 60, 183, 183, 183, 81, 81, 81, + 12, 12, 12, 5, 5, 5, 1, 1, 1, 255, + 255, 255, 0, 0, 0, 33, 249, 4, 1, 0, + 0, 42, 0, 44, 0, 0, 0, 0, 130, 0, + 67, 0, 64, 6, 255, 64, 149, 112, 72, 44, + 26, 143, 200, 100, 146, 192, 108, 58, 159, 80, + 130, 114, 74, 173, 90, 175, 70, 130, 225, 112, + 48, 72, 24, 169, 112, 42, 227, 105, 96, 66, + 155, 52, 72, 36, 26, 185, 223, 240, 184, 124, + 78, 15, 185, 69, 38, 14, 100, 15, 73, 236, + 49, 14, 13, 92, 6, 88, 133, 72, 91, 13, + 15, 138, 24, 32, 32, 116, 143, 144, 112, 26, + 30, 48, 0, 150, 150, 59, 25, 140, 145, 156, + 157, 111, 33, 33, 23, 11, 1, 1, 11, 128, + 13, 132, 134, 66, 4, 7, 17, 24, 24, 158, + 35, 27, 31, 9, 151, 150, 51, 9, 49, 186, + 49, 58, 56, 46, 182, 151, 60, 57, 40, 25, + 51, 192, 52, 58, 201, 201, 56, 52, 192, 150, + 45, 12, 17, 62, 49, 192, 59, 185, 187, 9, + 190, 206, 0, 44, 48, 37, 142, 115, 33, 32, + 19, 0, 19, 16, 17, 168, 84, 91, 28, 28, + 38, 177, 27, 39, 57, 43, 192, 48, 30, 27, + 114, 26, 31, 212, 244, 149, 182, 52, 41, 223, + 36, 125, 120, 1, 204, 6, 131, 15, 12, 16, + 0, 123, 241, 65, 3, 190, 15, 253, 108, 197, + 136, 0, 238, 17, 137, 11, 2, 120, 248, 137, + 112, 128, 74, 43, 118, 109, 34, 129, 200, 176, + 96, 155, 73, 75, 60, 22, 228, 72, 129, 65, + 67, 132, 12, 60, 22, 54, 132, 3, 2, 67, + 134, 22, 192, 98, 100, 240, 81, 235, 228, 54, + 255, 22, 56, 20, 124, 32, 113, 175, 19, 9, + 13, 3, 0, 4, 216, 216, 17, 139, 1, 3, + 13, 34, 236, 105, 247, 102, 3, 10, 5, 206, + 114, 156, 40, 26, 171, 235, 195, 28, 206, 94, + 4, 244, 10, 39, 196, 197, 14, 0, 6, 80, + 240, 3, 168, 169, 42, 117, 7, 26, 56, 136, + 160, 135, 15, 132, 118, 33, 201, 234, 245, 100, + 54, 132, 137, 11, 22, 2, 212, 160, 65, 163, + 194, 218, 11, 16, 48, 68, 112, 208, 229, 173, + 227, 199, 66, 158, 110, 225, 210, 64, 174, 131, + 203, 17, 50, 107, 222, 204, 153, 243, 229, 203, + 149, 185, 116, 73, 5, 185, 180, 233, 44, 90, + 38, 115, 41, 224, 65, 130, 107, 6, 176, 25, + 184, 158, 173, 64, 129, 34, 69, 152, 51, 191, + 194, 192, 174, 119, 111, 197, 139, 67, 143, 38, + 125, 186, 184, 138, 201, 15, 90, 203, 110, 80, + 34, 77, 222, 189, 179, 98, 184, 152, 62, 29, + 71, 10, 18, 21, 247, 134, 243, 203, 33, 129, + 178, 4, 167, 26, 27, 223, 162, 121, 44, 29, + 16, 36, 82, 4, 160, 206, 190, 189, 139, 25, + 53, 116, 188, 200, 144, 161, 185, 172, 6, 57, + 88, 0, 107, 177, 195, 253, 141, 0, 242, 101, + 48, 84, 35, 210, 248, 226, 158, 123, 240, 201, + 39, 155, 56, 116, 92, 116, 131, 12, 230, 160, + 67, 156, 58, 116, 113, 208, 149, 6, 18, 68, + 100, 137, 65, 155, 208, 68, 255, 66, 6, 53, + 0, 115, 131, 15, 37, 217, 178, 64, 6, 35, + 228, 37, 194, 72, 58, 0, 19, 64, 6, 41, + 96, 101, 11, 11, 57, 56, 144, 93, 138, 34, + 100, 128, 3, 48, 51, 120, 16, 194, 115, 113, + 160, 129, 86, 0, 231, 52, 48, 5, 43, 188, + 185, 211, 9, 8, 37, 164, 240, 139, 68, 62, + 124, 32, 229, 7, 244, 229, 208, 98, 88, 62, + 200, 120, 201, 10, 57, 52, 192, 149, 44, 241, + 244, 64, 15, 140, 205, 216, 162, 67, 148, 83, + 86, 217, 83, 78, 246, 24, 69, 1, 0, 55, + 248, 193, 152, 21, 80, 233, 97, 33, 29, 249, + 16, 100, 203, 12, 0, 109, 208, 200, 159, 107, + 0, 249, 6, 160, 128, 158, 71, 104, 35, 41, + 104, 8, 128, 11, 10, 136, 115, 40, 27, 100, + 97, 71, 206, 14, 22, 92, 192, 193, 156, 144, + 33, 66, 215, 84, 28, 60, 170, 157, 118, 43, + 122, 218, 149, 89, 26, 88, 128, 86, 57, 149, + 38, 22, 200, 132, 198, 169, 131, 136, 92, 174, + 212, 101, 215, 172, 119, 245, 102, 194, 173, 184, + 178, 161, 43, 174, 183, 246, 182, 199, 5, 9, + 4, 171, 140, 14, 11, 20, 187, 128, 5, 9, + 32, 118, 151, 98, 129, 140, 214, 234, 179, 88, + 164, 38, 153, 106, 148, 85, 102, 237, 181, 215, + 138, 54, 200, 180, 79, 65, 235, 173, 21, 169, + 13, 242, 5, 140, 98, 132, 193, 128, 7, 7, + 204, 133, 255, 65, 9, 118, 172, 168, 198, 161, + 128, 66, 250, 6, 30, 184, 178, 67, 235, 93, + 193, 9, 210, 237, 183, 111, 105, 193, 133, 114, + 244, 73, 96, 134, 8, 126, 222, 216, 137, 8, + 37, 36, 172, 48, 187, 130, 238, 101, 71, 30, + 125, 4, 203, 86, 179, 172, 126, 139, 156, 2, + 30, 120, 224, 0, 81, 13, 239, 85, 83, 6, + 59, 200, 228, 208, 167, 157, 252, 120, 65, 47, + 56, 232, 192, 1, 58, 226, 157, 182, 197, 103, + 17, 164, 72, 71, 27, 11, 215, 108, 51, 118, + 26, 100, 215, 134, 142, 192, 232, 80, 223, 205, + 32, 228, 12, 135, 8, 33, 216, 108, 116, 194, + 216, 249, 89, 71, 8, 22, 212, 112, 67, 5, + 69, 186, 85, 8, 43, 14, 40, 214, 33, 36, + 86, 129, 229, 211, 73, 58, 176, 148, 207, 62, + 91, 111, 163, 128, 4, 249, 48, 32, 64, 216, + 219, 44, 48, 96, 131, 22, 136, 73, 193, 202, + 82, 31, 121, 64, 146, 177, 124, 108, 67, 78, + 13, 105, 160, 247, 61, 37, 100, 160, 40, 0, + 56, 100, 185, 95, 52, 5, 175, 145, 222, 154, + 150, 208, 248, 129, 147, 120, 235, 189, 247, 8, + 125, 43, 48, 143, 45, 1, 180, 249, 72, 8, + 21, 148, 83, 100, 197, 68, 176, 146, 135, 146, + 7, 135, 144, 65, 0, 61, 103, 176, 70, 28, + 118, 3, 179, 0, 3, 56, 217, 82, 207, 200, + 110, 128, 16, 1, 235, 57, 165, 64, 255, 34, + 48, 56, 100, 240, 35, 234, 77, 26, 67, 185, + 229, 22, 89, 0, 64, 7, 150, 58, 192, 121, + 100, 7, 176, 3, 58, 39, 95, 31, 115, 157, + 35, 108, 4, 29, 66, 10, 122, 154, 233, 67, + 153, 151, 36, 144, 193, 151, 34, 124, 24, 162, + 137, 59, 85, 111, 137, 11, 245, 129, 179, 98, + 206, 126, 59, 179, 0, 240, 22, 93, 208, 131, + 70, 231, 196, 109, 132, 1, 14, 40, 223, 201, + 6, 30, 104, 137, 118, 207, 41, 68, 64, 11, + 238, 186, 123, 78, 116, 142, 81, 165, 253, 165, + 141, 1, 230, 129, 196, 69, 4, 208, 3, 10, + 92, 0, 16, 199, 35, 66, 43, 238, 98, 2, + 59, 156, 199, 1, 12, 144, 65, 237, 232, 195, + 193, 48, 208, 231, 3, 13, 64, 67, 27, 54, + 16, 129, 49, 112, 144, 131, 36, 16, 96, 9, + 79, 200, 193, 197, 181, 46, 123, 44, 36, 151, + 128, 36, 64, 145, 47, 113, 130, 4, 109, 3, + 192, 90, 226, 87, 8, 242, 76, 69, 14, 76, + 74, 193, 13, 128, 161, 61, 27, 146, 44, 18, + 27, 112, 128, 15, 190, 119, 137, 5, 160, 192, + 136, 122, 33, 74, 230, 16, 176, 67, 9, 61, + 230, 41, 233, 170, 75, 59, 172, 82, 46, 49, + 124, 64, 94, 71, 228, 196, 138, 22, 215, 197, + 20, 176, 175, 43, 36, 184, 8, 57, 80, 133, + 152, 197, 200, 207, 101, 113, 217, 20, 31, 168, + 98, 193, 48, 218, 255, 17, 18, 125, 1, 204, + 4, 118, 192, 131, 14, 44, 5, 49, 225, 225, + 151, 18, 16, 161, 46, 89, 217, 165, 29, 38, + 104, 67, 29, 239, 248, 9, 80, 60, 140, 3, + 23, 16, 197, 2, 112, 128, 3, 82, 224, 96, + 1, 201, 194, 23, 197, 4, 233, 178, 201, 88, + 70, 55, 134, 188, 23, 31, 36, 70, 202, 82, + 154, 50, 147, 83, 121, 69, 102, 2, 161, 175, + 8, 114, 242, 149, 157, 139, 130, 44, 103, 217, + 4, 88, 218, 242, 52, 210, 226, 150, 46, 119, + 185, 175, 91, 250, 242, 72, 210, 210, 22, 23, + 110, 67, 204, 98, 230, 70, 55, 187, 1, 14, + 43, 5, 177, 173, 94, 254, 18, 90, 225, 90, + 141, 4, 168, 68, 46, 19, 198, 70, 2, 30, + 120, 192, 39, 145, 153, 204, 110, 246, 202, 55, + 190, 90, 214, 98, 154, 229, 172, 103, 190, 5, + 139, 7, 40, 128, 4, 170, 233, 65, 116, 69, + 128, 93, 32, 72, 67, 193, 116, 117, 199, 111, + 222, 139, 89, 173, 52, 231, 18, 38, 163, 78, + 250, 132, 225, 3, 173, 64, 131, 159, 58, 38, + 135, 80, 17, 138, 160, 94, 129, 88, 196, 130, + 117, 142, 77, 234, 19, 57, 95, 128, 205, 3, + 98, 54, 80, 232, 156, 192, 132, 29, 68, 145, + 193, 62, 245, 176, 136, 233, 32, 88, 225, 113, + 229, 120, 134, 233, 26, 141, 17, 101, 163, 100, + 33, 218, 232, 74, 135, 82, 59, 254, 168, 59, + 255, 198, 186, 128, 27, 69, 234, 24, 68, 60, + 160, 54, 14, 104, 14, 66, 245, 2, 15, 121, + 0, 67, 1, 79, 100, 36, 30, 255, 66, 73, + 28, 36, 96, 166, 35, 189, 204, 3, 54, 134, + 82, 131, 194, 75, 84, 113, 104, 158, 45, 106, + 144, 2, 71, 29, 116, 14, 79, 125, 42, 24, + 229, 32, 142, 166, 213, 224, 109, 86, 204, 84, + 186, 46, 195, 8, 130, 110, 64, 2, 24, 141, + 225, 9, 61, 248, 1, 12, 40, 109, 4, 76, + 202, 192, 147, 178, 151, 86, 127, 126, 208, 173, + 208, 75, 79, 93, 213, 218, 66, 15, 52, 7, + 165, 23, 161, 129, 11, 34, 36, 136, 115, 166, + 43, 51, 9, 196, 234, 236, 98, 98, 64, 56, + 189, 32, 5, 14, 72, 3, 37, 26, 107, 9, + 26, 192, 32, 5, 35, 208, 0, 10, 82, 112, + 183, 198, 206, 32, 6, 31, 72, 236, 27, 46, + 114, 55, 168, 133, 245, 10, 80, 217, 205, 78, + 221, 128, 161, 191, 25, 48, 6, 41, 24, 201, + 142, 40, 107, 137, 0, 96, 54, 70, 180, 189, + 132, 14, 206, 8, 7, 18, 188, 105, 0, 224, + 193, 84, 21, 234, 132, 129, 20, 30, 204, 123, + 61, 67, 83, 154, 252, 22, 178, 218, 229, 64, + 33, 174, 75, 1, 53, 253, 169, 128, 230, 94, + 162, 7, 57, 240, 128, 15, 102, 123, 9, 235, + 76, 73, 74, 244, 129, 129, 239, 204, 180, 149, + 224, 1, 160, 7, 22, 184, 255, 212, 27, 231, + 215, 0, 251, 121, 162, 167, 98, 114, 93, 80, + 231, 181, 129, 38, 205, 181, 178, 62, 16, 31, + 0, 254, 129, 29, 93, 137, 64, 170, 151, 32, + 31, 66, 160, 123, 137, 23, 144, 109, 104, 27, + 72, 15, 246, 44, 113, 3, 9, 32, 20, 135, + 0, 224, 65, 122, 133, 139, 4, 36, 81, 229, + 29, 250, 0, 6, 85, 141, 235, 161, 12, 12, + 113, 170, 66, 108, 28, 77, 154, 180, 96, 0, + 248, 44, 191, 34, 2, 200, 141, 84, 74, 58, + 91, 52, 184, 165, 110, 240, 109, 57, 30, 152, + 142, 36, 172, 227, 194, 75, 178, 137, 117, 45, + 1, 90, 216, 85, 5, 5, 57, 136, 239, 37, + 98, 160, 191, 8, 71, 35, 59, 86, 41, 50, + 0, 96, 0, 163, 241, 90, 162, 136, 114, 216, + 64, 3, 24, 160, 31, 19, 149, 87, 129, 23, + 72, 139, 156, 214, 139, 60, 247, 118, 98, 18, + 138, 226, 193, 145, 227, 176, 1, 12, 164, 160, + 196, 46, 72, 193, 149, 186, 27, 64, 56, 204, + 2, 113, 0, 168, 65, 1, 109, 209, 3, 5, + 92, 185, 42, 77, 106, 241, 37, 108, 160, 128, + 18, 236, 116, 129, 240, 227, 136, 18, 88, 161, + 188, 69, 62, 98, 103, 220, 181, 196, 137, 228, + 185, 129, 162, 109, 22, 6, 147, 219, 51, 140, + 24, 91, 224, 3, 15, 202, 38, 157, 29, 242, + 78, 214, 92, 91, 211, 105, 32, 13, 69, 187, + 168, 2, 255, 50, 253, 140, 62, 195, 56, 198, + 194, 179, 6, 15, 149, 240, 145, 59, 113, 66, + 202, 25, 212, 240, 71, 133, 181, 30, 147, 116, + 109, 32, 60, 82, 177, 36, 50, 4, 12, 97, + 80, 233, 133, 150, 136, 143, 196, 122, 225, 100, + 19, 125, 96, 119, 157, 32, 71, 5, 18, 112, + 41, 87, 222, 216, 213, 144, 200, 83, 110, 89, + 0, 91, 27, 129, 136, 136, 219, 27, 154, 232, + 244, 172, 104, 24, 185, 22, 109, 9, 64, 224, + 169, 71, 251, 166, 14, 88, 96, 115, 234, 104, + 47, 59, 68, 210, 59, 96, 32, 0, 65, 52, + 0, 208, 11, 86, 130, 130, 120, 246, 212, 61, + 90, 249, 210, 189, 219, 195, 228, 20, 48, 209, + 18, 50, 128, 55, 128, 98, 144, 131, 12, 108, + 101, 220, 228, 6, 0, 165, 30, 104, 60, 58, + 205, 237, 46, 102, 189, 10, 48, 4, 160, 21, + 163, 137, 227, 211, 207, 233, 158, 205, 144, 237, + 33, 155, 129, 224, 3, 90, 187, 238, 11, 114, + 90, 51, 18, 160, 33, 103, 171, 237, 173, 6, + 208, 50, 1, 182, 212, 216, 225, 245, 187, 203, + 121, 50, 192, 105, 192, 181, 89, 168, 231, 41, + 1, 79, 52, 44, 1, 40, 70, 81, 4, 153, + 75, 73, 27, 95, 238, 148, 9, 66, 156, 38, + 139, 21, 25, 206, 31, 161, 89, 206, 18, 209, + 70, 71, 60, 10, 57, 120, 176, 195, 182, 92, + 145, 60, 90, 100, 45, 68, 102, 192, 219, 117, + 174, 83, 85, 180, 75, 79, 17, 8, 98, 212, + 117, 174, 211, 64, 1, 28, 254, 57, 5, 206, + 214, 129, 5, 0, 146, 194, 98, 173, 218, 28, + 17, 102, 51, 153, 133, 125, 14, 52, 171, 187, + 94, 72, 181, 246, 180, 44, 5, 95, 133, 125, + 214, 83, 228, 130, 129, 57, 114, 128, 104, 119, + 79, 188, 27, 72, 101, 129, 9, 136, 169, 3, + 59, 92, 25, 99, 104, 90, 154, 151, 201, 113, + 42, 137, 28, 129, 161, 21, 239, 149, 190, 108, + 224, 2, 20, 168, 1, 215, 255, 147, 42, 197, + 232, 235, 153, 132, 188, 252, 28, 111, 197, 249, + 203, 57, 242, 191, 128, 169, 164, 96, 2, 64, + 129, 84, 113, 128, 89, 45, 211, 231, 16, 176, + 8, 171, 194, 139, 82, 121, 172, 255, 132, 230, + 55, 207, 85, 71, 26, 63, 69, 16, 3, 86, + 50, 138, 85, 212, 99, 101, 242, 246, 193, 201, + 189, 238, 7, 249, 170, 185, 196, 74, 148, 216, + 191, 215, 41, 73, 57, 44, 29, 32, 11, 149, + 208, 143, 190, 244, 167, 175, 10, 201, 84, 235, + 152, 175, 176, 87, 246, 215, 207, 14, 85, 174, + 146, 149, 229, 36, 63, 44, 167, 37, 204, 250, + 219, 255, 254, 206, 52, 103, 16, 0, 0, 59, + 10, 124, 165, 92, 136, 65, 105, 236, 247, 73, + 168, 224, 1, 35, 240, 0, 23, 226, 0, 154, + 225, 54, 178, 247, 74, 94, 17, 75, 229, 34, + 22, 137, 33, 128, 174, 3, 88, 10, 143, 65, + 21, 34, 48, 1, 51, 160, 3, 207, 151, 127, + 104, 37, 126, 248, 196, 4, 196, 18, 46, 202, + 52, 75, 2, 50, 129, 21, 88, 7, 209, 100, + 114, 95, 97, 12, 172, 96, 92, 36, 176, 128, + 104, 213, 128, 10, 117, 76, 254, 71, 8, 175, + 80, 130, 203, 164, 46, 186, 176, 130, 20, 24, + 7, 62, 24, 77, 199, 52, 47, 247, 177, 54, + 19, 128, 90, 60, 240, 43, 229, 132, 86, 180, + 161, 121, 58, 85, 11, 46, 115, 8, 175, 49, + 25, 155, 17, 8, 58, 184, 76, 9, 80, 46, + 3, 0, 85, 80, 165, 78, 235, 52, 13, 247, + 178, 47, 241, 164, 26, 177, 65, 27, 221, 241, + 132, 183, 193, 86, 189, 49, 78, 228, 84, 78, + 110, 248, 134, 112, 24, 135, 242, 68, 134, 28, + 37, 42, 103, 136, 134, 33, 104, 48, 39, 35, + 27, 109, 160, 48, 220, 242, 135, 21, 224, 25, + 220, 2, 49, 7, 53, 49, 32, 21, 4, 0, + 59, 0 ); + + php_egg_logo : array [0..7537] of byte = ( + 71, 73, 70, 56, 57, 97, 130, 0, 67, 0, + 247, 255, 0, 152, 134, 136, 108, 76, 84, 73, + 70, 71, 166, 138, 148, 136, 108, 119, 192, 192, + 192, 122, 106, 117, 139, 123, 134, 75, 59, 71, + 167, 162, 166, 91, 85, 90, 41, 28, 39, 104, + 91, 102, 152, 138, 150, 87, 75, 86, 105, 100, + 105, 41, 39, 41, 152, 150, 152, 55, 43, 57, + 160, 149, 166, 156, 140, 167, 56, 55, 57, 84, + 76, 100, 92, 84, 116, 92, 84, 124, 116, 108, + 148, 116, 114, 138, 85, 84, 107, 132, 131, 150, + 84, 84, 116, 108, 108, 148, 132, 132, 180, 92, + 92, 124, 140, 140, 188, 124, 124, 165, 105, 105, + 140, 76, 76, 101, 100, 100, 132, 116, 116, 153, + 156, 156, 204, 148, 148, 194, 132, 132, 172, 69, + 69, 90, 140, 140, 180, 169, 169, 214, 92, 92, + 116, 184, 184, 227, 203, 203, 246, 164, 165, 204, + 232, 233, 249, 40, 41, 56, 52, 54, 72, 27, + 31, 47, 106, 108, 116, 123, 125, 132, 106, 121, + 166, 25, 27, 33, 17, 18, 21, 140, 156, 196, + 108, 116, 136, 56, 65, 86, 80, 100, 136, 88, + 94, 104, 76, 87, 101, 41, 52, 52, 71, 91, + 88, 138, 167, 161, 183, 197, 194, 172, 183, 177, + 100, 136, 115, 118, 177, 139, 156, 200, 172, 148, + 223, 173, 131, 195, 153, 94, 126, 105, 105, 165, + 123, 85, 114, 94, 88, 149, 105, 137, 165, 145, + 73, 131, 88, 76, 153, 92, 106, 184, 123, 90, + 167, 105, 141, 212, 152, 157, 180, 159, 120, 187, + 123, 131, 198, 135, 106, 152, 108, 122, 168, 124, + 77, 111, 78, 87, 151, 88, 137, 213, 138, 148, + 225, 148, 104, 169, 103, 74, 154, 70, 70, 132, + 67, 106, 183, 102, 140, 182, 138, 91, 135, 88, + 154, 198, 151, 176, 228, 169, 91, 169, 78, 122, + 199, 108, 163, 218, 153, 86, 156, 70, 105, 183, + 88, 103, 169, 88, 138, 215, 120, 151, 216, 137, + 49, 121, 31, 120, 185, 104, 136, 200, 120, 66, + 122, 49, 134, 184, 120, 151, 228, 124, 121, 170, + 104, 68, 96, 59, 180, 205, 171, 44, 93, 25, + 79, 147, 52, 87, 135, 68, 105, 183, 72, 121, + 201, 86, 138, 214, 105, 103, 150, 83, 154, 200, + 135, 87, 162, 51, 104, 168, 74, 119, 185, 89, + 134, 195, 104, 69, 132, 36, 154, 215, 120, 70, + 148, 25, 102, 176, 57, 119, 167, 90, 176, 233, + 143, 98, 161, 57, 164, 230, 122, 151, 199, 119, + 92, 166, 37, 122, 192, 74, 135, 204, 86, 150, + 216, 103, 145, 202, 104, 116, 190, 57, 45, 69, + 26, 92, 172, 20, 118, 176, 69, 132, 186, 87, + 168, 218, 124, 35, 50, 20, 152, 177, 112, 142, + 162, 98, 70, 71, 38, 88, 87, 57, 166, 165, + 109, 202, 200, 143, 173, 166, 91, 180, 177, 143, + 134, 127, 89, 92, 84, 44, 88, 85, 71, 73, + 69, 55, 57, 53, 40, 185, 168, 118, 114, 100, + 63, 123, 118, 106, 156, 149, 134, 105, 84, 41, + 230, 177, 85, 87, 71, 43, 239, 199, 124, 235, + 205, 148, 170, 152, 119, 167, 121, 48, 51, 42, + 27, 206, 173, 121, 167, 109, 22, 190, 132, 42, + 202, 145, 60, 181, 143, 86, 228, 179, 109, 145, + 116, 72, 201, 163, 107, 105, 86, 58, 37, 31, + 22, 206, 151, 80, 216, 164, 91, 184, 151, 105, + 166, 137, 99, 231, 207, 176, 111, 101, 87, 127, + 78, 15, 150, 105, 52, 122, 87, 42, 152, 135, + 114, 104, 58, 6, 72, 57, 41, 225, 185, 141, + 179, 126, 70, 161, 115, 69, 138, 102, 64, 155, + 122, 87, 183, 151, 118, 77, 49, 24, 114, 75, + 39, 121, 88, 57, 168, 152, 137, 95, 57, 26, + 103, 69, 40, 188, 138, 96, 88, 71, 56, 65, + 35, 11, 143, 107, 79, 217, 171, 136, 88, 59, + 39, 105, 86, 73, 225, 189, 163, 129, 94, 71, + 199, 160, 135, 129, 103, 88, 148, 121, 105, 207, + 172, 153, 137, 117, 105, 103, 73, 57, 188, 143, + 121, 198, 182, 174, 204, 198, 195, 101, 60, 42, + 116, 76, 57, 119, 88, 74, 166, 127, 109, 69, + 43, 34, 55, 43, 39, 165, 133, 123, 182, 149, + 139, 185, 162, 156, 135, 107, 101, 167, 154, 151, + 84, 50, 44, 87, 59, 54, 139, 133, 132, 102, + 76, 72, 119, 90, 86, 71, 58, 56, 150, 124, + 120, 87, 73, 71, 136, 121, 119, 167, 139, 136, + 182, 138, 134, 120, 104, 103, 116, 76, 76, 103, + 87, 87, 122, 120, 120, 255, 255, 255, 0, 0, + 0, 33, 249, 4, 1, 0, 0, 5, 0, 44, + 0, 0, 0, 0, 130, 0, 67, 0, 64, 8, + 255, 0, 11, 8, 28, 72, 176, 160, 193, 131, + 8, 13, 162, 88, 24, 34, 196, 138, 15, 41, + 82, 136, 16, 97, 194, 132, 135, 18, 37, 64, + 180, 184, 192, 177, 99, 199, 22, 32, 64, 148, + 24, 225, 193, 196, 68, 17, 41, 62, 124, 104, + 24, 98, 33, 138, 132, 48, 99, 202, 156, 121, + 144, 97, 10, 19, 32, 54, 144, 32, 161, 162, + 39, 147, 34, 81, 214, 0, 50, 99, 166, 74, + 20, 35, 73, 162, 36, 65, 194, 101, 138, 83, + 51, 110, 246, 108, 177, 178, 134, 205, 158, 70, + 101, 188, 164, 49, 147, 38, 205, 155, 41, 70, + 164, 72, 137, 178, 100, 73, 19, 179, 79, 180, + 148, 69, 43, 230, 75, 19, 43, 85, 2, 169, + 209, 130, 6, 208, 220, 43, 74, 152, 248, 232, + 112, 33, 164, 200, 12, 34, 86, 44, 164, 73, + 184, 0, 138, 15, 30, 116, 170, 224, 193, 132, + 143, 23, 41, 110, 182, 156, 177, 50, 167, 207, + 27, 48, 108, 186, 148, 241, 83, 40, 16, 32, + 70, 143, 2, 173, 113, 3, 168, 210, 35, 74, + 140, 246, 116, 113, 66, 100, 8, 145, 8, 17, + 226, 217, 168, 241, 160, 223, 0, 118, 184, 217, + 121, 243, 102, 173, 247, 182, 109, 187, 189, 101, + 243, 69, 156, 120, 182, 109, 221, 192, 201, 155, + 55, 204, 147, 243, 56, 115, 164, 116, 153, 94, + 133, 52, 164, 73, 106, 202, 100, 93, 228, 231, + 77, 152, 58, 97, 240, 48, 255, 193, 56, 82, + 196, 135, 151, 52, 67, 136, 80, 172, 224, 30, + 0, 0, 13, 26, 0, 168, 7, 224, 25, 62, + 0, 248, 220, 185, 3, 16, 175, 193, 1, 27, + 54, 112, 64, 1, 5, 19, 36, 64, 196, 129, + 84, 28, 113, 68, 28, 125, 80, 113, 74, 55, + 191, 252, 98, 138, 2, 51, 204, 64, 3, 14, + 56, 84, 96, 10, 0, 6, 164, 179, 0, 2, + 218, 32, 115, 204, 44, 210, 132, 179, 77, 62, + 4, 224, 179, 77, 56, 199, 244, 82, 15, 3, + 7, 74, 96, 78, 55, 240, 72, 176, 0, 4, + 252, 152, 50, 140, 53, 156, 244, 193, 198, 27, + 80, 85, 177, 5, 87, 129, 196, 129, 197, 24, + 88, 24, 161, 198, 29, 101, 104, 225, 214, 21, + 78, 226, 161, 198, 21, 21, 153, 112, 30, 76, + 57, 145, 0, 142, 57, 230, 204, 179, 28, 55, + 221, 168, 179, 78, 3, 28, 28, 80, 15, 62, + 234, 212, 211, 205, 55, 237, 180, 217, 230, 61, + 112, 126, 99, 128, 1, 250, 212, 105, 74, 43, + 189, 216, 34, 204, 53, 242, 32, 32, 0, 4, + 57, 224, 112, 33, 14, 57, 228, 96, 207, 47, + 154, 100, 2, 202, 47, 247, 204, 121, 192, 123, + 7, 16, 112, 64, 3, 3, 172, 227, 141, 49, + 198, 172, 82, 203, 46, 208, 192, 35, 202, 52, + 175, 136, 162, 137, 51, 189, 220, 2, 11, 44, + 180, 240, 226, 201, 24, 75, 222, 129, 8, 24, + 94, 160, 255, 97, 70, 25, 105, 168, 145, 198, + 26, 104, 8, 130, 198, 146, 105, 176, 17, 136, + 33, 113, 136, 225, 208, 7, 48, 133, 128, 83, + 11, 14, 168, 2, 142, 51, 201, 40, 227, 172, + 50, 220, 152, 131, 141, 114, 243, 204, 195, 165, + 57, 252, 32, 80, 225, 12, 60, 144, 160, 0, + 63, 252, 40, 160, 0, 3, 42, 252, 96, 138, + 3, 14, 240, 243, 13, 55, 21, 208, 32, 3, + 4, 25, 166, 3, 47, 14, 185, 212, 43, 202, + 47, 161, 152, 2, 231, 3, 60, 240, 16, 132, + 2, 53, 24, 16, 79, 13, 10, 180, 194, 74, + 43, 154, 136, 82, 1, 16, 16, 52, 76, 207, + 40, 244, 124, 211, 202, 50, 188, 180, 114, 197, + 28, 138, 196, 145, 70, 30, 107, 128, 129, 134, + 31, 121, 96, 167, 134, 31, 110, 92, 33, 200, + 29, 133, 44, 66, 200, 36, 113, 16, 241, 130, + 11, 39, 160, 39, 211, 97, 38, 140, 48, 66, + 9, 27, 20, 195, 204, 206, 215, 144, 67, 78, + 52, 209, 144, 3, 13, 51, 233, 224, 32, 3, + 2, 242, 152, 163, 13, 55, 213, 50, 192, 143, + 3, 22, 218, 51, 205, 52, 206, 128, 67, 15, + 14, 64, 228, 242, 202, 40, 92, 143, 130, 206, + 52, 212, 52, 227, 202, 44, 178, 148, 29, 75, + 44, 193, 8, 147, 76, 170, 164, 144, 194, 203, + 219, 157, 108, 178, 9, 38, 110, 116, 33, 70, + 162, 162, 20, 3, 113, 215, 153, 216, 255, 178, + 201, 28, 134, 204, 113, 73, 32, 140, 64, 82, + 8, 35, 140, 80, 210, 200, 36, 136, 20, 242, + 135, 26, 227, 248, 19, 195, 11, 48, 12, 86, + 24, 76, 54, 81, 84, 101, 6, 27, 72, 128, + 3, 4, 244, 76, 35, 15, 46, 206, 104, 147, + 76, 50, 34, 142, 56, 139, 43, 157, 22, 19, + 141, 54, 216, 60, 60, 141, 61, 246, 96, 243, + 77, 56, 181, 240, 226, 246, 219, 164, 44, 221, + 205, 51, 226, 180, 226, 11, 39, 115, 136, 113, + 135, 31, 119, 220, 161, 71, 30, 121, 44, 255, + 135, 32, 109, 216, 33, 189, 29, 112, 220, 65, + 8, 33, 214, 223, 113, 5, 17, 49, 76, 254, + 114, 229, 150, 95, 46, 254, 248, 46, 177, 244, + 16, 68, 18, 69, 164, 254, 10, 236, 179, 228, + 254, 251, 13, 185, 180, 208, 9, 244, 199, 44, + 255, 253, 46, 141, 175, 255, 254, 5, 49, 4, + 81, 205, 32, 232, 192, 6, 116, 178, 19, 158, + 244, 36, 8, 65, 96, 194, 19, 206, 178, 4, + 41, 84, 193, 10, 112, 129, 32, 4, 151, 0, + 7, 59, 124, 65, 13, 96, 104, 194, 89, 132, + 96, 4, 37, 60, 225, 11, 95, 120, 194, 21, + 138, 144, 151, 32, 252, 96, 128, 27, 232, 128, + 10, 251, 18, 146, 18, 152, 36, 5, 43, 104, + 137, 204, 248, 119, 57, 20, 132, 32, 5, 137, + 217, 201, 1, 181, 240, 135, 59, 180, 161, 12, + 102, 216, 131, 30, 255, 26, 193, 8, 61, 172, + 97, 16, 135, 56, 132, 35, 20, 65, 134, 42, + 216, 74, 15, 111, 232, 195, 25, 206, 80, 135, + 58, 16, 225, 8, 68, 160, 66, 18, 166, 128, + 5, 44, 132, 225, 64, 173, 25, 135, 24, 199, + 72, 70, 50, 14, 97, 8, 99, 28, 66, 21, + 195, 240, 134, 55, 168, 161, 11, 128, 112, 131, + 21, 216, 208, 7, 55, 168, 97, 74, 95, 96, + 146, 26, 248, 160, 4, 191, 96, 196, 74, 45, + 217, 159, 122, 64, 192, 19, 30, 48, 160, 30, + 103, 114, 7, 110, 18, 64, 5, 39, 96, 97, + 9, 70, 24, 195, 25, 222, 144, 6, 52, 96, + 102, 50, 96, 216, 66, 20, 204, 16, 136, 57, + 128, 225, 17, 125, 56, 66, 21, 197, 113, 138, + 120, 68, 128, 3, 27, 152, 1, 134, 32, 16, + 10, 129, 225, 71, 29, 42, 242, 205, 111, 194, + 145, 143, 117, 228, 35, 28, 183, 216, 197, 46, + 120, 97, 13, 95, 28, 199, 28, 244, 144, 129, + 12, 20, 240, 141, 101, 176, 162, 71, 93, 184, + 130, 24, 194, 16, 135, 49, 144, 161, 14, 94, + 196, 194, 23, 4, 1, 136, 71, 168, 225, 11, + 109, 240, 3, 35, 208, 208, 5, 56, 100, 193, + 102, 37, 185, 82, 76, 56, 199, 19, 126, 232, + 163, 29, 221, 24, 198, 55, 234, 129, 27, 10, + 112, 32, 30, 195, 128, 37, 154, 234, 113, 15, + 2, 220, 227, 0, 241, 136, 7, 0, 78, 33, + 255, 159, 3, 224, 51, 2, 167, 120, 6, 59, + 134, 193, 13, 112, 160, 131, 30, 127, 162, 129, + 66, 9, 37, 129, 7, 48, 64, 1, 246, 16, + 128, 10, 72, 96, 1, 167, 205, 131, 0, 0, + 24, 192, 4, 38, 192, 14, 113, 120, 3, 22, + 214, 192, 148, 166, 106, 81, 141, 119, 24, 52, + 29, 244, 224, 70, 47, 96, 129, 41, 76, 252, + 65, 14, 105, 64, 89, 32, 2, 241, 7, 55, + 60, 98, 13, 85, 88, 66, 21, 226, 240, 6, + 55, 248, 244, 13, 108, 0, 195, 31, 30, 49, + 7, 56, 40, 97, 34, 196, 74, 136, 7, 46, + 176, 1, 4, 76, 3, 27, 92, 194, 6, 55, + 218, 33, 143, 164, 113, 105, 30, 110, 106, 71, + 181, 230, 129, 141, 170, 202, 67, 0, 51, 152, + 168, 5, 4, 32, 0, 218, 69, 72, 25, 216, + 138, 150, 4, 222, 181, 0, 12, 21, 234, 173, + 185, 0, 69, 41, 64, 49, 13, 125, 0, 32, + 2, 144, 106, 135, 1, 28, 106, 131, 1, 8, + 135, 21, 183, 64, 69, 49, 52, 49, 10, 8, + 228, 98, 20, 175, 80, 69, 43, 120, 161, 12, + 88, 156, 34, 8, 89, 152, 27, 37, 244, 160, + 135, 61, 152, 161, 112, 168, 129, 4, 35, 182, + 208, 83, 196, 65, 162, 17, 160, 101, 196, 28, + 156, 192, 130, 152, 197, 132, 102, 25, 1, 65, + 49, 122, 230, 51, 114, 128, 163, 28, 92, 2, + 7, 60, 192, 65, 91, 112, 255, 188, 67, 94, + 160, 179, 7, 184, 194, 197, 128, 7, 40, 160, + 39, 36, 120, 192, 57, 185, 17, 204, 119, 65, + 32, 29, 163, 16, 5, 58, 138, 161, 51, 98, + 16, 3, 24, 209, 152, 198, 61, 250, 241, 11, + 165, 125, 66, 21, 175, 200, 46, 51, 108, 193, + 10, 86, 192, 2, 19, 224, 205, 66, 97, 37, + 48, 3, 178, 134, 130, 31, 18, 106, 5, 41, + 48, 129, 8, 63, 252, 225, 13, 128, 248, 76, + 104, 11, 1, 134, 46, 168, 193, 51, 51, 37, + 4, 28, 248, 208, 61, 202, 133, 175, 48, 40, + 88, 129, 8, 60, 64, 224, 139, 32, 0, 29, + 59, 219, 217, 43, 110, 36, 1, 164, 65, 85, + 27, 16, 214, 70, 53, 170, 161, 13, 85, 228, + 226, 26, 224, 160, 70, 52, 202, 81, 12, 132, + 142, 194, 30, 161, 80, 197, 52, 126, 129, 11, + 92, 40, 227, 22, 181, 168, 197, 42, 86, 204, + 226, 21, 179, 66, 83, 183, 232, 68, 220, 46, + 17, 7, 64, 228, 1, 16, 124, 176, 131, 37, + 34, 145, 137, 72, 88, 194, 18, 116, 240, 49, + 30, 148, 240, 11, 60, 224, 65, 11, 88, 136, + 130, 29, 4, 225, 7, 236, 197, 161, 123, 147, + 131, 217, 127, 105, 56, 179, 134, 124, 224, 36, + 88, 158, 136, 9, 12, 208, 14, 101, 28, 131, + 22, 186, 208, 229, 46, 116, 65, 230, 89, 28, + 195, 21, 174, 56, 134, 52, 104, 145, 170, 93, + 164, 184, 255, 22, 186, 72, 70, 55, 72, 209, + 221, 99, 94, 226, 15, 128, 40, 131, 26, 128, + 148, 6, 63, 44, 162, 16, 126, 190, 195, 28, + 176, 32, 4, 22, 184, 224, 208, 136, 102, 1, + 12, 236, 55, 101, 42, 59, 90, 33, 54, 12, + 1, 68, 40, 114, 179, 11, 8, 16, 133, 5, + 204, 180, 166, 55, 173, 105, 20, 162, 80, 133, + 124, 1, 9, 8, 70, 144, 1, 147, 124, 32, + 134, 249, 123, 180, 170, 9, 98, 19, 19, 224, + 172, 128, 61, 57, 96, 90, 180, 240, 132, 177, + 72, 193, 11, 95, 240, 66, 25, 34, 195, 5, + 77, 10, 201, 10, 81, 136, 66, 26, 170, 144, + 20, 41, 36, 161, 11, 80, 128, 130, 20, 52, + 120, 133, 38, 92, 1, 146, 143, 44, 203, 19, + 52, 131, 6, 45, 104, 161, 10, 197, 203, 66, + 16, 124, 144, 66, 190, 248, 101, 4, 38, 128, + 97, 32, 87, 93, 229, 155, 100, 41, 214, 89, + 184, 66, 23, 192, 112, 21, 51, 128, 1, 12, + 107, 144, 195, 27, 206, 224, 20, 46, 176, 225, + 12, 100, 56, 3, 18, 200, 48, 5, 43, 76, + 1, 9, 253, 54, 195, 22, 146, 144, 132, 8, + 214, 183, 139, 72, 33, 248, 17, 134, 160, 160, + 36, 8, 33, 9, 71, 176, 130, 17, 176, 160, + 160, 58, 80, 33, 12, 97, 240, 98, 21, 202, + 192, 60, 55, 212, 202, 129, 106, 248, 195, 31, + 240, 144, 5, 81, 139, 100, 4, 230, 255, 25, + 183, 170, 105, 118, 1, 3, 170, 128, 9, 125, + 176, 204, 26, 222, 64, 134, 62, 128, 193, 12, + 133, 128, 4, 36, 160, 232, 8, 74, 84, 66, + 52, 138, 8, 68, 37, 200, 96, 133, 46, 36, + 97, 42, 75, 240, 226, 129, 18, 144, 0, 216, + 68, 64, 145, 186, 17, 7, 110, 130, 35, 117, + 113, 88, 221, 56, 197, 17, 7, 62, 234, 17, + 208, 117, 120, 162, 138, 88, 152, 195, 27, 212, + 82, 5, 47, 50, 40, 17, 108, 48, 66, 176, + 193, 224, 83, 43, 44, 161, 143, 34, 193, 72, + 96, 102, 8, 224, 15, 152, 64, 49, 47, 199, + 130, 34, 180, 64, 240, 55, 228, 186, 223, 51, + 13, 4, 27, 226, 8, 6, 43, 152, 65, 13, + 148, 96, 158, 25, 244, 64, 137, 71, 84, 98, + 232, 85, 92, 122, 211, 125, 80, 1, 8, 72, + 192, 1, 253, 216, 231, 51, 158, 177, 140, 101, + 244, 198, 55, 38, 242, 134, 110, 132, 147, 141, + 221, 24, 99, 27, 231, 192, 134, 135, 14, 181, + 142, 108, 112, 130, 15, 124, 0, 195, 28, 170, + 128, 7, 67, 188, 161, 11, 145, 140, 3, 30, + 192, 112, 235, 66, 128, 114, 14, 62, 85, 67, + 22, 70, 98, 51, 17, 168, 60, 38, 234, 81, + 140, 3, 218, 65, 159, 1, 12, 0, 31, 206, + 31, 64, 124, 164, 191, 209, 2, 49, 50, 12, + 129, 195, 62, 37, 28, 145, 136, 61, 188, 27, + 16, 138, 8, 131, 255, 39, 158, 81, 15, 125, + 29, 128, 4, 60, 144, 129, 160, 32, 240, 139, + 83, 120, 212, 26, 186, 152, 197, 44, 220, 108, + 141, 223, 164, 105, 29, 225, 144, 134, 138, 87, + 1, 11, 224, 16, 103, 25, 240, 176, 0, 50, + 32, 1, 250, 240, 13, 116, 198, 9, 138, 160, + 8, 82, 212, 7, 142, 208, 8, 240, 5, 8, + 91, 16, 77, 31, 147, 7, 123, 48, 8, 63, + 114, 71, 82, 160, 5, 53, 224, 1, 165, 38, + 78, 9, 145, 2, 132, 164, 2, 14, 160, 15, + 247, 80, 15, 234, 0, 0, 254, 244, 30, 239, + 129, 15, 235, 112, 31, 40, 232, 79, 255, 145, + 130, 239, 209, 0, 250, 209, 116, 79, 247, 12, + 173, 0, 45, 216, 112, 94, 21, 32, 76, 52, + 80, 40, 11, 32, 0, 232, 183, 86, 60, 192, + 1, 51, 80, 1, 230, 112, 14, 245, 80, 75, + 7, 80, 41, 188, 113, 14, 117, 98, 87, 236, + 96, 12, 231, 240, 14, 183, 37, 3, 14, 240, + 13, 195, 0, 11, 156, 80, 7, 65, 119, 7, + 107, 16, 134, 80, 81, 43, 90, 48, 29, 86, + 208, 4, 79, 176, 4, 73, 128, 5, 12, 18, + 7, 93, 128, 103, 128, 64, 37, 19, 17, 2, + 48, 241, 106, 246, 48, 15, 220, 48, 85, 221, + 80, 75, 47, 104, 0, 246, 100, 130, 234, 16, + 136, 245, 240, 13, 4, 128, 72, 136, 4, 39, + 249, 244, 30, 167, 16, 80, 173, 160, 39, 204, + 255, 208, 97, 244, 48, 47, 110, 149, 3, 161, + 160, 15, 12, 16, 10, 184, 0, 14, 57, 178, + 87, 6, 240, 40, 240, 209, 0, 9, 160, 27, + 217, 96, 12, 47, 150, 98, 183, 32, 91, 6, + 69, 15, 161, 160, 13, 43, 101, 13, 166, 194, + 9, 127, 80, 6, 185, 242, 7, 209, 81, 95, + 99, 224, 6, 96, 80, 71, 144, 0, 8, 156, + 225, 7, 136, 192, 8, 133, 80, 8, 147, 128, + 7, 98, 160, 62, 88, 210, 1, 36, 32, 15, + 93, 101, 14, 76, 131, 46, 1, 128, 85, 76, + 195, 13, 223, 208, 13, 89, 69, 97, 75, 147, + 135, 243, 16, 46, 223, 130, 94, 250, 212, 14, + 182, 144, 12, 224, 192, 13, 246, 176, 48, 185, + 144, 3, 10, 5, 87, 138, 130, 11, 165, 208, + 14, 216, 192, 15, 158, 8, 131, 254, 228, 135, + 219, 48, 138, 154, 18, 12, 203, 149, 93, 185, + 160, 10, 197, 80, 10, 188, 32, 13, 183, 64, + 10, 159, 240, 9, 155, 112, 9, 88, 96, 95, + 127, 128, 8, 128, 64, 9, 110, 224, 73, 119, + 116, 65, 128, 16, 8, 111, 48, 83, 107, 160, + 6, 110, 16, 7, 87, 176, 16, 43, 0, 19, + 34, 0, 2, 23, 96, 1, 175, 85, 14, 18, + 150, 135, 220, 208, 85, 246, 240, 37, 250, 176, + 85, 252, 208, 85, 14, 176, 24, 60, 160, 2, + 22, 224, 3, 223, 130, 46, 34, 104, 10, 237, + 160, 91, 121, 72, 15, 52, 255, 208, 48, 24, + 66, 40, 111, 149, 3, 137, 165, 44, 166, 32, + 31, 100, 146, 2, 55, 80, 148, 69, 41, 2, + 28, 224, 13, 172, 48, 12, 161, 144, 14, 2, + 80, 121, 199, 149, 14, 197, 80, 76, 202, 192, + 11, 219, 16, 15, 98, 112, 9, 52, 246, 7, + 123, 144, 6, 128, 118, 144, 214, 67, 8, 146, + 240, 103, 41, 227, 7, 147, 0, 90, 110, 96, + 8, 48, 224, 2, 149, 131, 57, 136, 17, 18, + 22, 112, 13, 61, 19, 13, 206, 128, 12, 180, + 208, 11, 218, 160, 52, 218, 224, 12, 229, 80, + 14, 180, 85, 35, 228, 53, 3, 14, 176, 141, + 227, 226, 80, 60, 176, 1, 15, 240, 0, 6, + 96, 10, 221, 32, 15, 238, 98, 33, 199, 53, + 10, 122, 163, 10, 215, 64, 13, 150, 41, 0, + 181, 17, 133, 9, 229, 147, 163, 32, 0, 8, + 48, 12, 152, 2, 144, 116, 0, 1, 57, 73, + 154, 195, 228, 0, 2, 160, 15, 19, 67, 10, + 131, 67, 9, 87, 177, 7, 123, 80, 77, 111, + 224, 8, 144, 144, 7, 53, 101, 8, 124, 48, + 9, 219, 20, 56, 112, 48, 4, 147, 3, 62, + 85, 38, 2, 228, 177, 1, 232, 112, 13, 239, + 48, 151, 64, 227, 51, 209, 208, 12, 209, 0, + 13, 183, 5, 58, 216, 96, 45, 237, 200, 15, + 12, 240, 80, 51, 32, 3, 62, 192, 15, 214, + 34, 15, 13, 83, 121, 90, 83, 12, 202, 53, + 13, 163, 255, 64, 13, 192, 112, 54, 177, 0, + 12, 194, 80, 10, 216, 160, 13, 182, 160, 12, + 189, 208, 13, 221, 192, 13, 202, 176, 12, 176, + 64, 10, 189, 128, 9, 131, 131, 7, 116, 80, + 1, 8, 37, 10, 252, 80, 86, 252, 16, 10, + 159, 192, 11, 46, 197, 49, 114, 0, 8, 135, + 3, 9, 139, 48, 9, 133, 224, 21, 149, 224, + 8, 241, 181, 43, 145, 19, 3, 82, 70, 62, + 118, 103, 51, 55, 115, 96, 59, 3, 13, 203, + 73, 14, 204, 64, 13, 185, 0, 1, 21, 80, + 146, 15, 6, 97, 210, 34, 15, 246, 0, 1, + 175, 48, 13, 215, 144, 12, 168, 0, 14, 185, + 80, 1, 135, 53, 59, 162, 240, 41, 37, 230, + 10, 186, 144, 10, 241, 39, 127, 242, 151, 10, + 62, 186, 10, 165, 184, 11, 255, 120, 9, 128, + 3, 7, 94, 128, 7, 63, 102, 9, 91, 147, + 11, 74, 90, 47, 154, 16, 144, 151, 192, 76, + 110, 224, 5, 199, 115, 61, 132, 80, 8, 136, + 32, 8, 152, 16, 3, 146, 227, 95, 116, 183, + 63, 54, 116, 101, 25, 48, 166, 22, 97, 1, + 239, 0, 13, 208, 64, 13, 2, 88, 1, 211, + 0, 14, 184, 16, 97, 220, 80, 13, 200, 128, + 12, 105, 179, 51, 197, 128, 14, 37, 54, 13, + 197, 128, 13, 216, 80, 12, 211, 96, 14, 206, + 82, 13, 243, 208, 11, 111, 86, 168, 100, 70, + 11, 164, 176, 13, 235, 149, 155, 127, 255, 22, + 8, 123, 144, 7, 32, 115, 7, 58, 86, 65, + 59, 38, 6, 150, 96, 7, 133, 144, 7, 180, + 134, 7, 112, 80, 65, 112, 112, 5, 84, 208, + 95, 47, 99, 63, 228, 150, 16, 54, 180, 2, + 18, 81, 37, 85, 2, 2, 168, 9, 15, 84, + 83, 151, 199, 112, 12, 97, 166, 75, 179, 128, + 12, 182, 80, 53, 180, 101, 15, 163, 144, 14, + 175, 0, 13, 164, 35, 97, 182, 80, 13, 201, + 160, 54, 170, 96, 15, 158, 48, 60, 156, 192, + 154, 142, 17, 43, 84, 10, 50, 138, 195, 8, + 136, 112, 7, 15, 249, 7, 142, 35, 6, 69, + 144, 0, 47, 144, 173, 47, 195, 150, 242, 83, + 170, 252, 83, 62, 15, 33, 17, 89, 166, 62, + 234, 83, 38, 240, 233, 44, 115, 202, 102, 119, + 169, 12, 233, 52, 12, 164, 112, 42, 156, 144, + 172, 115, 195, 7, 196, 120, 5, 35, 196, 1, + 43, 112, 2, 48, 192, 2, 252, 218, 175, 138, + 70, 63, 248, 227, 173, 2, 59, 176, 4, 91, + 176, 4, 203, 16, 146, 118, 101, 20, 113, 17, + 33, 1, 106, 158, 246, 176, 16, 59, 64, 160, + 22, 106, 162, 54, 18, 165, 134, 18, 167, 38, + 67, 95, 106, 176, 43, 23, 166, 169, 58, 2, + 1, 52, 64, 156, 182, 19, 63, 240, 3, 144, + 197, 4, 40, 91, 4, 205, 214, 4, 70, 134, + 7, 213, 70, 7, 89, 16, 179, 8, 52, 179, + 5, 244, 105, 43, 255, 84, 177, 37, 145, 114, + 50, 196, 177, 250, 147, 57, 32, 43, 178, 176, + 166, 2, 8, 196, 4, 103, 17, 5, 98, 225, + 111, 70, 224, 111, 78, 49, 21, 68, 177, 5, + 253, 6, 66, 77, 240, 110, 98, 1, 73, 144, + 116, 22, 70, 112, 22, 88, 80, 4, 105, 241, + 5, 90, 32, 6, 40, 123, 66, 221, 214, 1, + 21, 107, 106, 59, 203, 179, 166, 106, 67, 230, + 70, 64, 177, 22, 4, 74, 80, 4, 75, 48, + 29, 106, 0, 5, 74, 97, 180, 98, 33, 5, + 239, 102, 6, 142, 80, 20, 85, 128, 4, 91, + 176, 5, 96, 144, 7, 2, 39, 36, 154, 4, + 5, 93, 240, 64, 80, 96, 109, 118, 115, 5, + 73, 178, 22, 5, 169, 5, 77, 224, 64, 108, + 224, 6, 95, 192, 77, 77, 192, 4, 63, 176, + 66, 126, 68, 182, 27, 123, 176, 55, 132, 19, + 120, 39, 180, 98, 224, 83, 81, 112, 115, 141, + 32, 21, 72, 128, 4, 73, 161, 180, 78, 27, + 112, 108, 208, 107, 92, 224, 110, 68, 17, 108, + 107, 231, 6, 15, 148, 4, 85, 96, 4, 70, + 112, 4, 99, 128, 187, 75, 112, 5, 85, 208, + 5, 144, 148, 4, 73, 7, 73, 85, 80, 188, + 93, 32, 5, 106, 48, 20, 122, 166, 110, 180, + 198, 4, 98, 155, 185, 41, 112, 124, 222, 122, + 24, 194, 249, 185, 89, 128, 7, 119, 192, 118, + 111, 112, 21, 148, 101, 6, 114, 128, 111, 135, + 255, 192, 6, 83, 176, 113, 107, 80, 9, 248, + 198, 111, 99, 48, 6, 10, 114, 4, 91, 20, + 108, 17, 148, 113, 78, 64, 5, 173, 113, 70, + 103, 52, 14, 244, 171, 70, 9, 114, 32, 174, + 161, 187, 72, 210, 7, 113, 128, 6, 104, 64, + 43, 96, 48, 73, 238, 246, 7, 104, 208, 169, + 67, 102, 114, 37, 224, 1, 115, 183, 185, 61, + 171, 30, 37, 160, 67, 229, 2, 20, 86, 16, + 124, 94, 144, 7, 144, 192, 189, 107, 144, 8, + 149, 112, 8, 149, 192, 8, 131, 144, 111, 108, + 96, 6, 128, 203, 73, 129, 48, 6, 117, 224, + 26, 96, 68, 5, 44, 76, 4, 86, 247, 194, + 48, 252, 194, 99, 148, 117, 49, 44, 14, 117, + 144, 111, 61, 5, 6, 119, 176, 103, 115, 16, + 7, 113, 96, 5, 70, 98, 109, 122, 6, 6, + 85, 112, 5, 62, 208, 66, 11, 108, 124, 14, + 76, 24, 135, 65, 78, 7, 36, 6, 192, 71, + 192, 115, 16, 6, 99, 192, 83, 101, 112, 61, + 140, 176, 189, 141, 240, 115, 69, 81, 77, 131, + 208, 70, 91, 64, 108, 235, 187, 116, 17, 96, + 3, 253, 96, 74, 185, 49, 117, 193, 33, 122, + 187, 49, 28, 190, 84, 28, 217, 176, 14, 90, + 53, 15, 221, 224, 117, 23, 7, 23, 103, 145, + 83, 108, 24, 8, 141, 16, 8, 112, 145, 29, + 121, 224, 21, 4, 231, 4, 71, 140, 17, 40, + 231, 129, 53, 132, 24, 138, 255, 193, 24, 129, + 128, 6, 74, 49, 145, 78, 97, 5, 129, 144, + 6, 101, 240, 35, 108, 48, 145, 27, 51, 9, + 147, 16, 8, 114, 192, 120, 73, 116, 8, 17, + 57, 6, 96, 212, 116, 54, 160, 0, 168, 137, + 121, 155, 39, 80, 191, 241, 121, 167, 247, 27, + 193, 225, 198, 190, 116, 28, 231, 32, 15, 163, + 128, 0, 252, 48, 12, 174, 71, 164, 111, 52, + 29, 93, 224, 6, 129, 128, 8, 104, 144, 129, + 106, 224, 5, 177, 82, 6, 52, 23, 7, 101, + 0, 6, 69, 96, 200, 40, 39, 189, 167, 101, + 44, 120, 247, 0, 0, 224, 14, 158, 224, 4, + 78, 16, 113, 90, 0, 7, 101, 208, 5, 81, + 160, 8, 131, 176, 6, 94, 225, 20, 112, 116, + 160, 187, 6, 6, 15, 105, 129, 207, 100, 69, + 238, 16, 1, 19, 160, 1, 60, 112, 33, 11, + 96, 15, 103, 76, 31, 129, 184, 14, 190, 81, + 127, 225, 176, 14, 250, 188, 14, 219, 96, 13, + 253, 39, 28, 222, 16, 14, 230, 144, 14, 52, + 80, 1, 234, 194, 9, 172, 224, 9, 134, 176, + 71, 124, 16, 56, 16, 84, 7, 99, 48, 7, + 121, 148, 21, 140, 80, 9, 134, 16, 43, 122, + 160, 6, 222, 68, 124, 30, 16, 189, 52, 113, + 24, 30, 96, 64, 10, 80, 15, 206, 135, 31, + 80, 151, 0, 226, 64, 4, 6, 66, 4, 117, + 16, 7, 197, 107, 206, 243, 118, 6, 108, 192, + 6, 135, 255, 144, 8, 246, 21, 8, 125, 128, + 194, 164, 116, 15, 253, 81, 3, 233, 183, 74, + 242, 12, 117, 234, 224, 143, 32, 85, 127, 43, + 34, 38, 249, 231, 102, 181, 16, 82, 110, 252, + 13, 145, 40, 3, 2, 192, 152, 164, 136, 128, + 61, 124, 36, 103, 16, 8, 124, 208, 5, 125, + 112, 181, 104, 240, 8, 179, 34, 204, 118, 209, + 5, 214, 166, 4, 5, 166, 196, 167, 245, 1, + 35, 96, 64, 191, 64, 136, 239, 65, 31, 25, + 181, 130, 3, 128, 130, 241, 209, 0, 27, 197, + 116, 141, 132, 5, 115, 68, 111, 83, 16, 5, + 110, 160, 8, 84, 224, 14, 195, 96, 10, 140, + 226, 211, 63, 141, 53, 250, 160, 31, 245, 160, + 12, 96, 70, 102, 66, 250, 27, 40, 162, 34, + 210, 160, 11, 181, 16, 14, 74, 72, 0, 237, + 16, 208, 1, 184, 0, 21, 240, 0, 119, 98, + 12, 61, 226, 35, 145, 27, 95, 224, 252, 7, + 101, 23, 6, 87, 32, 5, 101, 112, 56, 56, + 214, 5, 115, 144, 21, 95, 192, 7, 59, 112, + 177, 206, 76, 16, 136, 97, 64, 5, 184, 78, + 51, 232, 14, 234, 224, 30, 238, 208, 130, 248, + 48, 215, 28, 96, 3, 24, 161, 1, 28, 16, + 31, 5, 98, 125, 140, 52, 126, 4, 245, 11, + 230, 4, 86, 50, 48, 40, 56, 242, 0, 8, + 240, 10, 50, 128, 1, 19, 64, 15, 184, 144, + 12, 210, 112, 14, 180, 148, 34, 252, 255, 28, + 14, 223, 64, 48, 54, 160, 1, 253, 176, 14, + 234, 112, 167, 16, 48, 76, 247, 112, 10, 92, + 88, 7, 190, 2, 68, 198, 187, 21, 61, 213, + 70, 86, 0, 5, 112, 80, 134, 77, 144, 113, + 87, 240, 4, 115, 176, 36, 59, 80, 17, 30, + 157, 16, 235, 81, 78, 231, 180, 38, 236, 180, + 31, 48, 104, 130, 248, 224, 130, 240, 8, 31, + 42, 152, 136, 52, 152, 0, 250, 161, 14, 220, + 160, 13, 211, 64, 15, 41, 250, 220, 63, 152, + 3, 16, 192, 0, 62, 48, 81, 221, 194, 3, + 97, 165, 15, 220, 224, 221, 148, 50, 122, 219, + 160, 14, 189, 176, 13, 221, 85, 11, 202, 112, + 156, 232, 0, 58, 140, 201, 82, 156, 112, 9, + 118, 241, 7, 107, 96, 6, 97, 152, 7, 122, + 38, 214, 88, 155, 4, 70, 176, 4, 113, 16, + 116, 110, 144, 7, 142, 240, 6, 124, 96, 18, + 230, 1, 19, 35, 160, 19, 14, 128, 135, 232, + 4, 75, 244, 180, 206, 145, 162, 224, 243, 68, + 0, 250, 96, 79, 138, 24, 15, 253, 112, 79, + 137, 248, 12, 238, 240, 12, 202, 160, 13, 215, + 240, 10, 244, 16, 137, 24, 114, 33, 57, 176, + 0, 137, 169, 0, 161, 192, 167, 252, 32, 92, + 113, 110, 38, 0, 64, 32, 184, 145, 13, 189, + 225, 11, 172, 240, 102, 206, 96, 82, 232, 208, + 153, 42, 117, 11, 198, 192, 133, 138, 160, 7, + 96, 0, 7, 132, 255, 16, 8, 87, 16, 204, + 93, 192, 6, 112, 49, 73, 135, 115, 99, 129, + 224, 113, 136, 99, 8, 196, 104, 140, 9, 145, + 37, 224, 176, 15, 251, 16, 0, 1, 160, 15, + 245, 176, 14, 236, 224, 14, 54, 48, 39, 133, + 24, 136, 231, 160, 14, 212, 216, 14, 220, 80, + 39, 223, 192, 211, 60, 125, 0, 112, 114, 15, + 235, 208, 11, 201, 208, 12, 204, 48, 13, 79, + 9, 40, 59, 73, 40, 163, 240, 0, 248, 50, + 13, 184, 32, 33, 142, 162, 130, 254, 212, 0, + 162, 72, 138, 171, 224, 102, 201, 80, 12, 174, + 106, 230, 154, 192, 138, 166, 2, 11, 255, 216, + 7, 253, 237, 5, 251, 149, 29, 123, 22, 114, + 253, 29, 71, 215, 211, 6, 212, 100, 71, 118, + 113, 5, 225, 138, 37, 58, 241, 90, 93, 98, + 14, 242, 224, 0, 1, 32, 141, 141, 82, 128, + 136, 52, 141, 108, 34, 146, 237, 240, 13, 235, + 242, 11, 14, 69, 157, 140, 242, 12, 231, 128, + 12, 201, 160, 10, 230, 16, 81, 134, 21, 40, + 147, 152, 14, 33, 6, 10, 184, 240, 13, 150, + 152, 121, 254, 225, 79, 28, 80, 38, 234, 208, + 207, 153, 178, 10, 199, 240, 136, 206, 158, 11, + 211, 160, 10, 184, 240, 54, 245, 217, 11, 189, + 192, 154, 253, 157, 60, 1, 156, 204, 122, 6, + 192, 101, 32, 114, 68, 124, 95, 131, 48, 233, + 86, 112, 145, 14, 81, 135, 2, 52, 91, 80, + 255, 197, 140, 217, 168, 157, 158, 142, 85, 245, + 62, 239, 209, 114, 45, 213, 194, 15, 98, 53, + 152, 12, 208, 15, 166, 128, 13, 99, 206, 140, + 216, 176, 86, 243, 178, 225, 133, 146, 11, 153, + 80, 10, 165, 144, 137, 191, 48, 41, 40, 104, + 3, 146, 98, 0, 12, 64, 0, 173, 151, 13, + 154, 34, 12, 224, 249, 10, 245, 146, 9, 163, + 176, 241, 189, 32, 13, 176, 96, 10, 116, 32, + 144, 152, 48, 7, 124, 220, 8, 67, 196, 120, + 120, 230, 6, 70, 80, 5, 105, 240, 89, 140, + 208, 199, 128, 96, 8, 201, 68, 63, 116, 152, + 16, 56, 209, 1, 14, 48, 91, 233, 110, 14, + 90, 85, 85, 209, 89, 45, 109, 194, 52, 61, + 143, 46, 14, 208, 47, 20, 101, 202, 246, 128, + 0, 8, 160, 0, 191, 208, 13, 237, 88, 225, + 193, 164, 147, 147, 184, 244, 197, 128, 11, 47, + 26, 148, 192, 205, 1, 26, 96, 51, 38, 192, + 1, 238, 48, 138, 173, 144, 55, 161, 16, 137, + 135, 21, 42, 195, 176, 12, 243, 233, 9, 253, + 144, 5, 224, 165, 49, 129, 64, 89, 193, 168, + 155, 41, 163, 155, 136, 19, 140, 143, 224, 8, + 122, 32, 90, 66, 192, 173, 48, 145, 2, 25, + 209, 1, 246, 208, 151, 206, 80, 13, 207, 18, + 45, 242, 0, 15, 242, 224, 233, 242, 176, 15, + 210, 226, 37, 218, 34, 3, 97, 181, 1, 219, + 56, 152, 59, 113, 15, 255, 255, 201, 15, 121, + 216, 46, 239, 194, 225, 146, 8, 132, 161, 160, + 9, 197, 176, 33, 47, 210, 3, 69, 217, 3, + 30, 112, 3, 31, 160, 3, 28, 224, 9, 7, + 243, 11, 162, 240, 148, 12, 3, 1, 136, 133, + 13, 234, 48, 49, 203, 0, 16, 167, 174, 24, + 122, 20, 167, 140, 25, 51, 82, 180, 228, 249, + 51, 73, 16, 33, 66, 139, 238, 220, 241, 131, + 72, 210, 34, 69, 113, 176, 188, 112, 1, 3, + 69, 1, 144, 33, 69, 134, 16, 1, 2, 196, + 5, 122, 240, 162, 149, 171, 166, 140, 22, 173, + 106, 230, 180, 105, 195, 5, 206, 38, 184, 105, + 244, 36, 200, 152, 49, 67, 133, 143, 7, 12, + 248, 41, 80, 208, 66, 197, 15, 125, 10, 30, + 252, 234, 246, 75, 6, 79, 8, 16, 70, 165, + 27, 5, 33, 29, 58, 106, 89, 237, 153, 234, + 103, 128, 43, 132, 92, 185, 94, 137, 18, 245, + 42, 199, 43, 94, 198, 54, 137, 17, 5, 65, + 6, 14, 184, 244, 66, 1, 177, 119, 239, 25, + 47, 82, 151, 2, 41, 234, 99, 6, 208, 27, + 64, 128, 204, 232, 41, 148, 199, 144, 33, 76, + 98, 4, 49, 98, 244, 231, 15, 31, 44, 49, + 56, 162, 248, 40, 210, 114, 1, 146, 37, 76, + 34, 184, 70, 14, 92, 180, 104, 206, 170, 85, + 227, 86, 206, 28, 54, 112, 229, 202, 129, 131, + 71, 79, 167, 0, 7, 10, 134, 18, 13, 170, + 162, 133, 255, 133, 26, 250, 190, 181, 179, 199, + 83, 2, 13, 169, 162, 138, 161, 83, 5, 45, + 43, 180, 98, 14, 226, 245, 211, 247, 75, 159, + 61, 171, 163, 94, 77, 211, 183, 141, 21, 172, + 86, 152, 240, 136, 2, 238, 91, 128, 130, 80, + 252, 134, 145, 34, 133, 105, 18, 163, 70, 122, + 242, 228, 41, 212, 200, 81, 35, 70, 128, 212, + 252, 9, 164, 87, 207, 29, 52, 127, 34, 79, + 174, 124, 217, 114, 136, 20, 70, 40, 161, 132, + 11, 138, 185, 230, 64, 112, 200, 33, 231, 154, + 104, 22, 76, 173, 65, 116, 22, 88, 32, 29, + 123, 230, 249, 133, 31, 126, 24, 8, 74, 129, + 25, 100, 216, 128, 1, 125, 184, 153, 39, 29, + 28, 128, 136, 110, 20, 81, 208, 41, 230, 21, + 106, 128, 113, 17, 152, 102, 126, 233, 231, 23, + 109, 146, 233, 101, 25, 110, 166, 81, 165, 154, + 101, 140, 97, 165, 60, 76, 2, 193, 131, 14, + 8, 42, 128, 205, 30, 123, 176, 249, 229, 151, + 94, 202, 35, 228, 14, 51, 222, 152, 195, 141, + 71, 26, 129, 164, 145, 66, 222, 176, 34, 14, + 55, 12, 9, 4, 144, 59, 180, 24, 199, 31, + 254, 252, 51, 19, 133, 21, 76, 16, 176, 132, + 13, 138, 97, 230, 192, 206, 82, 43, 39, 26, + 104, 160, 185, 38, 194, 5, 16, 144, 103, 31, + 115, 230, 153, 39, 67, 6, 20, 224, 65, 6, + 5, 146, 44, 71, 158, 81, 74, 132, 255, 224, + 149, 87, 138, 41, 38, 157, 105, 224, 161, 134, + 24, 89, 100, 137, 229, 210, 96, 154, 81, 165, + 20, 91, 122, 233, 165, 27, 79, 151, 225, 165, + 151, 77, 54, 185, 196, 13, 53, 178, 8, 165, + 152, 80, 70, 9, 197, 30, 81, 94, 45, 133, + 150, 77, 222, 72, 227, 15, 64, 16, 41, 4, + 146, 66, 38, 161, 228, 145, 52, 252, 184, 146, + 145, 60, 248, 24, 83, 50, 143, 250, 51, 211, + 63, 20, 62, 80, 115, 132, 17, 64, 160, 7, + 29, 102, 222, 164, 19, 26, 5, 175, 121, 101, + 129, 10, 16, 72, 82, 38, 63, 255, 180, 167, + 2, 28, 70, 153, 230, 154, 100, 80, 17, 5, + 135, 10, 114, 72, 167, 24, 215, 28, 197, 230, + 154, 96, 102, 209, 101, 150, 89, 42, 149, 5, + 95, 87, 92, 161, 229, 22, 128, 97, 129, 133, + 20, 83, 13, 81, 163, 11, 49, 50, 25, 101, + 97, 233, 194, 178, 196, 146, 82, 62, 193, 164, + 143, 51, 250, 8, 228, 143, 66, 22, 209, 24, + 145, 73, 38, 89, 68, 144, 57, 98, 240, 71, + 50, 22, 40, 91, 246, 228, 144, 154, 21, 193, + 3, 104, 61, 176, 96, 148, 106, 235, 132, 134, + 153, 8, 139, 180, 71, 30, 108, 100, 154, 137, + 27, 115, 204, 1, 103, 148, 92, 222, 97, 176, + 25, 112, 210, 161, 39, 157, 116, 66, 17, 69, + 149, 80, 176, 193, 5, 23, 100, 118, 169, 165, + 150, 84, 170, 174, 255, 186, 150, 85, 86, 97, + 133, 149, 85, 106, 185, 165, 19, 83, 231, 48, + 36, 141, 52, 196, 136, 228, 236, 72, 70, 121, + 248, 225, 92, 52, 249, 228, 19, 67, 230, 184, + 34, 9, 40, 218, 184, 99, 17, 136, 238, 48, + 164, 142, 145, 145, 53, 25, 101, 192, 65, 66, + 1, 64, 19, 60, 48, 220, 131, 22, 232, 169, + 150, 230, 5, 220, 170, 96, 26, 112, 156, 113, + 70, 27, 153, 170, 65, 38, 152, 114, 138, 161, + 230, 154, 81, 174, 41, 7, 23, 10, 229, 145, + 171, 20, 92, 156, 225, 166, 20, 109, 110, 169, + 101, 151, 172, 91, 159, 218, 107, 88, 190, 238, + 4, 19, 74, 2, 9, 36, 141, 245, 242, 128, + 227, 236, 221, 31, 54, 219, 146, 63, 212, 16, + 131, 9, 60, 224, 128, 195, 11, 65, 38, 185, + 3, 143, 33, 98, 144, 236, 133, 146, 255, 14, + 124, 122, 193, 1, 20, 193, 4, 236, 77, 200, + 64, 1, 205, 115, 129, 64, 2, 4, 166, 145, + 71, 103, 203, 145, 57, 230, 24, 87, 130, 137, + 230, 209, 98, 74, 49, 71, 20, 20, 53, 153, + 6, 27, 110, 90, 89, 230, 156, 94, 98, 191, + 197, 26, 99, 72, 225, 69, 25, 82, 136, 195, + 19, 156, 240, 196, 28, 212, 112, 7, 66, 180, + 193, 15, 234, 201, 131, 31, 10, 193, 7, 59, + 192, 193, 14, 118, 160, 195, 217, 4, 129, 183, + 50, 116, 161, 12, 248, 249, 2, 21, 156, 247, + 255, 2, 142, 36, 75, 89, 212, 35, 97, 245, + 86, 144, 130, 235, 101, 207, 4, 37, 80, 193, + 12, 232, 49, 13, 92, 168, 166, 70, 193, 56, + 134, 189, 116, 161, 11, 87, 52, 163, 38, 224, + 192, 134, 210, 80, 100, 52, 92, 104, 3, 25, + 203, 216, 134, 167, 180, 17, 141, 106, 21, 195, + 20, 167, 128, 5, 43, 124, 17, 6, 60, 104, + 1, 12, 106, 64, 67, 33, 172, 248, 136, 65, + 252, 161, 13, 118, 104, 3, 28, 240, 224, 24, + 47, 108, 209, 14, 87, 24, 2, 8, 65, 216, + 145, 19, 80, 102, 132, 37, 100, 163, 72, 6, + 119, 194, 20, 154, 64, 4, 115, 92, 33, 3, + 176, 225, 140, 100, 152, 79, 23, 187, 216, 133, + 213, 110, 152, 62, 97, 36, 35, 25, 194, 24, + 90, 75, 104, 129, 175, 89, 184, 2, 28, 161, + 248, 133, 47, 124, 193, 138, 75, 240, 97, 14, + 95, 248, 2, 26, 208, 224, 5, 4, 34, 34, + 15, 140, 128, 196, 36, 16, 241, 135, 57, 204, + 1, 11, 68, 112, 129, 25, 93, 224, 2, 22, + 164, 81, 141, 109, 100, 101, 224, 40, 19, 130, + 21, 124, 0, 133, 115, 164, 101, 45, 15, 80, + 15, 252, 29, 50, 95, 250, 146, 197, 49, 164, + 113, 195, 170, 173, 2, 59, 195, 88, 135, 19, + 183, 198, 9, 78, 24, 226, 15, 183, 242, 131, + 32, 208, 128, 8, 63, 252, 225, 10, 88, 16, + 2, 11, 78, 121, 77, 22, 79, 176, 0, 6, + 170, 84, 227, 26, 91, 249, 77, 192, 169, 49, + 4, 176, 148, 229, 44, 231, 152, 2, 116, 166, + 51, 5, 31, 88, 193, 10, 198, 25, 130, 110, + 198, 83, 158, 40, 56, 1, 12, 236, 121, 79, + 124, 158, 128, 155, 241, 4, 103, 63, 253, 153, + 50, 113, 190, 51, 150, 229, 68, 39, 59, 219, + 121, 80, 132, 38, 244, 160, 239, 100, 232, 56, + 249, 249, 207, 233, 5, 4, 0, 59 ); + +implementation + +end. + diff --git a/php4App.dll b/php4App.dll new file mode 100644 index 0000000000000000000000000000000000000000..d25d474ea40f00cf2577bcd09b2c3e842a603502 GIT binary patch literal 2192384 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

!^QH5jjb`P1@(GE{kO=oGlBL# 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 z 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 z�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¨*4(GG$?IBdCt~#-a)1xQ@d!TyHz!^v;-1ng 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

WEvaH(keHu3;$F6K5VKyKClRJmnDZ~Cp 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

109?q0UzehLd)t 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�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%0D$-txd(;V7sT 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 z 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%0D|q*J|NQXi;V(>D$1QpvEb9-Go5A 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�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 ?Ncb7#UEBvJ|Kl)v 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 literal 0 HcmV?d00001 diff --git a/php4App.dpr b/php4App.dpr index 09067ec..da9e9aa 100644 --- a/php4App.dpr +++ b/php4App.dpr @@ -1,43 +1,43 @@ - {*******************************************************} -{ PHP4Applications } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: php4App.dpr,v 6.2 02/2006 delphi32 Exp $ } - -{$I PHP.INC} - -library php4App; -uses - Windows, - Classes, - SysUtils, - ZendTypes, - PHPTypes, - ZendAPI, - PHPAPI, - php4AppUnit; - -{$R *.RES} - - - -exports - InitRequest, - DoneRequest, - ExecutePHP, - ExecuteCode, - RegisterVariable, - GetResultText, - GetVariable, - SaveToFile, - GetVariableSize, - GetResultBufferSize; - -begin - InitEngine; -end. +{*******************************************************} +{ PHP4Applications } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} + +{ $Id: php4App.dpr,v 7.4 10/2009 delphi32 Exp $ } + +{$I PHP.INC} + +library php4App; +uses + Windows, + SysUtils, + ZendTypes, + PHPTypes, + ZendAPI, + PHPAPI, + php4AppUnit; + +{$R *.RES} + + + +exports + InitRequest, + DoneRequest, + ExecutePHP, + ExecuteCode, + RegisterVariable, + GetResultText, + GetVariable, + SaveToFile, + GetVariableSize, + GetResultBufferSize; + +begin + InitEngine; +end. diff --git a/php4App.dproj b/php4App.dproj new file mode 100644 index 0000000..54afd88 --- /dev/null +++ b/php4App.dproj @@ -0,0 +1,106 @@ + + + {DB6E6909-645D-4E14-8034-4ABFA8EB52AC} + php4App.dpr + True + Debug + 1 + Library + None + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + false + 00400000 + php4App + 1058 + false + System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + false + true + false + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + + + true + php4App_Icon.ico + 1033 + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + php4App_Icon.ico + + + RELEASE;$(DCC_Define) + false + 0 + 0 + + + DEBUG;$(DCC_Define) + true + false + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + + + + + php4App.dpr + + + + False + True + False + + + 12 + + + + diff --git a/php4App.dproj.local b/php4App.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4App.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4App.identcache b/php4App.identcache new file mode 100644 index 0000000000000000000000000000000000000000..303be0800985cc7e22649d7940d5f7d672a24a32 GIT binary patch literal 47 qcmZQ%U|^7Qwu(t9E>4Xp$S5#LNzEz9$OJPT3kvj73W|U#-~a$Qs|#ZQ literal 0 HcmV?d00001 diff --git a/php4App.res b/php4App.res index 6a660911db4cfc262c769b7680368b070bd38270..16021871a227e2849c05a3d97ee77276713b7993 100644 GIT binary patch delta 301 zcmaFDyM=p#q9P*$g8~Bs!~g#RKn&ynfdK<23zz{UUNBDXW7gwlV1P&g>B+~L6kj>*|9#*;U(C#*_g7BFNm6fl@D zI0DIn$-Zprq3CMu7zBZ~1uzsbP^O3>8Azr8 z`5@JLU^O6>jFXqL*>6o9sE86Oa2Aqcl9!WNPz`*A%qQp>ie9E^ zlb*u9y;ZQwpbhJ+wb%9k*FLZQkHBN}CGJ`9I>GL#FFc#~N)buDUJ!Axq+oDj%o=?1 z-cB~*_h{TY(4B{<@6E%l^Bg{VGKP{$BP&*KV@q3_lA}#ERFkWM>blb*x~7sT&@sBH z3svw(l(V;zZppv5xtHYZE7W;kp01K~PH79>Ab2fx15T`+Q9>ysX+_E^#K=7|TDD!C zn(D|#uys zzCf|d#)`zNbjVl$IqDnuZlKW`+1X!%`*YLXD<`(}^9^ReGJJM3*StlafcYgj-A`xj E3x1AhqW}N^ diff --git a/php4App.stat b/php4App.stat new file mode 100644 index 0000000..fd9c33f --- /dev/null +++ b/php4App.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=3 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=724 +OtherSecs=68 +StartTime=21.09.2018 13:22:04 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4AppIntf.pas b/php4AppIntf.pas index 171a3c0..de444c5 100644 --- a/php4AppIntf.pas +++ b/php4AppIntf.pas @@ -1,40 +1,40 @@ -{*******************************************************} -{ PHP4Applications } -{ } -{ Delphi interface for PHP4Applications } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -unit php4AppIntf; - -interface - -function InitRequest : integer; stdcall; -procedure DoneRequest(RequestID : integer); stdcall; -procedure RegisterVariable(RequestID : integer; AName : PChar; AValue : PChar); stdcall; -function ExecutePHP(RequestID : integer; FileName : PChar) : integer; stdcall; -function ExecuteCode(RequestID : integer; ACode : PChar) : integer; stdcall; -function GetResultText(RequestID : integer; Buffer : PChar; BufLen : integer) : integer; stdcall; -function GetVariable(RequestID : integer; AName : PChar; Buffer : PChar; BufLen : integer) : integer; stdcall; -procedure SaveToFile(RequestID : integer; AFileName : PChar); stdcall; -function GetVariableSize(RequestID : integer; AName : PChar) : integer; stdcall; -function GetResultBufferSize(RequestID : integer) : integer; stdcall; - -implementation - -function InitRequest; external 'php4app.dll'; -procedure DoneRequest; external 'php4app.dll'; -procedure RegisterVariable; external 'php4app.dll'; -function ExecutePHP; external 'php4app.dll'; -function ExecuteCode; external 'php4app.dll'; -function GetResultText; external 'php4app.dll'; -function GetVariable; external 'php4app.dll'; -procedure SaveToFile; external 'php4app.dll'; -function GetVariableSize; external 'php4app.dll'; -function GetResultBufferSize; external 'php4app.dll'; - +{*******************************************************} +{ PHP4Applications } +{ } +{ Delphi interface for PHP4Applications } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +unit php4AppIntf; + +interface + +function InitRequest : integer; stdcall; +procedure DoneRequest(RequestID : integer); stdcall; +procedure RegisterVariable(RequestID : integer; AName : PAnsiChar; AValue : PAnsiChar); stdcall; +function ExecutePHP(RequestID : integer; FileName : PAnsiChar) : integer; stdcall; +function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; +function GetResultText(RequestID : integer; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; +function GetVariable(RequestID : integer; AName : PAnsiChar; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; +procedure SaveToFile(RequestID : integer; AFileName : PAnsiChar); stdcall; +function GetVariableSize(RequestID : integer; AName : PAnsiChar) : integer; stdcall; +function GetResultBufferSize(RequestID : integer) : integer; stdcall; + +implementation + +function InitRequest; external 'php4app.dll'; +procedure DoneRequest; external 'php4app.dll'; +procedure RegisterVariable; external 'php4app.dll'; +function ExecutePHP; external 'php4app.dll'; +function ExecuteCode; external 'php4app.dll'; +function GetResultText; external 'php4app.dll'; +function GetVariable; external 'php4app.dll'; +procedure SaveToFile; external 'php4app.dll'; +function GetVariableSize; external 'php4app.dll'; +function GetResultBufferSize; external 'php4app.dll'; + end. \ No newline at end of file diff --git a/php4AppUnit.pas b/php4AppUnit.pas index dac6276..f5e27eb 100644 --- a/php4AppUnit.pas +++ b/php4AppUnit.pas @@ -1,558 +1,743 @@ -{*******************************************************} -{ PHP4Applications } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{$I PHP.INC} - -{ $Id: php4AppUnit.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit php4AppUnit; - -interface -uses - Windows, - SysUtils, - Classes, - ZendTypes, - phpTypes, - PHPAPI, - ZENDAPI; - -const - REQUEST_ID_NOT_FOUND = -1; - VARIABLE_NOT_FOUND = -2; - ERROR_CREATE_PIPE = -3; - SCRIPT_IS_EMPTY = -4; - -type - - TPHPInfoBlock = class - private - FBuffer : string; - FVarList : TStringList; - procedure SetVarList(AValue : TStringList); - public - constructor Create; virtual; - destructor Destroy; override; - property Buffer : string read FBuffer write FBuffer; - property VarList : TStringList read FVarList write SetVarList; - end; - -function InitRequest : integer; stdcall; -procedure DoneRequest(RequestID : integer); stdcall; - -procedure RegisterVariable(RequestID : integer; AName : PChar; AValue : PChar); stdcall; -function ExecutePHP(RequestID : integer; FileName : PChar) : integer; stdcall; -function ExecuteCode(RequestID : integer; ACode : PChar) : integer; stdcall; -function GetResultText(RequestID : integer; Buffer : PChar; BufLen : integer) : integer; stdcall; -function GetVariable(RequestID : integer; AName : PChar; Buffer : PChar; BufLen : integer) : integer; stdcall; -procedure SaveToFile(RequestID : integer; AFileName : PChar); stdcall; -function GetVariableSize(RequestID : integer; AName : PChar) : integer; stdcall; -function GetResultBufferSize(RequestID : integer) : integer; stdcall; - -procedure PrepareStartup; - -procedure InitEngine; - -procedure StopEngine; - -implementation - -var - delphi_sapi_module : sapi_module_struct; - php_delphi_module : Tzend_module_entry; - -procedure php_info_delphi(zend_module : Pointer; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PChar('SAPI module version'), PChar('PHP4Delphi 6.2 Feb 2006')); - php_info_print_table_row(2, PChar('Home page'), PChar('http://users.chello.be/ws36637')); - php_info_print_table_end(); -end; - -function php_delphi_startup(sapi_module : Psapi_module_struct) : integer; cdecl; -begin - result := php_module_startup(sapi_module, nil, 0); -end; - -function php_delphi_deactivate(p : pointer) : integer; cdecl; -begin - result := 0; -end; - - -function php_delphi_ub_write(str : pchar; len : uint; p : pointer) : integer; cdecl; -var - s : string; - php : TPHPInfoBlock; - gl : psapi_globals_struct; -begin - Result := 0; - gl := GetSAPIGlobals(p); - if Assigned(gl) then - begin - php := TPHPInfoBlock(gl^.server_context); - if Assigned(php) then - begin - SetLength(s, len); - s := Copy(str,1,len); - try - php.FBuffer := php.FBuffer + s; - except - s := ''; - end; - result := len; - end; - end; - s := ''; -end; - -procedure php_delphi_flush(p : pointer); cdecl; -begin -end; - -procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; -var - cnt : integer; - InfoBlock : TPHPInfoBlock; - gl : psapi_globals_struct; - ts : pointer; -begin - ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(ts); - InfoBlock := TPHPInfoBlock(gl^.server_context); - php_register_variable('SERVER_NAME','DELPHI', val, p); - php_register_variable('SERVER_SOFTWARE', 'Delphi', val, p); - if Assigned(InfoBlock) then - try - for cnt := 0 to InfoBlock.VarList.Count - 1 do - begin - php_register_variable(PChar(InfoBlock.VarList.Names[cnt]), - PChar(InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]]), val, p); - end; - except - end; -end; - - -procedure php_delphi_send_header(p1, p2, p3 : pointer); cdecl; -begin - // -end; - -function php_delphi_read_cookies(p1 : pointer) : pointer; cdecl; -begin - result := nil; -end; - - -procedure PrepareStartup; -begin - delphi_sapi_module.name := 'embed'; (* name *) - delphi_sapi_module.pretty_name := 'PHP for Delphi'; (* pretty name *) - delphi_sapi_module.startup := php_delphi_startup; (* startup *) - delphi_sapi_module.shutdown := php_module_shutdown_wrapper; (* shutdown *) - delphi_sapi_module.activate:= nil; (* activate *) - delphi_sapi_module.deactivate := @php_delphi_deactivate; (* deactivate *) - delphi_sapi_module.ub_write := @php_delphi_ub_write; (* unbuffered write *) - delphi_sapi_module.flush := @php_delphi_flush; - delphi_sapi_module.stat:= nil; - delphi_sapi_module.getenv:= nil; - delphi_sapi_module.sapi_error := @zend_error; (* error handler *) - delphi_sapi_module.header_handler := nil; - delphi_sapi_module.send_headers := nil; - delphi_sapi_module.send_header := @php_delphi_send_header; - delphi_sapi_module.read_post := nil; - delphi_sapi_module.read_cookies := @php_delphi_read_cookies; - delphi_sapi_module.register_server_variables := @php_delphi_register_variables; (* register server variables *) - delphi_sapi_module.log_message := nil; (* Log message *) - delphi_sapi_module.php_ini_path_override := nil; - delphi_sapi_module.block_interruptions := nil; - delphi_sapi_module.unblock_interruptions := nil; - delphi_sapi_module.default_post_reader := nil; - delphi_sapi_module.treat_data := nil; - delphi_sapi_module.executable_location := nil; - delphi_sapi_module.php_ini_ignore := 0; - - php_delphi_module.size := sizeOf(Tzend_module_entry); - php_delphi_module.zend_api := ZEND_MODULE_API_NO; - php_delphi_module.zend_debug := 0; - php_delphi_module.zts := USING_ZTS; - php_delphi_module.name := 'php4delphi_support'; - php_delphi_module.functions := nil; - php_delphi_module.module_startup_func := nil; - php_delphi_module.module_shutdown_func := nil; - php_delphi_module.info_func := @php_info_delphi; - php_delphi_module.version := '6.2'; - {$IFDEF PHP4} - php_delphi_module.global_startup_func := nil; - {$ENDIF} - php_delphi_module.request_shutdown_func := nil; - php_delphi_module.global_id := 0; - php_delphi_module.module_started := 0; - php_delphi_module._type := 0; - php_delphi_module.handle := nil; - php_delphi_module.module_number := 0; -end; - - - -procedure PrepareResult(RequestID : integer; TSRMLS_D : pointer); -var - ht : PHashTable; - data: ^ppzval; - cnt : integer; - InfoBlock : TPHPInfoBlock; -begin - InfoBlock := TPHPInfoBlock(RequestID); - ht := GetSymbolsTable(TSRMLS_D); - if Assigned(ht) then - begin - for cnt := 0 to InfoBlock.VarList.Count - 1 do - begin - new(data); - try - if zend_hash_find(ht, PChar(InfoBlock.VarList.Names[cnt]), - strlen(PChar(InfoBlock.VarList.Names[cnt])) + 1, data) = SUCCESS then - case data^^^._type of - IS_STRING : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := data^^^.value.str.val; - IS_LONG, - IS_RESOURCE, - IS_BOOL : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := IntToStr(data^^^.value.lval); - IS_DOUBLE : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := FloatToStr(data^^^.value.dval); - end; - finally - freemem(data); - end; - end; - end; -end; - -function ExecutePHP(RequestID : integer; FileName : PChar) : integer; stdcall; -var - file_handle : zend_file_handle; - TSRMLS_D : pointer; - gl : psapi_globals_struct; -begin - if RequestID <= 0 then - begin - Result := REQUEST_ID_NOT_FOUND; - Exit; - end; - - try - TSRMLS_D := ts_resource_ex(0, nil); - file_handle._type := ZEND_HANDLE_FILENAME; - file_handle.filename := FileName; - file_handle.opened_path := nil; - file_handle.free_filename := 0; - file_handle.opened_path := nil; - - PG(TSRMLS_D)^.register_globals := true; - gl := GetSAPIGlobals(TSRMLS_D); - TPHPInfoBlock(RequestID).FBuffer := ''; - gl^.server_context := pointer(RequestID); - gl^.sapi_headers.http_response_code := 200; - gl^.request_info.request_method := 'GET'; - - php_request_startup(TSRMLS_D); - result := php_execute_script(@file_handle, TSRMLS_D); - zend_destroy_file_handle(@file_handle, TSRMLS_D); - PrepareResult(RequestID, TSRMLS_D); - php_request_shutdown(nil); - except - result := FAILURE; - end; -end; - - -function ExecuteCode(RequestID : integer; ACode : PChar) : integer; stdcall; -var - file_handle : zend_file_handle; - TSRMLS_D : pointer; - _handles : array[0..1] of THandle; - _code : string; - gl : psapi_globals_struct; -begin - if RequestID <= 0 then - begin - Result := REQUEST_ID_NOT_FOUND; - Exit; - end; - - if ACode = nil then - begin - Result := SCRIPT_IS_EMPTY; - Exit; - end; - - if pipe(@_handles, Length(ACode) + 512, 0) = -1 then - begin - Result := ERROR_CREATE_PIPE; - Exit; - end; - - _code := ACode; - if Pos('', _Code) = 0 then - _Code := _Code + ' ?>'; - - _write(_handles[1], @_Code[1], Length(_Code)); - close(_handles[1]); - - - TSRMLS_D := ts_resource_ex(0, nil); - file_handle._type := ZEND_HANDLE_FD; - - PG(TSRMLS_D)^.register_globals := true; - gl := GetSAPIGlobals(TSRMLS_D); - TPHPInfoBlock(RequestID).FBuffer := ''; - gl^.server_context := pointer(RequestID); - gl^.sapi_headers.http_response_code := 200; - gl^.request_info.request_method := 'GET'; - - file_handle.filename := '-'; - file_handle.opened_path := nil; - file_handle.free_filename := 0; - file_handle.handle.fd := _handles[0]; - php_request_startup(TSRMLS_D); - - result := php_execute_script(@file_handle, TSRMLS_D); - close(_handles[0]); - PrepareResult(RequestID, TSRMLS_D); - php_request_shutdown(nil); -end; - - -procedure RegisterVariable(RequestID : integer; AName : PChar; AValue : PChar); stdcall; -begin - try - TPHPInfoBlock(RequestID).VarList.Add(AName + '=' + AValue); - except - end; -end; - - -function GetResultText(RequestID : integer; Buffer : PChar; BufLen : integer) : integer; stdcall; -var - L : integer; -begin - if RequestID <= 0 then - begin - Result := REQUEST_ID_NOT_FOUND; - Exit; - end; - - try - L := Length(TPHPInfoBlock(RequestID).FBuffer)+1; - if L > BufLen then - begin - Result := L; - Exit; - end; - - StrLCopy(Buffer, PChar(TPHPInfoBlock(RequestID).FBuffer), BufLen -1); - Result := 0; - except - Result := REQUEST_ID_NOT_FOUND; - end; -end; - -function GetResultBufferSize(RequestID : integer) : integer; -var - L : integer; -begin - if RequestID <= 0 then - begin - Result := REQUEST_ID_NOT_FOUND; - Exit; - end; - - try - L := Length(TPHPInfoBlock(RequestID).FBuffer)+1; - Result := L; - except - Result := REQUEST_ID_NOT_FOUND; - end; -end; - -procedure SaveToFile(RequestID : integer; AFileName : PChar); -var - L : integer; - FS : TFileStream; -begin - if RequestID <= 0 then - begin - Exit; - end; - - try - FS := TFileStream.Create(AFileName, fmCreate); - try - L := Length(TPHPInfoBlock(RequestID).FBuffer); - FS.WriteBuffer(TPHPInfoBlock(RequestID).FBuffer[1], L); - finally - FS.Free; - end; - except - end; -end; - -function GetVariable(RequestID : integer; AName : PChar; Buffer : PChar; BufLen : integer) : integer; stdcall; -var - L : integer; - St : string; -begin - if RequestID <= 0 then - begin - Result := REQUEST_ID_NOT_FOUND; - Exit; - end; - - try - St := TPHPInfoBlock(RequestID).VarList.Values[AName]; - if St = '' then - begin - Result := VARIABLE_NOT_FOUND; - Exit; - end; - L := Length(St) +1 ; - if L > BufLen then - begin - Result := L; - Exit; - end; - - StrLCopy(Buffer, PChar(St), BufLen -1); - Result := 0; - except - Result := REQUEST_ID_NOT_FOUND; - end; -end; - -function GetVariableSize(RequestID : integer; AName : PChar) : integer; -var - L : integer; - St : string; -begin - if RequestID <= 0 then - begin - Result := REQUEST_ID_NOT_FOUND; - Exit; - end; - - try - St := TPHPInfoBlock(RequestID).VarList.Values[AName]; - if St = '' then - begin - Result := VARIABLE_NOT_FOUND; - Exit; - end; - L := Length(St) +1 ; - Result := L; - except - Result := REQUEST_ID_NOT_FOUND; - end; -end; - -{ TPHPInfoBlock } - -constructor TPHPInfoBlock.Create; -begin - inherited Create; - FBuffer := ''; - FVarList := TStringList.Create; -end; - -destructor TPHPInfoBlock.Destroy; -begin - FBuffer := ''; - FVarList.Free; - inherited; -end; - -procedure TPHPInfoBlock.SetVarList(AValue: TStringList); -begin - FVarList.Assign(AValue); -end; - - -function InitRequest : integer; -var - InfoBlock : TPHPInfoBlock; -begin - InfoBlock := TPHPInfoBlock.Create; - Result := integer(InfoBlock); -end; - -procedure DoneRequest(RequestID : integer); -begin - if RequestID <= 0 then Exit; - - try - TPHPInfoBlock(RequestID).Free; - TPHPInfoBlock(RequestID) := nil; - except - end; -end; - - -procedure DLLExitProc(Reason: Integer); register; -begin - case Reason of - DLL_PROCESS_DETACH: StopEngine; - DLL_THREAD_DETACH : ts_free_thread(); - end; -end; - -procedure InitEngine; -var - p : pointer; -begin - - if not PHPLoaded then - LoadPHP; - - if PHPLoaded then - begin - try - PrepareStartup; - tsrm_startup(128, 1, TSRM_ERROR_LEVEL_CORE, 'TSRM.log'); - sapi_startup(@delphi_sapi_module); - p := @php_delphi_module; - php_module_startup(@delphi_sapi_module, p, 1); - zend_alter_ini_entry('register_argc_argv', 19, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - zend_alter_ini_entry('register_globals', 17, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - zend_alter_ini_entry('max_input_time', 15, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - except - end; - end; - - IsMultiThread := true; - DLLProc := @DLLExitProc; - -end; - -procedure StopEngine; -begin - if PHPLoaded then - begin - try - delphi_sapi_module.shutdown(@delphi_sapi_module); - sapi_shutdown; - tsrm_shutdown(); - except - end; - end; -end; - - -end. +{*******************************************************} +{ PHP4Applications } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{$I PHP.INC} + +{ $Id: php4AppUnit.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit php4AppUnit; + +interface +uses + Windows, + SysUtils, + Classes, + ZendTypes, + phpTypes, + PHPAPI, + ZENDAPI; + +const + REQUEST_ID_NOT_FOUND = -1; + VARIABLE_NOT_FOUND = -2; + ERROR_CREATE_PIPE = -3; + SCRIPT_IS_EMPTY = -4; + +type + + TPHPInfoBlock = class + private + FBuffer : AnsiString; + FVarList : TStringList; + {$IFDEF PHP5} + FVirtualStream : TMemoryStream; + {$ENDIF} + procedure SetVarList(AValue : TStringList); + public + constructor Create; virtual; + destructor Destroy; override; + property Buffer : AnsiString read FBuffer write FBuffer; + property VarList : TStringList read FVarList write SetVarList; + end; + +function InitRequest : integer; stdcall; +procedure DoneRequest(RequestID : integer); stdcall; + +procedure RegisterVariable(RequestID : integer; AName : PAnsiChar; AValue : PAnsiChar); stdcall; +function ExecutePHP(RequestID : integer; FileName : PAnsiChar) : integer; stdcall; +function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; +function GetResultText(RequestID : integer; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; +function GetVariable(RequestID : integer; AName : PAnsiChar; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; +procedure SaveToFile(RequestID : integer; AFileName : PAnsiChar); stdcall; +function GetVariableSize(RequestID : integer; AName : PAnsiChar) : integer; stdcall; +function GetResultBufferSize(RequestID : integer) : integer; stdcall; + +procedure PrepareStartup; + +procedure InitEngine; + +procedure StopEngine; + +implementation + +var + delphi_sapi_module : sapi_module_struct; + php_delphi_module : Tzend_module_entry; + +procedure php_info_delphi(zend_module : Pointer; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('SAPI module version'), PAnsiChar('PHP4Delphi 7.4 Oct 2009')); + php_info_print_table_row(2, PAnsiChar('Home page'), PAnsiChar('http://users.telenet.be/ws36637')); + php_info_print_table_end(); +end; + +function php_delphi_startup(sapi_module : Psapi_module_struct) : integer; cdecl; +begin + result := php_module_startup(sapi_module, nil, 0); +end; + +function php_delphi_deactivate(p : pointer) : integer; cdecl; +begin + result := 0; +end; + + +function php_delphi_ub_write(str : PAnsiChar; len : uint; p : pointer) : integer; cdecl; +var + s : AnsiString; + php : TPHPInfoBlock; + gl : psapi_globals_struct; +begin + Result := 0; + gl := GetSAPIGlobals; + if Assigned(gl) then + begin + php := TPHPInfoBlock(gl^.server_context); + if Assigned(php) then + begin + SetLength(s, len); + Move(str^, s[1], len); + try + php.FBuffer := php.FBuffer + s; + except + s := ''; + end; + result := len; + end; + end; + s := ''; +end; + +procedure php_delphi_flush(p : pointer); cdecl; +begin +end; + +procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; +var + cnt : integer; + InfoBlock : TPHPInfoBlock; + gl : psapi_globals_struct; +begin + gl := GetSAPIGlobals; + InfoBlock := TPHPInfoBlock(gl^.server_context); + php_register_variable('SERVER_NAME','DELPHI', val, p); + php_register_variable('SERVER_SOFTWARE', 'Delphi', val, p); + if Assigned(InfoBlock) then + try + for cnt := 0 to InfoBlock.VarList.Count - 1 do + begin + php_register_variable(PAnsiChar(InfoBlock.VarList.Names[cnt]), + PAnsiChar(InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]]), val, p); + end; + except + end; +end; + + +procedure php_delphi_send_header(p1, p2, p3 : pointer); cdecl; +begin + // +end; + +function php_delphi_read_cookies(p1 : pointer) : pointer; cdecl; +begin + result := nil; +end; + + +procedure PrepareStartup; +begin + delphi_sapi_module.name := 'embed'; (* name *) + delphi_sapi_module.pretty_name := 'PHP for Delphi'; (* pretty name *) + delphi_sapi_module.startup := php_delphi_startup; (* startup *) + delphi_sapi_module.shutdown := php_module_shutdown_wrapper; (* shutdown *) + delphi_sapi_module.activate:= nil; (* activate *) + delphi_sapi_module.deactivate := @php_delphi_deactivate; (* deactivate *) + delphi_sapi_module.ub_write := @php_delphi_ub_write; (* unbuffered write *) + delphi_sapi_module.flush := @php_delphi_flush; + delphi_sapi_module.stat:= nil; + delphi_sapi_module.getenv:= nil; + delphi_sapi_module.sapi_error := @zend_error; (* error handler *) + delphi_sapi_module.header_handler := nil; + delphi_sapi_module.send_headers := nil; + delphi_sapi_module.send_header := @php_delphi_send_header; + delphi_sapi_module.read_post := nil; + delphi_sapi_module.read_cookies := @php_delphi_read_cookies; + delphi_sapi_module.register_server_variables := @php_delphi_register_variables; (* register server variables *) + delphi_sapi_module.log_message := nil; (* Log message *) + delphi_sapi_module.php_ini_path_override := nil; + delphi_sapi_module.block_interruptions := nil; + delphi_sapi_module.unblock_interruptions := nil; + delphi_sapi_module.default_post_reader := nil; + delphi_sapi_module.treat_data := nil; + delphi_sapi_module.executable_location := nil; + delphi_sapi_module.php_ini_ignore := 0; + + php_delphi_module.size := sizeOf(Tzend_module_entry); + php_delphi_module.zend_api := ZEND_MODULE_API_NO; + php_delphi_module.zend_debug := 0; + php_delphi_module.zts := USING_ZTS; + php_delphi_module.name := 'php4delphi_support'; + php_delphi_module.functions := nil; + php_delphi_module.module_startup_func := nil; + php_delphi_module.module_shutdown_func := nil; + php_delphi_module.info_func := @php_info_delphi; + php_delphi_module.version := '7.4'; + {$IFDEF PHP4} + php_delphi_module.global_startup_func := nil; + {$ENDIF} + php_delphi_module.request_shutdown_func := nil; + {$IFDEF PHP5} + {$IFNDEF PHP520} + php_delphi_module.global_id := 0; + {$ENDIF} + {$ENDIF} + php_delphi_module.module_started := 0; + php_delphi_module._type := 0; + php_delphi_module.handle := nil; + php_delphi_module.module_number := 0; + + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + php_delphi_module.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + php_delphi_module.build_id := DupStr(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + +end; + + + +procedure PrepareResult(RequestID : integer; TSRMLS_D : pointer); +var + ht : PHashTable; + data: ^ppzval; + cnt : integer; + InfoBlock : TPHPInfoBlock; + {$IFDEF PHP5} + EG : pzend_executor_globals; + {$ENDIF} + +begin + InfoBlock := TPHPInfoBlock(RequestID); + + {$IFDEF PHP4} + ht := GetSymbolsTable + {$ELSE} + begin + EG := GetExecutorGlobals; + if Assigned(EG) then + ht := @EG.symbol_table + else + ht := nil; + end ; + {$ENDIF} + + if Assigned(ht) then + begin + for cnt := 0 to InfoBlock.VarList.Count - 1 do + begin + new(data); + try + if zend_hash_find(ht, PAnsiChar(InfoBlock.VarList.Names[cnt]), + strlen(PAnsiChar(InfoBlock.VarList.Names[cnt])) + 1, data) = SUCCESS then + case data^^^._type of + IS_STRING : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := data^^^.value.str.val; + IS_LONG, + IS_RESOURCE, + IS_BOOL : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := IntToStr(data^^^.value.lval); + IS_DOUBLE : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := FloatToStr(data^^^.value.dval); + end; + finally + freemem(data); + end; + end; + end; +end; + +function ExecutePHP(RequestID : integer; FileName : PAnsiChar) : integer; stdcall; +var + file_handle : zend_file_handle; + TSRMLS_D : pointer; + gl : psapi_globals_struct; +begin + if RequestID <= 0 then + begin + Result := REQUEST_ID_NOT_FOUND; + Exit; + end; + + try + TSRMLS_D := ts_resource_ex(0, nil); + + ZeroMemory(@file_handle, sizeof(zend_file_handle)); + + file_handle._type := ZEND_HANDLE_FILENAME; + file_handle.filename := FileName; + file_handle.opened_path := nil; + file_handle.free_filename := 0; + file_handle.handle.fp := nil; + + PG(TSRMLS_D)^.register_globals := true; + gl := GetSAPIGlobals; + TPHPInfoBlock(RequestID).FBuffer := ''; + gl^.server_context := pointer(RequestID); + gl^.sapi_headers.http_response_code := 200; + gl^.request_info.request_method := 'GET'; + + php_request_startup(TSRMLS_D); + result := php_execute_script(@file_handle, TSRMLS_D); + {$IFDEF PHP5} + zend_destroy_file_handle(@file_handle, TSRMLS_D); + {$ENDIF} + PrepareResult(RequestID, TSRMLS_D); + php_request_shutdown(nil); + except + result := FAILURE; + end; +end; + +{$IFDEF PHP5} + +{PHP 5 only} +function delphi_stream_reader (handle : pointer; buf : PAnsiChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS = nil then + result := 0 + else + try + result := MS.Read(buf^, len); + except + result := 0; + end; +end; + +{PHP 5 only} +procedure delphi_stream_closer(handle : pointer; TSRMLS_DC : pointer); cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + MS.Clear; + except + end; +end; + +{$IFDEF PHP530} +function delphi_stream_fsizer(handle : pointer; TSRMLS_DC : pointer) : size_t; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + result := MS.Size; + except + Result := 0; + end + else + Result := 0; +end; +{$ELSE} +{$IFDEF PHP510} + +{ PHP 5.10 and higher } +function delphi_stream_teller(handle : pointer; TSRMLS_DC : pointer) : longint; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + result := MS.Size; + except + Result := 0; + end + else + Result := 0; +end; +{$ENDIF} +{$ENDIF} +{$ENDIF} + + +{$IFDEF PHP4} +function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; +var + file_handle : zend_file_handle; + TSRMLS_D : pointer; + _handles : array[0..1] of THandle; + _code : AnsiString; + gl : psapi_globals_struct; +begin + if RequestID <= 0 then + begin + Result := REQUEST_ID_NOT_FOUND; + Exit; + end; + + if ACode = nil then + begin + Result := SCRIPT_IS_EMPTY; + Exit; + end; + + if pipe(@_handles, Length(ACode) + 512, 0) = -1 then + begin + Result := ERROR_CREATE_PIPE; + Exit; + end; + + _code := ACode; + if Pos('', _Code) = 0 then + _Code := _Code + ' ?>'; + + _write(_handles[1], @_Code[1], Length(_Code)); + close(_handles[1]); + + + TSRMLS_D := ts_resource_ex(0, nil); + file_handle._type := ZEND_HANDLE_FD; + + PG(TSRMLS_D)^.register_globals := true; + gl := GetSAPIGlobals; + TPHPInfoBlock(RequestID).FBuffer := ''; + gl^.server_context := pointer(RequestID); + gl^.sapi_headers.http_response_code := 200; + gl^.request_info.request_method := 'GET'; + + file_handle.filename := '-'; + file_handle.opened_path := nil; + file_handle.free_filename := 0; + file_handle.handle.fd := _handles[0]; + php_request_startup(TSRMLS_D); + + result := php_execute_script(@file_handle, TSRMLS_D); + close(_handles[0]); + PrepareResult(RequestID, TSRMLS_D); + php_request_shutdown(nil); +end; +{$ELSE} +function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; +var + file_handle : zend_file_handle; + TSRMLS_D : pointer; + _code : AnsiString; + gl : psapi_globals_struct; + ZendStream : TZendStream; +begin + if RequestID <= 0 then + begin + Result := REQUEST_ID_NOT_FOUND; + Exit; + end; + + if ACode = nil then + begin + Result := SCRIPT_IS_EMPTY; + Exit; + end; + + _code := ACode; + if Pos('', _Code) = 0 then + _Code := _Code + ' ?>'; + + + ZeroMemory(@file_handle, sizeof(zend_file_handle)); + + ZeroMemory(@ZendStream, sizeof(ZendStream)); + ZendStream.reader := delphi_stream_reader; + ZendStream.closer := delphi_stream_closer; + {$IFDEF PHP530} + ZendStream.fsizer := delphi_stream_fsizer; + {$ELSE} + {$IFDEF PHP510} + ZendStream.fteller := delphi_stream_teller; + {$ENDIF} + ZendStream.interactive := 0; + {$ENDIF} + + + TSRMLS_D := ts_resource_ex(0, nil); + + PG(TSRMLS_D)^.register_globals := true; + gl := GetSAPIGlobals; + TPHPInfoBlock(RequestID).FBuffer := ''; + gl^.server_context := pointer(RequestID); + gl^.sapi_headers.http_response_code := 200; + gl^.request_info.request_method := 'GET'; + + ZendStream.handle := TPHPInfoBlock(RequestID).FVirtualStream; + + file_handle._type := ZEND_HANDLE_STREAM; + file_handle.opened_path := nil; + file_handle.filename := '-'; + file_handle.free_filename := 0; + file_handle.handle.stream := ZendStream; + + TPHPInfoBlock(RequestID).FVirtualStream.Clear; + TPHPInfoBlock(RequestID).FVirtualStream.Write(_code[1], Length(_code)); + TPHPInfoBlock(RequestID).FVirtualStream.Position := 0; + + php_request_startup(TSRMLS_D); + + result := php_execute_script(@file_handle, TSRMLS_D); + + PrepareResult(RequestID, TSRMLS_D); + php_request_shutdown(nil); +end; +{$ENDIF} + + +procedure RegisterVariable(RequestID : integer; AName : PAnsiChar; AValue : PAnsiChar); stdcall; +begin + try + TPHPInfoBlock(RequestID).VarList.Add(AName + '=' + AValue); + except + end; +end; + + +function GetResultText(RequestID : integer; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; +var + L : integer; +begin + if RequestID <= 0 then + begin + Result := REQUEST_ID_NOT_FOUND; + Exit; + end; + + try + L := Length(TPHPInfoBlock(RequestID).FBuffer)+1; + if L > BufLen then + begin + Result := L; + Exit; + end; + + StrLCopy(Buffer, PAnsiChar(TPHPInfoBlock(RequestID).FBuffer), BufLen -1); + TPHPInfoBlock(RequestID).FBuffer := ''; + Result := 0; + except + Result := REQUEST_ID_NOT_FOUND; + end; +end; + +function GetResultBufferSize(RequestID : integer) : integer; +var + L : integer; +begin + if RequestID <= 0 then + begin + Result := REQUEST_ID_NOT_FOUND; + Exit; + end; + + try + L := Length(TPHPInfoBlock(RequestID).FBuffer)+1; + Result := L; + except + Result := REQUEST_ID_NOT_FOUND; + end; +end; + +procedure SaveToFile(RequestID : integer; AFileName : PAnsiChar); +var + L : integer; + FS : TFileStream; +begin + if RequestID <= 0 then + begin + Exit; + end; + + try + FS := TFileStream.Create(AFileName, fmCreate); + try + L := Length(TPHPInfoBlock(RequestID).FBuffer); + FS.WriteBuffer(TPHPInfoBlock(RequestID).FBuffer[1], L); + finally + FS.Free; + end; + except + end; +end; + +function GetVariable(RequestID : integer; AName : PAnsiChar; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; +var + L : integer; + St : AnsiString; +begin + if RequestID <= 0 then + begin + Result := REQUEST_ID_NOT_FOUND; + Exit; + end; + + try + St := TPHPInfoBlock(RequestID).VarList.Values[AName]; + if St = '' then + begin + Result := VARIABLE_NOT_FOUND; + Exit; + end; + L := Length(St) +1 ; + if L > BufLen then + begin + Result := L; + Exit; + end; + + StrLCopy(Buffer, PAnsiChar(St), BufLen -1); + Result := 0; + except + Result := REQUEST_ID_NOT_FOUND; + end; +end; + +function GetVariableSize(RequestID : integer; AName : PAnsiChar) : integer; +var + L : integer; + St : AnsiString; +begin + if RequestID <= 0 then + begin + Result := REQUEST_ID_NOT_FOUND; + Exit; + end; + + try + St := TPHPInfoBlock(RequestID).VarList.Values[AName]; + if St = '' then + begin + Result := VARIABLE_NOT_FOUND; + Exit; + end; + L := Length(St) +1 ; + Result := L; + except + Result := REQUEST_ID_NOT_FOUND; + end; +end; + +{ TPHPInfoBlock } + +constructor TPHPInfoBlock.Create; +begin + inherited Create; + FBuffer := ''; + FVarList := TStringList.Create; + {$IFDEF PHP5} + FVirtualStream := TMemoryStream.Create; + {$ENDIF} +end; + +destructor TPHPInfoBlock.Destroy; +begin + FBuffer := ''; + FVarList.Free; + {$IFDEF PHP5} + if FVirtualStream <> nil then + FreeAndNil(FVirtualStream); + {$ENDIF} + inherited; +end; + +procedure TPHPInfoBlock.SetVarList(AValue: TStringList); +begin + FVarList.Assign(AValue); +end; + + +function InitRequest : integer; +var + InfoBlock : TPHPInfoBlock; +begin + InfoBlock := TPHPInfoBlock.Create; + Result := integer(InfoBlock); +end; + +procedure DoneRequest(RequestID : integer); +begin + if RequestID <= 0 then Exit; + + try + TPHPInfoBlock(RequestID).FBuffer := ''; + TPHPInfoBlock(RequestID).Free; + TPHPInfoBlock(RequestID) := nil; + except + end; +end; + + +procedure DLLExitProc(Reason: Integer); register; +begin + case Reason of + DLL_PROCESS_DETACH: StopEngine; + DLL_THREAD_DETACH : ts_free_thread(); + end; +end; + +procedure InitEngine; +var + p : pointer; +begin + + if not PHPLoaded then + LoadPHP; + + if PHPLoaded then + begin + try + PrepareStartup; + tsrm_startup(128, 1, TSRM_ERROR_LEVEL_CORE, 'TSRM.log'); + sapi_startup(@delphi_sapi_module); + p := @php_delphi_module; + php_module_startup(@delphi_sapi_module, p, 1); + zend_alter_ini_entry('register_argc_argv', 19, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + zend_alter_ini_entry('register_globals', 17, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + zend_alter_ini_entry('max_input_time', 15, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + except + end; + end; + + IsMultiThread := true; + DLLProc := @DLLExitProc; + +end; + +procedure StopEngine; +begin + if PHPLoaded then + begin + try + delphi_sapi_module.shutdown(@delphi_sapi_module); + sapi_shutdown; + tsrm_shutdown(); + except + end; + end; +end; + + +end. diff --git a/php4App_Icon.ico b/php4App_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1998c2db4f9d3c870f5dc2715f351a4b348b459b GIT binary patch literal 766 zcmaKqyK2KQ6o!A-#TrvnD4m*&9aB1V$dFEXfxdvdXz>yV#03xaH8JZaCjlJ?fc?;C-O)_f`S?P*r~7$R$;w zZCg65e6ZH7D0XLZLuhGwwO`8oKgTc4_%!^;O3X(t`#=H5K0(b9_ebO@ynz7=?O6L% zHBU?}oP~g?X@o;SVT|#dNiB6?Eu7?L=KY?v4*O}@V61iS>uK#aAZy{g7ETVlIO8&J z&f-gB>eGC3;}{|T%``^-h#c`e#cVNqqFW_8i>@D+>20m&E}jKxm^>tPHsEE+fwCy2 z8Iz??V1$c;8n`Qw6LVKCV+oLwayXjU6h`z)@o=X!7UKFb*jCwt)?I6hZ pK9d#jz6ORtU9wZB{X@>T7jqO9Z-Cb=u-PHn+A7}JRfo^d+HY9lw=e(z literal 0 HcmV?d00001 diff --git a/php4Applications/PHP 4.4.6/php4App.dll b/php4Applications/PHP 4.4.6/php4App.dll new file mode 100644 index 0000000000000000000000000000000000000000..9ed7aae13e758078b2a32fe309d14496fc7ee2de GIT binary patch literal 130560 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

>OxHsW$3p@T_rJw-hiSR#Zqvi2Cr!^_ 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 literal 0 HcmV?d00001 diff --git a/php4Applications/PHP 5.3.0/php4App.dll b/php4Applications/PHP 5.3.0/php4App.dll new file mode 100644 index 0000000000000000000000000000000000000000..2efba3b2800a05157f96211c84dacaadaa3fff8d GIT binary patch literal 135168 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

=dUG|zK|&3VZN*+_(L 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 + + {3581921A-45EA-4D27-A37C-57984B9B07D4} + php4DelphiD2005.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4DelphiD2005 + false + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + php4Delphi (design-time) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + true + false + true + 1058 + + + php4DelphiD2005_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiD2005_Icon.ico + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiD2005.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiD2005.dproj.local b/php4DelphiD2005.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiD2005.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiD2005.stat b/php4DelphiD2005.stat new file mode 100644 index 0000000..9ec5214 --- /dev/null +++ b/php4DelphiD2005.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=3 +StartTime=21.09.2018 3:07:29 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiD2005_Icon.ico b/php4DelphiD2005_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..93f732ed5ea2004cf8f8171acf70c3e56af1c26d GIT binary patch literal 766 zcmb7Cv2NTj3}u=E9t$IIGxo-=MsRR}4(%^^NR`isAo$4OhI0@cNT9<_LHZ*_hg~{A zroc$kG(jkHr&4?dp!t%2+?ZLymw`hFC(5eKH`^o6YH$bUus!aHDiCHh-thKoH*a>X z8@`d_cd7(CMSjDdKSF2mP^#C%=6Z;M#Gu4Rx6QW?%tK{nJgDkZ?8Cy9qan!SS~^5B z)2_`?)7_KnlIRJm10+U^~l=|F?9n7-Hu9W6#ZJ|ptAgJz2Zu>gd zyq0@#=(+Er#grs^0Qh%ZotvvDL-%9mDiJ=lz38gZ`u5WLG$0|0sEAjKUUVJ+9OqZD zc + + {B5F683C3-1A4A-48DA-A0EF-BF1761607FB3} + php4DelphiD2007.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 0 + php4DelphiD2007 + RELEASE;$(DCC_Define) + true + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + false + 0 + false + php4Delphi (design-time) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + true + false + false + 1058 + true + + + php4DelphiD2007_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiD2007_Icon.ico + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiD2007.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiD2007.dproj.local b/php4DelphiD2007.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiD2007.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiD2007.res b/php4DelphiD2007.res new file mode 100644 index 0000000000000000000000000000000000000000..1da216a9d0c902a7ee90f479e05422e8879cb191 GIT binary patch literal 1560 zcmb7DQA<=o6#iBhHVDei7V)ViBBF2akur;H+w1l2jQQY3$P6U- zB=$$52MPAEpCRz%s1zo@0>ID4ggf?&SlQ&A^X~s$9u^s z_*h@xU@<3M;-pHyNiU$g%st0j8{mU>I~(}sl-@?C(_ui0kilgG-&tL{dJ5R?kn_cnnNfl|h*mRf%o_|1Y%OU>!M4=8Ew)cPm+>N?{}iA64$AH8%M-y zXN?(J+HJ={&4!kMrZ-X>$Mv+P?Y6b4)f>)LhDU7}#5$p<*>GvCUQWwuRKFo+Jgobs`i-{HfZ)=$ z#9f+hmSe(Zi3!LS>lX|W*z{OVjK@iw#`SVVv2$YC;2cj$U{gMaVCUGLm9N7C&lVV$ zFbRGk?S}mVi%2te#$YDNMRT3(*Z9SGO8-IMr+2#E<|zKZ*5+?3-T`{W_gN^lPcz3k z<{Ih>+fCaJN7PZ^^8zz z7SovL`!*hOcGqW^_xbK{F7~PT{kQ04E-Tr+9Fr-nNY7S0^sjGzVH&Gg!E-dQggYFU zu}I|xp5hf*pFL*?BdFmTyB%Q-!(5-h8S0Ib^Ab%gkiW*R7l;OX@A9Flfs3AVkMSiRl@6QiK~89inOA*g;PMgPBQh57g!^7{T)_+W zl3T`|>}tqKOWwS1LHViWHBOQHifReZWA#Xd;7Lf|hdD>PKid0*FJ{))mS_I=m4OTX T56QY{u=Zs#4}OEe;+NtdNbG&p literal 0 HcmV?d00001 diff --git a/php4DelphiD2007.stat b/php4DelphiD2007.stat new file mode 100644 index 0000000..6bfe8ad --- /dev/null +++ b/php4DelphiD2007.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=3 +StartTime=21.09.2018 3:07:40 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiD2007_Icon.ico b/php4DelphiD2007_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..93f732ed5ea2004cf8f8171acf70c3e56af1c26d GIT binary patch literal 766 zcmb7Cv2NTj3}u=E9t$IIGxo-=MsRR}4(%^^NR`isAo$4OhI0@cNT9<_LHZ*_hg~{A zroc$kG(jkHr&4?dp!t%2+?ZLymw`hFC(5eKH`^o6YH$bUus!aHDiCHh-thKoH*a>X z8@`d_cd7(CMSjDdKSF2mP^#C%=6Z;M#Gu4Rx6QW?%tK{nJgDkZ?8Cy9qan!SS~^5B z)2_`?)7_KnlIRJm10+U^~l=|F?9n7-Hu9W6#ZJ|ptAgJz2Zu>gd zyq0@#=(+Er#grs^0Qh%ZotvvDL-%9mDiJ=lz38gZ`u5WLG$0|0sEAjKUUVJ+9OqZD zc + + {65B66BBA-1F79-4212-AC10-21298E0BC3B0} + php4DelphiD2009.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + 1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 1058 + true + php4DelphiD2009 + false + false + false + true + true + php4Delphi (design-time) + false + true + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + + + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + true + php4DelphiD2009_Icon.ico + 1033 + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + php4DelphiD2009_Icon.ico + + + RELEASE;$(DCC_Define) + false + 0 + 0 + + + DEBUG;$(DCC_Define) + true + false + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiD2009.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiD2009.dproj.local b/php4DelphiD2009.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiD2009.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiD2009.res b/php4DelphiD2009.res new file mode 100644 index 0000000000000000000000000000000000000000..b946c3cf4737f4cfe63fa0bc6b919aa29fe155e5 GIT binary patch literal 4396 zcmbW5y^ice5QS^C0g%83>OhncYij4bkxI`SUKc$3L2~0G z4YcQTpML1=@$u27Qd~1m`TfHO>$~2t3H`7cZ|8G;)&Iu_jKogOT=JO4$=9oRO{KR< z9Jb;r0;xCR}WxtJm8Xnv>Vt-cbiktZ1FiOkc<%53&Y;wHhS>xp3 zTJLU$Kl$`gG1!i*9w@DrX!}{(3e(c#p-ye$v@+KZ`w94sukAENCp7^IS`8)ZxqB>wRfSnxB4fhON9C+7S;u9;r(avLTvEx&7{Sa}x z%^Y)Z;GOzA_9*NFJf#Qe1N$O=E8Ez?m#|i-dHDJC*B`-Q4i0{1i~LAz0AD@!R2NL% z;p+IKY_J`qyAbl@@ynmbJHkQZS=fm7XYT7s^_rh8Ilu|bz{YRGmmPf%CVdcNa@=?x zq&w{!f&(#v;q_14xp7c`vgSFh)!^V`oe$>8p>qHmIYj*(Q{3Ui7_OcJVR| zjg@=t1BWxbV9Q_Bw8ftsx;1`sZt_d~Q-9N#GKq{u4LO zbKC(DzxM_>$Qo&Rv&%UHd*M)GOfI$$>zu3CI4nJX00S;teU43z*L#-n$^op)hdE^LEF>pt zgpJ=bUE-}ee)k%V`XRp~Q)j=sk4pl2XC6tstNIkbCG-X{k~i)|-r?xIr1|Z)oY%kQ zUS^x9iQwvMTuNhj-258El+ZItsh?Sg73oPshvqUybnA1B?q*} z_J%yT-Q04axT#J0Nx$#axgSkFUgh%i+kk&k9y$oDtGI0&l~X06BD`mLFLFRArw`^A2=pY2!4PxhO1 XKHL8__%}oUXWZZWzZ(1ta%2Ai-h(1$ literal 0 HcmV?d00001 diff --git a/php4DelphiD2009.stat b/php4DelphiD2009.stat new file mode 100644 index 0000000..7cf7048 --- /dev/null +++ b/php4DelphiD2009.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=3 +StartTime=21.09.2018 13:22:02 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiD2009_Icon.ico b/php4DelphiD2009_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..379ec80d91cd5bef25a44bb21ae1c40a278cd772 GIT binary patch literal 4286 zcmbW5J#OSi5QW>=U_(1{ItmS4g1!V}9;N3d++blCyaXpU6e=_@dxQ-)FhIZWRTs$_ zQLQs45wEHCWfF(Ina})Ode)6gDYWM$ z`da(ilNf!AOPu5~4YkC0g5>}zsRTQQFwaIk6Ia_!s-hw;D* z4$F-GYV1Yp_u8l7(Q8Bdv$RV$`r$CjE8hJ>d<<-IyyjW$2WzC1C;Lz8$&(dnV^yHs*_M0!evCMzyCP#I}Mi1k$e+_$(mafVo z?u4#EZTzU*p0uu0o@MMw(cCoiE^B0p-_xJteel6RbLgJRqBYqMe8sLZ;a>i}cs=^3 zI=N52OVvKGW&k@m;2Z7@wm8t&T;ijZ*m(1pn|5MqtRF(R*UT{n2m0*4u}5K_;3+@I zpLj3ym%7&uzKprbo=2STfBg|0=HTEnTNOuE2Jls5Ps@r)AFjq9wT88Wd>2N3tY7i0 zcZ7r5v#>F}pSfSI+OPS!BnLQw8Q8>a_*zHZgGn7kn;bWuC;3kA4Z#78V0ix%cWxY1 zpUgR@%TnOrw$2CRzVtLP-{@f$) z6M5EJaM0zw7eDS?pHty74mL5|KEUUF=erX>8C=3tf8xe@jyoXqyEecfA4A)tku}PH zMQh`rcH)OW*6;i)mN5tRHmpcLb9v`DN1BVemlt;Gr}kri^e*@^Fw>Z)&H1~@ecOkq zJMJ$yMl9l?-}|pNdYz|1@wJY5$D9Mp^LjV$M&|N7(00Eb<3~-SyX_tEr9bfv3pjQXKNPop-Pc{`-;TsMZTFw+PknNN!H@fkSm;8#xk)=YOs#n@#5dHIheLeT zLfmWUmmc8|KQu=DppS1L&bi0c=bl|e(Lk8{c67h zwDYcUO^BoGUbtDiVEMjjxLJc>^CXuee8#9n=eyhToq50U9lAq%o?Xrv*eiz`ZE~@H znCD!*#bK@a6BuyW`&(>syxp_3Hx6LkKa62VXCXPUN38KZ(K<9Dy&s2=h=GJV#& zW84!^pK&blUiH`bEul8hNZz;;>BG^rr1AZ?ocF)w-~f6ZS~*Z-)Y^MYYmKRzUbA73t|EE@br_Cxkv_Dyzac9zFJ`keLO4%nrXPuRCo TJ}dUm!Z-=56Xvp9J}v(Ob;cBC literal 0 HcmV?d00001 diff --git a/php4DelphiD2010.dpk b/php4DelphiD2010.dpk new file mode 100644 index 0000000..292313c --- /dev/null +++ b/php4DelphiD2010.dpk @@ -0,0 +1,46 @@ +package php4DelphiD2010; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (design-time)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + designide, + vclactnband, + vclx; + +contains + PHPProjectWizard in 'PHPProjectWizard.pas', + php4DelphiReg in 'php4DelphiReg.pas', + php4DelphiWeb in 'php4DelphiWeb.pas', + phpWeb in 'phpWeb.pas', + phpAbout in 'phpAbout.pas' { dlgAbout }; + +end. diff --git a/php4DelphiD2010.dproj b/php4DelphiD2010.dproj new file mode 100644 index 0000000..5fcb4e2 --- /dev/null +++ b/php4DelphiD2010.dproj @@ -0,0 +1,490 @@ + + + {34B23B2E-657F-42AF-9898-5D22792F862D} + php4DelphiD2010.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + 1 + php4Delphi (design-time) + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + php4DelphiD2010 + true + 1049 + false + true + true + false + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 00400000 + false + false + true + + + vcl;rtl;vclactnband;vclx;$(DCC_UsePackage) + php4DelphiD2010_Icon.ico + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + 0 + false + RELEASE;$(DCC_Define) + 0 + + + true + false + DEBUG;$(DCC_Define) + + + true + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + php4delphi;F:\переустановил\Рабочий стол 08.07.4016\soulengine-5554e3db061d08b94f439be26ed071a74c30071c;$(DCC_UnitSearchPath) + + + + MainSource + + + + + + + + + + + +
dlgAbout
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Package + + + + php4DelphiD2010.dpk + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + File C:\USERS\PUBLIC\DOCUMENTS\EMBARCADERO\STUDIO\18.0\bpl\dcllmdlegacy240.bpl not found + + + + True + + + + + 0 + .dll;.bpl + + + 1 + .dylib + + + + + Contents\Resources + 1 + + + + + classes + 1 + + + + + Contents\MacOS + 0 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + library\lib\mips + 1 + + + + + 1 + + + 1 + + + 0 + + + 1 + + + 1 + + + library\lib\armeabi-v7a + 1 + + + 1 + + + + + 0 + + + 1 + .framework + + + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + 1 + + + + + + library\lib\armeabi + 1 + + + + + 0 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-large + 1 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + res\drawable-hdpi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + + + Assets + 1 + + + Assets + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\values + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + res\drawable + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 0 + .bpl + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\drawable-ldpi + 1 + + + + + + + + + + + + + + 12 + + + + +
diff --git a/php4DelphiD2010.dproj.local b/php4DelphiD2010.dproj.local new file mode 100644 index 0000000..a169e93 --- /dev/null +++ b/php4DelphiD2010.dproj.local @@ -0,0 +1,6 @@ + + + + 1899.12.30 00:00:00.000.520,D:\переустановил\Рабочий стол 08.07.4016\soulengine-5554e3db061d08b94f439be26ed071a74c30071c\php4delphi\php4DelphiD2010.dproj=D:\переустановил\Рабочий стол 08.07.4016\soulengine-5554e3db061d08b94f439be26ed071a74c30071c\php4delphi\php4DelphiD2010.dproj + + diff --git a/php4DelphiD2010.identcache b/php4DelphiD2010.identcache new file mode 100644 index 0000000000000000000000000000000000000000..10669bf14451f14ef017b5cba3d9ab3359d767c1 GIT binary patch literal 286 zcmZQ$U|>*pwu(t9E>4Xp$S5#LNzEz9$czc_2nZ<3&q_@$3D2xbEK1QUNGt{_g##5V vdO+G;z}kaS)6q4^V%HF!nuM-W5xYvL%g|NhcL)~a<*^&@n3P{yf^IkfN?J}< literal 0 HcmV?d00001 diff --git a/php4DelphiD2010.res b/php4DelphiD2010.res new file mode 100644 index 0000000000000000000000000000000000000000..75bcc369c5c7cc311d8dee4817f06f1195671e3d GIT binary patch literal 4876 zcmbW5J#QUV5QfLZ5`+SbM1NgSpcKeRX^;>L;!BqJQsSF-6+(z2CAMTjz4xEo6bPaH z2}o#NBbP1_PC-vf3dHh0GiP?!H`l>trMYuH=FI!foH^&N*34{M()S^1o_Q7?%M;qE6@A(tsQ9oXSdn0>tgkeVR{2lkD9Z+C>cx@vXJd-mF}=AKsGwufT&k^8?RKM&>qu71DP%%MEq zmS=bzXq*Sj4WTfbOvlK~-tesKx#xYce;~_8lNhdU{;~Pfmf5!a^!=4#f3~*9{drS! z%)c+$@Rk}{^M9XtJ-5YTVQtg6rk(P`x6OItS<4rf-+zN;BzzYt2NBoUr_p+bH-qzRLHex?f?24QC;jomJztso- z2-xI!$g|qX!L|Bshd=r8{QDa6e{JAFjJ`+8K`UE0IFHk3<0q&1^f<7`pZgs1;Fy}5 zi$DJQUNP0!i34lIWh&0KQ|@I?+%33k;t#)p$36y!$g9saU`mRPn1aK+Df_Hg9WOQc zr=9(xZ8DbmkGRQEGhh=B{yR}|6*$;gAZY07z`t8W=iN9@H?~`w9v=7+SU?&H3!99a54)isb_{55D zwDagn?D*8!ypFitri(E+&}aW0dnxQ0Jf&;t8S5f`Yo@V-FJZ1>&%@8tUw;e^U2yO- z+sKc^YVcKK$NhjwAFhtSlnu7EbQMB=JbwA}c$aWcyAw8|^_lzrRQuJPSaN_9n1PMo zf-gJj9!%;W+T^(KoJm(&R|f}T1jF|~al67n^~s#)wC@cL-q!hGoE$m_u#s8pzhjC! zoM^+c`pPZZg5{GNaLa?F~&4Kc;f zT;4gJBh5wKOA9;Wr}kriv=)2`m?_ND=KP(>ec6YoJMJ$yhA;dPzwf`=#Oryg+z$eiM#9_{uO`XyYGS@*fHNWrGDi%@-J>0ODr_+2zP87^8lOk9Q!> zxsR*QJvG#(cwqxRcOd^&_)0!XqPJPQj>9wYQ=g~Wukt@YJMS8=332qg7jD)rSbpCW z+^j*cd6LUIe8#9n&v!NEJM(@=W!Tneg+0yrur;4 zIUes>+9L%JI_`b-K9G+JX z&+vlpz~i`_NjO{%JNYFCw8wUVJh)v~a-q1{oAi@@FRODsntVK$%ki<#W0&hLi+7%V z`n#w;&(G?3e`MBc@NdaqlBbdocLZ2OwBeN^W6SEiP`&D7ggjET%?~ktZ zuN&WN=)7W|+Xw#bXxBdUFG(8qXJ_(VgRdF-p0T~{Up4p&vSBaC>Rn0SzpO7gpUKOf be}B3mk9+Ffuut`MXis0L;+cNO+R)Iy*f(Ih literal 0 HcmV?d00001 diff --git a/php4DelphiD2010.stat b/php4DelphiD2010.stat new file mode 100644 index 0000000..8ce893a --- /dev/null +++ b/php4DelphiD2010.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=186 +DesignerSecs=1 +InspectorSecs=7 +CompileSecs=56046 +OtherSecs=326 +StartTime=29.07.4016 22:02:21 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiD2010_Icon.ico b/php4DelphiD2010_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..379ec80d91cd5bef25a44bb21ae1c40a278cd772 GIT binary patch literal 4286 zcmbW5J#OSi5QW>=U_(1{ItmS4g1!V}9;N3d++blCyaXpU6e=_@dxQ-)FhIZWRTs$_ zQLQs45wEHCWfF(Ina})Ode)6gDYWM$ z`da(ilNf!AOPu5~4YkC0g5>}zsRTQQFwaIk6Ia_!s-hw;D* z4$F-GYV1Yp_u8l7(Q8Bdv$RV$`r$CjE8hJ>d<<-IyyjW$2WzC1C;Lz8$&(dnV^yHs*_M0!evCMzyCP#I}Mi1k$e+_$(mafVo z?u4#EZTzU*p0uu0o@MMw(cCoiE^B0p-_xJteel6RbLgJRqBYqMe8sLZ;a>i}cs=^3 zI=N52OVvKGW&k@m;2Z7@wm8t&T;ijZ*m(1pn|5MqtRF(R*UT{n2m0*4u}5K_;3+@I zpLj3ym%7&uzKprbo=2STfBg|0=HTEnTNOuE2Jls5Ps@r)AFjq9wT88Wd>2N3tY7i0 zcZ7r5v#>F}pSfSI+OPS!BnLQw8Q8>a_*zHZgGn7kn;bWuC;3kA4Z#78V0ix%cWxY1 zpUgR@%TnOrw$2CRzVtLP-{@f$) z6M5EJaM0zw7eDS?pHty74mL5|KEUUF=erX>8C=3tf8xe@jyoXqyEecfA4A)tku}PH zMQh`rcH)OW*6;i)mN5tRHmpcLb9v`DN1BVemlt;Gr}kri^e*@^Fw>Z)&H1~@ecOkq zJMJ$yMl9l?-}|pNdYz|1@wJY5$D9Mp^LjV$M&|N7(00Eb<3~-SyX_tEr9bfv3pjQXKNPop-Pc{`-;TsMZTFw+PknNN!H@fkSm;8#xk)=YOs#n@#5dHIheLeT zLfmWUmmc8|KQu=DppS1L&bi0c=bl|e(Lk8{c67h zwDYcUO^BoGUbtDiVEMjjxLJc>^CXuee8#9n=eyhToq50U9lAq%o?Xrv*eiz`ZE~@H znCD!*#bK@a6BuyW`&(>syxp_3Hx6LkKa62VXCXPUN38KZ(K<9Dy&s2=h=GJV#& zW84!^pK&blUiH`bEul8hNZz;;>BG^rr1AZ?ocF)w-~f6ZS~*Z-)Y^MYYmKRzUbA73t|EE@br_Cxkv_Dyzac9zFJ`keLO4%nrXPuRCo TJ}dUm!Z-=56Xvp9J}v(Ob;cBC literal 0 HcmV?d00001 diff --git a/php4DelphiD5.dpk b/php4DelphiD5.dpk index 5815d67..48e15ec 100644 --- a/php4DelphiD5.dpk +++ b/php4DelphiD5.dpk @@ -1,8 +1,9 @@ -package php4DelphiD5; - -{$R *.RES} +package php4DelphiD5; + +{$R *.res} {$R 'php4delphi.dcr'} -{$ALIGN ON} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} {$DEBUGINFO ON} @@ -12,31 +13,33 @@ package php4DelphiD5; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST ON} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (Design)'} {$DESIGNONLY} {$IMPLICITBUILD OFF} -requires - vcl50, +requires + vcl, php4DelphiR5, dsnide50; -contains +contains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', phpAbout in 'phpAbout.pas' {dlgAbout}, phpWeb in 'phpWeb.pas', php4DelphiWeb in 'php4DelphiWeb.pas'; -end. +END. diff --git a/php4DelphiD5.dproj b/php4DelphiD5.dproj new file mode 100644 index 0000000..4eee329 --- /dev/null +++ b/php4DelphiD5.dproj @@ -0,0 +1,133 @@ + + + {5CE4325A-009D-4F8F-9CE1-98445D950FC6} + php4DelphiD5.dpk + True + Debug + 1 + Package + None + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4DelphiD5 + false + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + false + php4Delphi (Design) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + 1058 + true + true + true + + + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + php4DelphiD5_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiD5_Icon.ico + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + + + + + +
dlgAbout
+
+ + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Package + + + + php4DelphiD5.dpk + + + + False + True + False + + + 12 + + + +
diff --git a/php4DelphiD5.dproj.local b/php4DelphiD5.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiD5.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiD5.res b/php4DelphiD5.res index 4aa33a29f5409f6507d2199b5dd35f0dda13b311..502c3d69020e32a05f49ec990b6c0215f883acc0 100644 GIT binary patch delta 311 zcmZqRIm10cL6L!pfkA4k*Dm`7N`&v=xX2 zRABvXE02FayNM*3eQ9+E6bECN^GqZsJ=VX6oSqGqZ8Ek;~|9>u^Ej|p63?U3|4E_v3 X48A~?Ban7ya0Rl0!KR^x1t@d?9g#6S delta 347 zcmX@Z-M}+JVX_007^CFoa3)b^W&r`o$@#3Zj3pBlg?WJ-76vFNndlhJdWjLpo48Qk zejSLxV8CF)V8~zzrd=6~fg(x_j6mqjkk63IP{5GLkjGHT;0L608B#$Sz(9+EapG;& z$r6kv^$_KrKxHLB1w}wQks$|7gBsXKAE10XSQcb>0npeYhD@MH22dy5SfEOTx)7j> zM1~ZgzFZ((#E{KU3{}a%0CWNn`fET9$%I<$1~f7Ur~%{*go}ZWob1miJGq6?LQx8= a5#m3P3XsEL#=3xvpUlW)%_7P2m<0eH?lhhN diff --git a/php4DelphiD5.stat b/php4DelphiD5.stat new file mode 100644 index 0000000..3137e8d --- /dev/null +++ b/php4DelphiD5.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=80 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=8334 +OtherSecs=82 +StartTime=21.09.2018 3:07:20 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiD5_Icon.ico b/php4DelphiD5_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1998c2db4f9d3c870f5dc2715f351a4b348b459b GIT binary patch literal 766 zcmaKqyK2KQ6o!A-#TrvnD4m*&9aB1V$dFEXfxdvdXz>yV#03xaH8JZaCjlJ?fc?;C-O)_f`S?P*r~7$R$;w zZCg65e6ZH7D0XLZLuhGwwO`8oKgTc4_%!^;O3X(t`#=H5K0(b9_ebO@ynz7=?O6L% zHBU?}oP~g?X@o;SVT|#dNiB6?Eu7?L=KY?v4*O}@V61iS>uK#aAZy{g7ETVlIO8&J z&f-gB>eGC3;}{|T%``^-h#c`e#cVNqqFW_8i>@D+>20m&E}jKxm^>tPHsEE+fwCy2 z8Iz??V1$c;8n`Qw6LVKCV+oLwayXjU6h`z)@o=X!7UKFb*jCwt)?I6hZ pK9d#jz6ORtU9wZB{X@>T7jqO9Z-Cb=u-PHn+A7}JRfo^d+HY9lw=e(z literal 0 HcmV?d00001 diff --git a/php4DelphiD6.dpk b/php4DelphiD6.dpk index 7286d67..7c1f4c3 100644 --- a/php4DelphiD6.dpk +++ b/php4DelphiD6.dpk @@ -1,7 +1,8 @@ -package php4DelphiD6; - -{$R *.res} +package php4DelphiD6; + +{$R *.res} {$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -12,31 +13,33 @@ package php4DelphiD6; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi'} {$DESIGNONLY} {$IMPLICITBUILD OFF} -requires +rrequires rtl, designide, php4DelphiR6; -contains +ocontains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', phpWeb in 'phpWeb.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpAbout in 'phpAbout.pas' {dlgAbout}; -end. +d. diff --git a/php4DelphiD6.dproj b/php4DelphiD6.dproj new file mode 100644 index 0000000..e0f7376 --- /dev/null +++ b/php4DelphiD6.dproj @@ -0,0 +1,110 @@ + + + {AFE103A5-8E11-472A-A798-9F32AC9C090F} + php4DelphiD6.dpk + True + Debug + 1 + Package + None + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4Delphi + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + php4DelphiD6 + true + 1049 + false + true + true + false + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 00400000 + false + false + true + + + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar + + + php4DelphiD6_Icon.ico + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + 0 + false + RELEASE;$(DCC_Define) + 0 + + + true + false + DEBUG;$(DCC_Define) + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiD6.dpk + + + + False + True + + + 12 + + + + diff --git a/php4DelphiD6.dproj.local b/php4DelphiD6.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiD6.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiD6.stat b/php4DelphiD6.stat new file mode 100644 index 0000000..5f3a5ae --- /dev/null +++ b/php4DelphiD6.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=2 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=3 +StartTime=21.09.2018 3:07:24 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiD6_Icon.ico b/php4DelphiD6_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1998c2db4f9d3c870f5dc2715f351a4b348b459b GIT binary patch literal 766 zcmaKqyK2KQ6o!A-#TrvnD4m*&9aB1V$dFEXfxdvdXz>yV#03xaH8JZaCjlJ?fc?;C-O)_f`S?P*r~7$R$;w zZCg65e6ZH7D0XLZLuhGwwO`8oKgTc4_%!^;O3X(t`#=H5K0(b9_ebO@ynz7=?O6L% zHBU?}oP~g?X@o;SVT|#dNiB6?Eu7?L=KY?v4*O}@V61iS>uK#aAZy{g7ETVlIO8&J z&f-gB>eGC3;}{|T%``^-h#c`e#cVNqqFW_8i>@D+>20m&E}jKxm^>tPHsEE+fwCy2 z8Iz??V1$c;8n`Qw6LVKCV+oLwayXjU6h`z)@o=X!7UKFb*jCwt)?I6hZ pK9d#jz6ORtU9wZB{X@>T7jqO9Z-Cb=u-PHn+A7}JRfo^d+HY9lw=e(z literal 0 HcmV?d00001 diff --git a/php4DelphiD7.dpk b/php4DelphiD7.dpk index a6be64c..30cc098 100644 --- a/php4DelphiD7.dpk +++ b/php4DelphiD7.dpk @@ -1,7 +1,8 @@ -package php4DelphiD7; - -{$R *.res} +package php4DelphiD7; + +{$R *.res} {$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -12,22 +13,24 @@ package php4DelphiD7; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (design-time)'} {$DESIGNONLY} {$IMPLICITBUILD OFF} -requires +rrequires rtl, vcl, designide, @@ -35,11 +38,11 @@ requires vclx, php4DelphiR7; -contains +ocontains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpWeb in 'phpWeb.pas', phpAbout in 'phpAbout.pas' {dlgAbout}; -end. +d. diff --git a/php4DelphiD7.dproj b/php4DelphiD7.dproj new file mode 100644 index 0000000..e8c52f4 --- /dev/null +++ b/php4DelphiD7.dproj @@ -0,0 +1,123 @@ + + + {06AB7031-6133-45D0-A8EC-0C226E0BE2BD} + php4DelphiD7.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 00400000 + false + 1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 1058 + true + php4DelphiD7 + false + false + false + true + true + php4Delphi (design-time) + false + true + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + + + true + php4DelphiD7_Icon.ico + 1033 + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + php4DelphiD7_Icon.ico + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + RELEASE;$(DCC_Define) + false + 0 + 0 + + + DEBUG;$(DCC_Define) + true + false + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiD7.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiD7.dproj.local b/php4DelphiD7.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiD7.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiD7.stat b/php4DelphiD7.stat new file mode 100644 index 0000000..4babac3 --- /dev/null +++ b/php4DelphiD7.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=2 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=55 +StartTime=21.09.2018 13:19:38 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiD7_Icon.ico b/php4DelphiD7_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cfd8992a5b8ff4b89478d89e93ae9205bb8125ef GIT binary patch literal 766 zcmZvaJxjw-6o%h^fPsh~i*;)WQr#qE6x5;U{}5?bDU!Qs#KAy@{*{(2!dc?v-w<3J zyH!xUzUL;X9X!dK+~<6Tdjqt14F+APeYAl+zK^H@bxyTV#lYDAmIAzyrqzp2E~yk{ zSu$YV4Qq8p@lqEbez>c)L$@gg8}<%Oa6GG-Tha@RIgpyYyx3_6 z0sK0F9J)}Gz=q1c)CrmBhWa9M&IR0YL{dad6xMSUMJ!a-f}CrS zObTrz@|^QLXnD=E3VB8v_nQw=P@5rbS=*@WSgTre9_?ZacCm^3g@?0G70_3Gujz+t p>P*GoN!7Oxk5il4S6hB}YQS~ZBQNRfhwsN>Ye}J@)z3c!&m?S literal 0 HcmV?d00001 diff --git a/php4DelphiR2005.dpk b/php4DelphiR2005.dpk index 96903d9..5b88e5d 100644 --- a/php4DelphiR2005.dpk +++ b/php4DelphiR2005.dpk @@ -1,7 +1,8 @@ -package php4DelphiR2005; - -{$R *.res} +package php4DelphiR2005; + +{$R *.res} {$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -12,37 +13,39 @@ package php4DelphiR2005; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (run-rime)'} {$RUNONLY} {$IMPLICITBUILD OFF} -requires +rrequires rtl, vcl; -contains - zendAPI in 'ZENDAPI.pas', +ocontains + ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', - phpAPI in 'PHPAPI.pas', + PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', - phpLibrary in 'PHPLibrary.pas', - PHPCustomLibrary in 'phpCustomLibrary.pas', - phpFunctions in 'PHPFunctions.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -end. +d. diff --git a/php4DelphiR2005.dproj b/php4DelphiR2005.dproj new file mode 100644 index 0000000..b5a12fd --- /dev/null +++ b/php4DelphiR2005.dproj @@ -0,0 +1,123 @@ + + + {B60FB687-261B-4969-AAC4-3B0E2B26B5F7} + php4DelphiR2005.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4DelphiR2005 + false + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + php4Delphi (run-rime) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + 1058 + false + true + true + + + php4DelphiR2005_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiR2005_Icon.ico + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiR2005.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiR2005.dproj.local b/php4DelphiR2005.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiR2005.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiR2005.stat b/php4DelphiR2005.stat new file mode 100644 index 0000000..55185f1 --- /dev/null +++ b/php4DelphiR2005.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=1 +StartTime=21.09.2018 3:08:04 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiR2005_Icon.ico b/php4DelphiR2005_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..93f732ed5ea2004cf8f8171acf70c3e56af1c26d GIT binary patch literal 766 zcmb7Cv2NTj3}u=E9t$IIGxo-=MsRR}4(%^^NR`isAo$4OhI0@cNT9<_LHZ*_hg~{A zroc$kG(jkHr&4?dp!t%2+?ZLymw`hFC(5eKH`^o6YH$bUus!aHDiCHh-thKoH*a>X z8@`d_cd7(CMSjDdKSF2mP^#C%=6Z;M#Gu4Rx6QW?%tK{nJgDkZ?8Cy9qan!SS~^5B z)2_`?)7_KnlIRJm10+U^~l=|F?9n7-Hu9W6#ZJ|ptAgJz2Zu>gd zyq0@#=(+Er#grs^0Qh%ZotvvDL-%9mDiJ=lz38gZ`u5WLG$0|0sEAjKUUVJ+9OqZD zc - - - - - - - - - - - php4DelphiR2006.dpk - - - 7.0 - - - 8 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - True - True - True - - - - 0 - 0 - False - 1 - False - False - False - 16384 - 1048576 - 4194304 - php4Delphi (run-rime) - - - - - - - - - - - False - - - - - - False - - - True - False - - - - $00000000 - - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 2067 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - + + + + + + + + + + + + php4DelphiR2006.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + php4Delphi (run-rime) + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + diff --git a/php4DelphiR2006.dpk b/php4DelphiR2006.dpk index 140e114..d011f16 100644 --- a/php4DelphiR2006.dpk +++ b/php4DelphiR2006.dpk @@ -1,7 +1,8 @@ -package php4DelphiR2006; - -{$R *.res} +package php4DelphiR2006; + +{$R *.res} {$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -12,26 +13,28 @@ package php4DelphiR2006; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (run-rime)'} {$RUNONLY} {$IMPLICITBUILD OFF} -requires +rrequires rtl, vcl; -contains +ocontains ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', @@ -45,4 +48,4 @@ contains phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -end. +d. diff --git a/php4DelphiR2006.dproj b/php4DelphiR2006.dproj new file mode 100644 index 0000000..52e1216 --- /dev/null +++ b/php4DelphiR2006.dproj @@ -0,0 +1,123 @@ + + + {479F2E96-13D0-45DE-8D89-01EF0131F196} + php4DelphiR2006.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + php4DelphiR2006 + 1 + false + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + php4Delphi (run-rime) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + false + true + 2057 + false + true + true + + + php4DelphiR2006_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiR2006_Icon.ico + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiR2006.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiR2006.dproj.local b/php4DelphiR2006.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiR2006.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiR2006.stat b/php4DelphiR2006.stat new file mode 100644 index 0000000..3cba0bc --- /dev/null +++ b/php4DelphiR2006.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=1 +StartTime=21.09.2018 3:08:05 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiR2006_Icon.ico b/php4DelphiR2006_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..93f732ed5ea2004cf8f8171acf70c3e56af1c26d GIT binary patch literal 766 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 CiND+c literal 0 HcmV?d00001 diff --git a/php4DelphiR2007.dpk b/php4DelphiR2007.dpk new file mode 100644 index 0000000..bd7459e --- /dev/null +++ b/php4DelphiR2007.dpk @@ -0,0 +1,51 @@ +package php4DelphiR2007; + +{$R *.res} +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (run-rime)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +rrequires + rtl, + vcl; + +ocontains + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + PHPCommon in 'PHPCommon.pas'; + +d. diff --git a/php4DelphiR2007.dproj b/php4DelphiR2007.dproj new file mode 100644 index 0000000..c16b729 --- /dev/null +++ b/php4DelphiR2007.dproj @@ -0,0 +1,123 @@ + + + {21B4A370-210E-4033-83C7-D550746F03A9} + php4DelphiR2007.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4DelphiR2007 + false + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + php4Delphi (run-rime) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + 1058 + false + true + true + + + php4DelphiR2007_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiR2007_Icon.ico + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiR2007.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiR2007.dproj.local b/php4DelphiR2007.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiR2007.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiR2007.res b/php4DelphiR2007.res new file mode 100644 index 0000000000000000000000000000000000000000..301eb1c69cbbdbf41b560e43f03f330aa3737c04 GIT binary patch literal 1556 zcmb7DL2DC16n<#~u?X5wL(z*tM8tzMG<6jZRay%LwXU_<-b&Hh7SlA_&1Rrr=OB*Xo84{G;>Aba&V2K}dGC8O86u)G+}gx3J!RhqviKl4 zITsrqzMRiUH!&&0AHZ{zE@RKXtxJR-b-T%cFQ)J=^?E%7SOgC?8SqVX@ghtJA%j{h zf*?qtP)dl!&Y^J8fC)kbox@$C0)P-oi?-;z_uOX2sx21f;YTV+?3D5s_~Jg|LUJml z7UK3o90nvcB4J5&N+0eD5f`-9B34Qrgnp1&H3eiwzn zVt*SI+S2YtUPT8Q048^gjw0Vwq~6ooXt`r;X?#KlUL<2ARXf&H{Gus}3HcTnapQZT z4x>nhoB({!E1J@HC}Z!F!%BwW6m=F?D%5^uRQpkkg4SAvd_}27JWc=%{YvU^lyPB? z^jURhT{Y_kzXtcbPmiLti>rYZ1Qz5wifMaz8xHRvVb^; zL2wHu4Z8)1FbO+hpc2=D*H-N|AZgGd#QIZvj4Aj@wa8~5e>2*K`3%xM2)Mc zHR+y3Z_r*MqA|F&7w8E+q*;0jpQ1U8nf1R5ehoP)m-Fsb@GHuZK7LEXeQ#+fpY7KJ zRZMF%PfPedqUV^+x(Z9K-VEk!pYuQda6U+NI2$KZ#0is^nl51Y<`(9uMO(B^4O*oc zjCEQ;<_5i{O>n+A&KOnE={&Vw|JpPQ)xjt?U+%2$AI3C>wCv&1}E;nm$Ic@`b>Zeo@ z-Ef@8h_AXRchH1(K7m!JY^Bu`ohQ5(U@X%s?AyS&MQ@-avxGaB=HQd$y4hJW%1$NI z_zc`lWQ);z>x@Fesd3+@IcK{++xr#QS8^X*jn5!cIPHYiobF83$qf@-C;oRN9X7D5 N4rc#d4CTM({{pNVdKdrz literal 0 HcmV?d00001 diff --git a/php4DelphiR2007.stat b/php4DelphiR2007.stat new file mode 100644 index 0000000..6544ade --- /dev/null +++ b/php4DelphiR2007.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=1 +StartTime=21.09.2018 3:08:16 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiR2007_Icon.ico b/php4DelphiR2007_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..93f732ed5ea2004cf8f8171acf70c3e56af1c26d GIT binary patch literal 766 zcmb7Cv2NTj3}u=E9t$IIGxo-=MsRR}4(%^^NR`isAo$4OhI0@cNT9<_LHZ*_hg~{A zroc$kG(jkHr&4?dp!t%2+?ZLymw`hFC(5eKH`^o6YH$bUus!aHDiCHh-thKoH*a>X z8@`d_cd7(CMSjDdKSF2mP^#C%=6Z;M#Gu4Rx6QW?%tK{nJgDkZ?8Cy9qan!SS~^5B z)2_`?)7_KnlIRJm10+U^~l=|F?9n7-Hu9W6#ZJ|ptAgJz2Zu>gd zyq0@#=(+Er#grs^0Qh%ZotvvDL-%9mDiJ=lz38gZ`u5WLG$0|0sEAjKUUVJ+9OqZD zc + + {B0FA1B58-2442-42C7-83BD-6DD3D0CE3CF8} + php4DelphiR2009.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4Delphi (run-rime) + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + php4DelphiR2009 + true + 1049 + false + true + true + true + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 00400000 + false + false + false + + + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar + + + php4DelphiR2009_Icon.ico + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + 0 + false + RELEASE;$(DCC_Define) + 0 + + + true + false + DEBUG;$(DCC_Define) + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiR2009.dpk + + + + False + True + + + 12 + + + + diff --git a/php4DelphiR2009.dproj.local b/php4DelphiR2009.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiR2009.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiR2009.res b/php4DelphiR2009.res new file mode 100644 index 0000000000000000000000000000000000000000..b946c3cf4737f4cfe63fa0bc6b919aa29fe155e5 GIT binary patch literal 4396 zcmbW5y^ice5QS^C0g%83>OhncYij4bkxI`SUKc$3L2~0G z4YcQTpML1=@$u27Qd~1m`TfHO>$~2t3H`7cZ|8G;)&Iu_jKogOT=JO4$=9oRO{KR< z9Jb;r0;xCR}WxtJm8Xnv>Vt-cbiktZ1FiOkc<%53&Y;wHhS>xp3 zTJLU$Kl$`gG1!i*9w@DrX!}{(3e(c#p-ye$v@+KZ`w94sukAENCp7^IS`8)ZxqB>wRfSnxB4fhON9C+7S;u9;r(avLTvEx&7{Sa}x z%^Y)Z;GOzA_9*NFJf#Qe1N$O=E8Ez?m#|i-dHDJC*B`-Q4i0{1i~LAz0AD@!R2NL% z;p+IKY_J`qyAbl@@ynmbJHkQZS=fm7XYT7s^_rh8Ilu|bz{YRGmmPf%CVdcNa@=?x zq&w{!f&(#v;q_14xp7c`vgSFh)!^V`oe$>8p>qHmIYj*(Q{3Ui7_OcJVR| zjg@=t1BWxbV9Q_Bw8ftsx;1`sZt_d~Q-9N#GKq{u4LO zbKC(DzxM_>$Qo&Rv&%UHd*M)GOfI$$>zu3CI4nJX00S;teU43z*L#-n$^op)hdE^LEF>pt zgpJ=bUE-}ee)k%V`XRp~Q)j=sk4pl2XC6tstNIkbCG-X{k~i)|-r?xIr1|Z)oY%kQ zUS^x9iQwvMTuNhj-258El+ZItsh?Sg73oPshvqUybnA1B?q*} z_J%yT-Q04axT#J0Nx$#axgSkFUgh%i+kk&k9y$oDtGI0&l~X06BD`mLFLFRArw`^A2=pY2!4PxhO1 XKHL8__%}oUXWZZWzZ(1ta%2Ai-h(1$ literal 0 HcmV?d00001 diff --git a/php4DelphiR2009.stat b/php4DelphiR2009.stat new file mode 100644 index 0000000..32ee432 --- /dev/null +++ b/php4DelphiR2009.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=1 +StartTime=21.09.2018 3:08:17 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiR2009_Icon.ico b/php4DelphiR2009_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..379ec80d91cd5bef25a44bb21ae1c40a278cd772 GIT binary patch literal 4286 zcmbW5J#OSi5QW>=U_(1{ItmS4g1!V}9;N3d++blCyaXpU6e=_@dxQ-)FhIZWRTs$_ zQLQs45wEHCWfF(Ina})Ode)6gDYWM$ z`da(ilNf!AOPu5~4YkC0g5>}zsRTQQFwaIk6Ia_!s-hw;D* z4$F-GYV1Yp_u8l7(Q8Bdv$RV$`r$CjE8hJ>d<<-IyyjW$2WzC1C;Lz8$&(dnV^yHs*_M0!evCMzyCP#I}Mi1k$e+_$(mafVo z?u4#EZTzU*p0uu0o@MMw(cCoiE^B0p-_xJteel6RbLgJRqBYqMe8sLZ;a>i}cs=^3 zI=N52OVvKGW&k@m;2Z7@wm8t&T;ijZ*m(1pn|5MqtRF(R*UT{n2m0*4u}5K_;3+@I zpLj3ym%7&uzKprbo=2STfBg|0=HTEnTNOuE2Jls5Ps@r)AFjq9wT88Wd>2N3tY7i0 zcZ7r5v#>F}pSfSI+OPS!BnLQw8Q8>a_*zHZgGn7kn;bWuC;3kA4Z#78V0ix%cWxY1 zpUgR@%TnOrw$2CRzVtLP-{@f$) z6M5EJaM0zw7eDS?pHty74mL5|KEUUF=erX>8C=3tf8xe@jyoXqyEecfA4A)tku}PH zMQh`rcH)OW*6;i)mN5tRHmpcLb9v`DN1BVemlt;Gr}kri^e*@^Fw>Z)&H1~@ecOkq zJMJ$yMl9l?-}|pNdYz|1@wJY5$D9Mp^LjV$M&|N7(00Eb<3~-SyX_tEr9bfv3pjQXKNPop-Pc{`-;TsMZTFw+PknNN!H@fkSm;8#xk)=YOs#n@#5dHIheLeT zLfmWUmmc8|KQu=DppS1L&bi0c=bl|e(Lk8{c67h zwDYcUO^BoGUbtDiVEMjjxLJc>^CXuee8#9n=eyhToq50U9lAq%o?Xrv*eiz`ZE~@H znCD!*#bK@a6BuyW`&(>syxp_3Hx6LkKa62VXCXPUN38KZ(K<9Dy&s2=h=GJV#& zW84!^pK&blUiH`bEul8hNZz;;>BG^rr1AZ?ocF)w-~f6ZS~*Z-)Y^MYYmKRzUbA73t|EE@br_Cxkv_Dyzac9zFJ`keLO4%nrXPuRCo TJ}dUm!Z-=56Xvp9J}v(Ob;cBC literal 0 HcmV?d00001 diff --git a/php4DelphiR2010.dpk b/php4DelphiR2010.dpk new file mode 100644 index 0000000..eb75ee8 --- /dev/null +++ b/php4DelphiR2010.dpk @@ -0,0 +1,51 @@ +package php4DelphiR2010; + +{$R *.res} +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (run-rime)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl; + +contains + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + PHPCommon in 'PHPCommon.pas'; + +end. diff --git a/php4DelphiR2010.dproj b/php4DelphiR2010.dproj new file mode 100644 index 0000000..9d3e166 --- /dev/null +++ b/php4DelphiR2010.dproj @@ -0,0 +1,492 @@ + + + {E17417E2-2EC1-4971-BB34-C9C25AFF27A5} + php4DelphiR2010.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + 1 + php4Delphi (run-rime) + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + php4DelphiR2010 + true + 1049 + false + true + true + true + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 00400000 + false + false + false + + + php4DelphiR2010_Icon.ico + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + 0 + false + RELEASE;$(DCC_Define) + 0 + + + true + false + DEBUG;$(DCC_Define) + + + true + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + php4delphi;$(DCC_UnitSearchPath) + + + + MainSource + + + + + + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiR2010.dpk + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + File C:\USERS\PUBLIC\DOCUMENTS\EMBARCADERO\STUDIO\18.0\bpl\dcllmdlegacy240.bpl not found + + + + True + + + + + + Contents\Resources + 1 + + + + + classes + 1 + + + + + Contents\MacOS + 0 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + library\lib\mips + 1 + + + + + 1 + + + 1 + + + 0 + + + 1 + + + 1 + + + library\lib\armeabi-v7a + 1 + + + 1 + + + + + 0 + + + 1 + .framework + + + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + 1 + + + + + + library\lib\armeabi + 1 + + + + + 0 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-large + 1 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + res\drawable-hdpi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + + + Assets + 1 + + + Assets + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\values + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + res\drawable + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 0 + .bpl + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\drawable-ldpi + 1 + + + + + 0 + .dll;.bpl + + + 1 + .dylib + + + + + + + + + + + + + 12 + + + + + diff --git a/php4DelphiR2010.dproj.local b/php4DelphiR2010.dproj.local new file mode 100644 index 0000000..2c5c945 --- /dev/null +++ b/php4DelphiR2010.dproj.local @@ -0,0 +1,6 @@ + + + + 1899.12.30 00:00:00.000.755,C:\Users\User\Desktop\soulengine-5554e3db061d08b94f439be26ed071a74c30071c\php4delphi\php4DelphiR2010.dproj=C:\Users\User\Desktop\soulengine-5554e3db061d08b94f439be26ed071a74c30071c\php4delphi\php4DelphiR2010.dproj + + diff --git a/php4DelphiR2010.identcache b/php4DelphiR2010.identcache new file mode 100644 index 0000000000000000000000000000000000000000..4ed1d71399a83a7724eb4e6ba4f54bf631e3386a GIT binary patch literal 556 zcmd;KU|>*mwu(t9E>4Xp$S5#LNzEz9$V6i56(kk|6~Tc57S#bB0nYikx%qj-D2{UV za|x*|NG(QJjLjWDlYKIiiV}+|iBS#ofNy?EX%42@>R4P2RP9_^T#}!Q!v-}hdR)N4 z<5rrNT#}iehv5ZfELwnGz^Psyi+Yf=auSO%%$CKX7HGC(fG2v;$YD_l3Uw?>u{i)} IDAxD^0N~}900000 literal 0 HcmV?d00001 diff --git a/php4DelphiR2010.res b/php4DelphiR2010.res new file mode 100644 index 0000000000000000000000000000000000000000..75bcc369c5c7cc311d8dee4817f06f1195671e3d GIT binary patch literal 4876 zcmbW5J#QUV5QfLZ5`+SbM1NgSpcKeRX^;>L;!BqJQsSF-6+(z2CAMTjz4xEo6bPaH z2}o#NBbP1_PC-vf3dHh0GiP?!H`l>trMYuH=FI!foH^&N*34{M()S^1o_Q7?%M;qE6@A(tsQ9oXSdn0>tgkeVR{2lkD9Z+C>cx@vXJd-mF}=AKsGwufT&k^8?RKM&>qu71DP%%MEq zmS=bzXq*Sj4WTfbOvlK~-tesKx#xYce;~_8lNhdU{;~Pfmf5!a^!=4#f3~*9{drS! z%)c+$@Rk}{^M9XtJ-5YTVQtg6rk(P`x6OItS<4rf-+zN;BzzYt2NBoUr_p+bH-qzRLHex?f?24QC;jomJztso- z2-xI!$g|qX!L|Bshd=r8{QDa6e{JAFjJ`+8K`UE0IFHk3<0q&1^f<7`pZgs1;Fy}5 zi$DJQUNP0!i34lIWh&0KQ|@I?+%33k;t#)p$36y!$g9saU`mRPn1aK+Df_Hg9WOQc zr=9(xZ8DbmkGRQEGhh=B{yR}|6*$;gAZY07z`t8W=iN9@H?~`w9v=7+SU?&H3!99a54)isb_{55D zwDagn?D*8!ypFitri(E+&}aW0dnxQ0Jf&;t8S5f`Yo@V-FJZ1>&%@8tUw;e^U2yO- z+sKc^YVcKK$NhjwAFhtSlnu7EbQMB=JbwA}c$aWcyAw8|^_lzrRQuJPSaN_9n1PMo zf-gJj9!%;W+T^(KoJm(&R|f}T1jF|~al67n^~s#)wC@cL-q!hGoE$m_u#s8pzhjC! zoM^+c`pPZZg5{GNaLa?F~&4Kc;f zT;4gJBh5wKOA9;Wr}kriv=)2`m?_ND=KP(>ec6YoJMJ$yhA;dPzwf`=#Oryg+z$eiM#9_{uO`XyYGS@*fHNWrGDi%@-J>0ODr_+2zP87^8lOk9Q!> zxsR*QJvG#(cwqxRcOd^&_)0!XqPJPQj>9wYQ=g~Wukt@YJMS8=332qg7jD)rSbpCW z+^j*cd6LUIe8#9n&v!NEJM(@=W!Tneg+0yrur;4 zIUes>+9L%JI_`b-K9G+JX z&+vlpz~i`_NjO{%JNYFCw8wUVJh)v~a-q1{oAi@@FRODsntVK$%ki<#W0&hLi+7%V z`n#w;&(G?3e`MBc@NdaqlBbdocLZ2OwBeN^W6SEiP`&D7ggjET%?~ktZ zuN&WN=)7W|+Xw#bXxBdUFG(8qXJ_(VgRdF-p0T~{Up4p&vSBaC>Rn0SzpO7gpUKOf be}B3mk9+Ffuut`MXis0L;+cNO+R)Iy*f(Ih literal 0 HcmV?d00001 diff --git a/php4DelphiR2010.stat b/php4DelphiR2010.stat new file mode 100644 index 0000000..e92f52a --- /dev/null +++ b/php4DelphiR2010.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=123 +DesignerSecs=1 +InspectorSecs=3 +CompileSecs=26547 +OtherSecs=230 +StartTime=29.07.4016 22:02:01 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiR2010_Icon.ico b/php4DelphiR2010_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..379ec80d91cd5bef25a44bb21ae1c40a278cd772 GIT binary patch literal 4286 zcmbW5J#OSi5QW>=U_(1{ItmS4g1!V}9;N3d++blCyaXpU6e=_@dxQ-)FhIZWRTs$_ zQLQs45wEHCWfF(Ina})Ode)6gDYWM$ z`da(ilNf!AOPu5~4YkC0g5>}zsRTQQFwaIk6Ia_!s-hw;D* z4$F-GYV1Yp_u8l7(Q8Bdv$RV$`r$CjE8hJ>d<<-IyyjW$2WzC1C;Lz8$&(dnV^yHs*_M0!evCMzyCP#I}Mi1k$e+_$(mafVo z?u4#EZTzU*p0uu0o@MMw(cCoiE^B0p-_xJteel6RbLgJRqBYqMe8sLZ;a>i}cs=^3 zI=N52OVvKGW&k@m;2Z7@wm8t&T;ijZ*m(1pn|5MqtRF(R*UT{n2m0*4u}5K_;3+@I zpLj3ym%7&uzKprbo=2STfBg|0=HTEnTNOuE2Jls5Ps@r)AFjq9wT88Wd>2N3tY7i0 zcZ7r5v#>F}pSfSI+OPS!BnLQw8Q8>a_*zHZgGn7kn;bWuC;3kA4Z#78V0ix%cWxY1 zpUgR@%TnOrw$2CRzVtLP-{@f$) z6M5EJaM0zw7eDS?pHty74mL5|KEUUF=erX>8C=3tf8xe@jyoXqyEecfA4A)tku}PH zMQh`rcH)OW*6;i)mN5tRHmpcLb9v`DN1BVemlt;Gr}kri^e*@^Fw>Z)&H1~@ecOkq zJMJ$yMl9l?-}|pNdYz|1@wJY5$D9Mp^LjV$M&|N7(00Eb<3~-SyX_tEr9bfv3pjQXKNPop-Pc{`-;TsMZTFw+PknNN!H@fkSm;8#xk)=YOs#n@#5dHIheLeT zLfmWUmmc8|KQu=DppS1L&bi0c=bl|e(Lk8{c67h zwDYcUO^BoGUbtDiVEMjjxLJc>^CXuee8#9n=eyhToq50U9lAq%o?Xrv*eiz`ZE~@H znCD!*#bK@a6BuyW`&(>syxp_3Hx6LkKa62VXCXPUN38KZ(K<9Dy&s2=h=GJV#& zW84!^pK&blUiH`bEul8hNZz;;>BG^rr1AZ?ocF)w-~f6ZS~*Z-)Y^MYYmKRzUbA73t|EE@br_Cxkv_Dyzac9zFJ`keLO4%nrXPuRCo TJ}dUm!Z-=56Xvp9J}v(Ob;cBC literal 0 HcmV?d00001 diff --git a/php4DelphiR5.dpk b/php4DelphiR5.dpk index 3958ee6..83d6866 100644 --- a/php4DelphiR5.dpk +++ b/php4DelphiR5.dpk @@ -1,8 +1,9 @@ -package php4DelphiR5; - -{$R *.RES} +package php4DelphiR5; + +{$R *.res} {$R 'php4delphi.dcr'} -{$ALIGN ON} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} {$DEBUGINFO ON} @@ -12,31 +13,33 @@ package php4DelphiR5; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST ON} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'PHP4Delphi (run-time)'} {$RUNONLY} {$IMPLICITBUILD OFF} -requires - vcl50; +requires + vcl; -contains - zendAPI in 'ZENDAPI.pas', +contains + ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', - phpAPI in 'PHPAPI.pas', - phpLibrary in 'PHPLibrary.pas', - PHPCustomLibrary in 'phpCustomLibrary.pas', + PHPAPI in 'PHPAPI.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', phpFunctions in 'phpFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', @@ -44,4 +47,4 @@ contains phpModules in 'phpModules.pas', PHPCommon in 'PHPCommon.pas'; -end. +END. diff --git a/php4DelphiR5.dproj b/php4DelphiR5.dproj new file mode 100644 index 0000000..ba9ec74 --- /dev/null +++ b/php4DelphiR5.dproj @@ -0,0 +1,136 @@ + + + {707D296F-20D9-445C-A469-6AF8BB33C170} + php4DelphiR5.dpk + True + Debug + 1 + Package + None + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4DelphiR5 + false + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + false + PHP4Delphi (run-time) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + true + 1058 + true + true + + + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + php4DelphiR5_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiR5_Icon.ico + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiR5.dpk + + + + False + True + False + + + 12 + + + + diff --git a/php4DelphiR5.dproj.local b/php4DelphiR5.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiR5.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiR5.identcache b/php4DelphiR5.identcache new file mode 100644 index 0000000000000000000000000000000000000000..ad5b648ef899d1efd57807697fcece7e57628518 GIT binary patch literal 556 zcmd;KU|>*mwu(t9E>4Xp$S5#LNzEz9$V6i56(kk|6~Tc57S#bB0nYikx%qj-D2{UV za|x*|NG(QJjLjWDlYKIiiV}+|(N!yBaR<-?Zl!t2C7Jno7^bUZSMOX}T#}!Q!wxkp zdR)K(gwq;%ELwoha?VLC#&D7>7PUYRI|g{7dlp;J08RDHPbtm83`jXF=7K^Ui^15O K3v>e3_yGV9u9si{ literal 0 HcmV?d00001 diff --git a/php4DelphiR5.res b/php4DelphiR5.res index 4aa33a29f5409f6507d2199b5dd35f0dda13b311..ddb7a2ee63fa11fa24dac83fe62940cfd353d48e 100644 GIT binary patch delta 311 zcmZqRIm10cL6L!pfkA4k*Dm`7N`&v=xX2 zRABvXE02FayNM*sn!Fl z0jXr1e2~?eg_Gq8%R~h+M$V1qqRh+&0-TfmnPnY--es@>;{X4-fVTKBI5LDVxH0$x Y-RKKsIRa^S23H^}7;GA9Sb#zY05Rz?SO5S3 delta 347 zcmX@Z-M}+JVX_007^CFoa3)b^W&r`o$@#3Zj3pBlg?WJ-76vFNndlhJdWjLpo48Qk zejSLxV8CF)V8~zzrd=6~fg(x_j6mqjkk63IP{5GLkjGHT;0L608B#$Sz(9+EapG;& z$r6kv^$_KrKxHLB1w}wQks$|7gBsXKAE10XSQcb>0npeYhD@MH22dy5SfEOTx)7j> zM1~ZgzFZ((#E{KU3{}a%0CWNn`fET9$%I<$1~f7Ur~%{*go}ZWob1miJGq6?LQx8= a5#m3P3XsEL#=3xvpUlW)%_7P2m<0eH?lhhN diff --git a/php4DelphiR5.stat b/php4DelphiR5.stat new file mode 100644 index 0000000..7e8d660 --- /dev/null +++ b/php4DelphiR5.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=96 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=9481 +OtherSecs=55 +StartTime=21.09.2018 3:07:56 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiR5_Icon.ico b/php4DelphiR5_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1998c2db4f9d3c870f5dc2715f351a4b348b459b GIT binary patch literal 766 zcmaKqyK2KQ6o!A-#TrvnD4m*&9aB1V$dFEXfxdvdXz>yV#03xaH8JZaCjlJ?fc?;C-O)_f`S?P*r~7$R$;w zZCg65e6ZH7D0XLZLuhGwwO`8oKgTc4_%!^;O3X(t`#=H5K0(b9_ebO@ynz7=?O6L% zHBU?}oP~g?X@o;SVT|#dNiB6?Eu7?L=KY?v4*O}@V61iS>uK#aAZy{g7ETVlIO8&J z&f-gB>eGC3;}{|T%``^-h#c`e#cVNqqFW_8i>@D+>20m&E}jKxm^>tPHsEE+fwCy2 z8Iz??V1$c;8n`Qw6LVKCV+oLwayXjU6h`z)@o=X!7UKFb*jCwt)?I6hZ pK9d#jz6ORtU9wZB{X@>T7jqO9Z-Cb=u-PHn+A7}JRfo^d+HY9lw=e(z literal 0 HcmV?d00001 diff --git a/php4DelphiR6.dpk b/php4DelphiR6.dpk index 8ebb46e..408d3a0 100644 --- a/php4DelphiR6.dpk +++ b/php4DelphiR6.dpk @@ -1,7 +1,8 @@ -package php4DelphiR6; - -{$R *.res} +package php4DelphiR6; + +{$R *.res} {$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -12,37 +13,39 @@ package php4DelphiR6; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (run-time)'} {$RUNONLY} {$IMPLICITBUILD OFF} -requires +rrequires rtl, vcl; -contains - zendAPI in 'ZENDAPI.pas', +ocontains + ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', - phpAPI in 'PHPAPI.pas', + PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', - phpLibrary in 'PHPLibrary.pas', - PHPCustomLibrary in 'phpCustomLibrary.pas', - phpFunctions in 'PHPFunctions.pas', - ZENDTypes in 'ZendTypes.pas', - PHPTypes in 'phpTypes.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + ZendTypes in 'ZendTypes.pas', + phpTypes in 'phpTypes.pas', phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -end. +d. diff --git a/php4DelphiR6.dproj b/php4DelphiR6.dproj new file mode 100644 index 0000000..21e327c --- /dev/null +++ b/php4DelphiR6.dproj @@ -0,0 +1,123 @@ + + + {DED15493-B967-43E0-A18F-C40731D537E2} + php4DelphiR6.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4DelphiR6 + false + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + php4Delphi (run-time) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + 1058 + false + true + true + + + php4DelphiR6_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiR6_Icon.ico + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiR6.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiR6.dproj.local b/php4DelphiR6.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiR6.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiR6.stat b/php4DelphiR6.stat new file mode 100644 index 0000000..0c40d2a --- /dev/null +++ b/php4DelphiR6.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=1 +StartTime=21.09.2018 3:07:52 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiR6_Icon.ico b/php4DelphiR6_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1998c2db4f9d3c870f5dc2715f351a4b348b459b GIT binary patch literal 766 zcmaKqyK2KQ6o!A-#TrvnD4m*&9aB1V$dFEXfxdvdXz>yV#03xaH8JZaCjlJ?fc?;C-O)_f`S?P*r~7$R$;w zZCg65e6ZH7D0XLZLuhGwwO`8oKgTc4_%!^;O3X(t`#=H5K0(b9_ebO@ynz7=?O6L% zHBU?}oP~g?X@o;SVT|#dNiB6?Eu7?L=KY?v4*O}@V61iS>uK#aAZy{g7ETVlIO8&J z&f-gB>eGC3;}{|T%``^-h#c`e#cVNqqFW_8i>@D+>20m&E}jKxm^>tPHsEE+fwCy2 z8Iz??V1$c;8n`Qw6LVKCV+oLwayXjU6h`z)@o=X!7UKFb*jCwt)?I6hZ pK9d#jz6ORtU9wZB{X@>T7jqO9Z-Cb=u-PHn+A7}JRfo^d+HY9lw=e(z literal 0 HcmV?d00001 diff --git a/php4DelphiR7.dpk b/php4DelphiR7.dpk index f5c4f51..c6afa2d 100644 --- a/php4DelphiR7.dpk +++ b/php4DelphiR7.dpk @@ -1,7 +1,8 @@ -package php4DelphiR7; - -{$R *.res} +package php4DelphiR7; + +{$R *.res} {$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -12,37 +13,39 @@ package php4DelphiR7; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION ON} +{$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} +{$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (run-rime)'} {$RUNONLY} {$IMPLICITBUILD OFF} -requires +rrequires rtl, vcl; -contains - zendAPI in 'ZENDAPI.pas', +ocontains + ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', - phpAPI in 'PHPAPI.pas', + PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', - phpLibrary in 'PHPLibrary.pas', - PHPCustomLibrary in 'phpCustomLibrary.pas', - phpFunctions in 'PHPFunctions.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -end. +d. diff --git a/php4DelphiR7.dproj b/php4DelphiR7.dproj new file mode 100644 index 0000000..1556578 --- /dev/null +++ b/php4DelphiR7.dproj @@ -0,0 +1,123 @@ + + + {3E3CB6F4-C2C9-4F65-A546-29B1EB2C2EB7} + php4DelphiR7.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + 1 + php4DelphiR7 + false + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 00400000 + true + false + php4Delphi (run-rime) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + 1058 + false + true + true + + + php4DelphiR7_Icon.ico + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + true + + + php4DelphiR7_Icon.ico + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + + + 0 + 0 + false + RELEASE;$(DCC_Define) + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiR7.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/php4DelphiR7.dproj.local b/php4DelphiR7.dproj.local new file mode 100644 index 0000000..b3811b7 --- /dev/null +++ b/php4DelphiR7.dproj.local @@ -0,0 +1,2 @@ + + diff --git a/php4DelphiR7.stat b/php4DelphiR7.stat new file mode 100644 index 0000000..52b7df0 --- /dev/null +++ b/php4DelphiR7.stat @@ -0,0 +1,10 @@ +[Stats] +EditorSecs=1 +DesignerSecs=1 +InspectorSecs=1 +CompileSecs=1 +OtherSecs=1 +StartTime=21.09.2018 3:08:01 +RealKeys=0 +EffectiveKeys=0 +DebugSecs=1 diff --git a/php4DelphiR7_Icon.ico b/php4DelphiR7_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cfd8992a5b8ff4b89478d89e93ae9205bb8125ef GIT binary patch literal 766 zcmZvaJxjw-6o%h^fPsh~i*;)WQr#qE6x5;U{}5?bDU!Qs#KAy@{*{(2!dc?v-w<3J zyH!xUzUL;X9X!dK+~<6Tdjqt14F+APeYAl+zK^H@bxyTV#lYDAmIAzyrqzp2E~yk{ zSu$YV4Qq8p@lqEbez>c)L$@gg8}<%Oa6GG-Tha@RIgpyYyx3_6 z0sK0F9J)}Gz=q1c)CrmBhWa9M&IR0YL{dad6xMSUMJ!a-f}CrS zObTrz@|^QLXnD=E3VB8v_nQw=P@5rbS=*@WSgTre9_?ZacCm^3g@?0G70_3Gujz+t p>P*GoN!7Oxk5il4S6hB}YQS~ZBQNRfhwsN>Ye}J@)z3c!&m?S literal 0 HcmV?d00001 diff --git a/php4DelphiReg.pas b/php4DelphiReg.pas index 8b1b5d2..7909619 100644 --- a/php4DelphiReg.pas +++ b/php4DelphiReg.pas @@ -1,194 +1,227 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP4Delphi components registration } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: php4DelphiReg.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit php4DelphiReg; - -interface -uses - Windows, SysUtils, Classes, Dialogs, Forms, - PHPCommon, - {$IFDEF VERSION6} - DesignIntf, - DesignEditors, - {$ELSE} - dsgnintf, - {$ENDIF} - ShlObj, - ZendAPI, PHPAPI, - PHP4Delphi, phpAbout, phpModules, phpLibrary, ShellAPI, - phpClass, - phpCustomLibrary; - -type - TScriptFileProperty = class(TStringProperty) - public - procedure Edit; override; - function GetAttributes: TPropertyAttributes; override; - end; - - TINIFolderProperty = class(TStringProperty) - public - procedure Edit; override; - function GetAttributes: TPropertyAttributes; override; - end; - - TpsvPHPEditor = class(TDefaultEditor) - public - {$IFDEF VERSION6} - procedure EditProperty(const Prop: IProperty; var Continue: Boolean); override; - {$ELSE} - procedure EditProperty(PropertyEditor: TPropertyEditor; - var Continue, FreeEditor: boolean); override; - {$ENDIF} - procedure ExecuteVerb(Index: integer); override; - function GetVerb(Index: integer): string; override; - function GetVerbCount: integer; override; - procedure Edit; override; - end; - -procedure Register; - -implementation - -procedure Register; -begin - RegisterComponents('PHP', [TpsvPHP]); - RegisterComponents('PHP', [TPHPLibrary]); - RegisterComponents('PHP', [TPHPClass]); - RegisterComponents('PHP', [TPHPSystemLibrary]); - RegisterPropertyEditor(TypeInfo(String), TpsvPHP, 'FileName', TScriptFileProperty); - RegisterPropertyEditor(TypeInfo(TPHPAboutInfo), TPHPComponent, 'About', TPHPVersionEditor); - RegisterPropertyEditor(TypeInfo(TPHPAboutInfo), TCustomPHPExtension, 'About', TphpVersionEditor); - RegisterComponentEditor(TPHPExtension, TpsvPHPEditor); - RegisterComponentEditor(TPHPLibrary, TpsvPHPEditor); -end; - - -procedure TScriptFileProperty.Edit; -var - MPFileOpen: TOpenDialog; -begin - MPFileOpen := TOpenDialog.Create(Application); - MPFileOpen.Filename := GetValue; - MPFileOpen.Filter := 'PHP Script (*.php)|*.php'; - MPFileOpen.Options := MPFileOpen.Options + [ofPathMustExist, - ofFileMustExist]; - try - if MPFileOpen.Execute then SetValue(MPFileOpen.Filename); - finally - MPFileOpen.Free; - end; -end; - -function TScriptFileProperty.GetAttributes: TPropertyAttributes; -begin - Result := [paDialog]; -end; - -{$IFDEF VERSION6} -procedure TpsvPHPEditor.EditProperty(const Prop: IProperty; var Continue: Boolean); -var - PropName: string; -begin - PropName := Prop.GetName; - if (CompareText(PropName, 'FUNCTIONS') = 0) then - begin - Prop.Edit; - Continue := False; - end; -end; - -{$ELSE} -procedure TpsvPHPEditor.EditProperty(PropertyEditor: TPropertyEditor; - var Continue, - FreeEditor: boolean); -var - PropName: string; -begin - PropName := PropertyEditor.GetName; - if (CompareText(PropName, 'FUNCTIONS') = 0) then - begin - PropertyEditor.Edit; - Continue := False; - end; -end; -{$ENDIF} - -procedure TpsvPHPEditor.Edit; -begin - inherited; -end; - -procedure TpsvPHPEditor.ExecuteVerb(Index: integer); -begin - case Index of - 0: - begin - Edit; - Designer.Modified; - end; - 1: ShellExecute(0, 'open', 'http://www.php.net', nil, nil, SW_SHOW); - 2: ShellExecute(0, 'open', 'http://users.chello.be/ws36637', nil, nil, SW_SHOW); - end; -end; - -function TpsvPHPEditor.GetVerb(Index: integer): string; -begin - case Index of - 0: Result := 'Edit PHP Functions...'; - 1: Result := 'PHP Home Page'; - 2: Result := 'PHP4Delphi Home Page'; - end; -end; - -function TpsvPHPEditor.GetVerbCount: integer; -begin - Result := 3; -end; - -{ TINIFolderProperty } - -procedure TINIFolderProperty.Edit; -var - BrowseInfo: TBrowseInfo; - ItemIDList: PItemIDList; - ItemSelected : PItemIDList; - NameBuffer: array[0..MAX_PATH] of Char; - WindowList: Pointer; -begin - itemIDList := nil; - FillChar(BrowseInfo, SizeOf(BrowseInfo), 0); - BrowseInfo.hwndOwner := Forms.Application.Handle; - BrowseInfo.pidlRoot := ItemIDList; - BrowseInfo.pszDisplayName := NameBuffer; - BrowseInfo.lpszTitle := 'Select folder'; - BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS; - WindowList := DisableTaskWindows(0); - try - ItemSelected := SHBrowseForFolder(BrowseInfo); - finally - EnableTaskWindows(WindowList); - end; - if (ItemSelected <> nil) then - begin - SHGetPathFromIDList(ItemSelected,NameBuffer); - SetValue(NameBuffer); - end; -end; - -function TINIFolderProperty.GetAttributes: TPropertyAttributes; -begin - Result := [paDialog]; -end; - +{*******************************************************} +{ PHP4Delphi } +{ PHP4Delphi components registration } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: php4DelphiReg.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit php4DelphiReg; + +interface +uses + Windows, SysUtils, Classes, Dialogs, Forms, + PHPCommon, + {$IFDEF VERSION6} + DesignIntf, + DesignEditors, + ToolsAPI, + {$ELSE} + dsgnintf, + {$ENDIF} + Graphics, + ShlObj, + ZendAPI, PHPAPI, + PHP4Delphi, phpAbout, phpModules, phpLibrary, ShellAPI, + phpClass, + phpCustomLibrary; + +type + TScriptFileProperty = class(TStringProperty) + public + procedure Edit; override; + function GetAttributes: TPropertyAttributes; override; + end; + + TINIFolderProperty = class(TStringProperty) + public + procedure Edit; override; + function GetAttributes: TPropertyAttributes; override; + end; + + TpsvPHPEditor = class(TDefaultEditor) + public + {$IFDEF VERSION6} + procedure EditProperty(const Prop: IProperty; var Continue: Boolean); override; + {$ELSE} + procedure EditProperty(PropertyEditor: TPropertyEditor; + var Continue, FreeEditor: boolean); override; + {$ENDIF} + procedure ExecuteVerb(Index: integer); override; + function GetVerb(Index: integer): string; override; + function GetVerbCount: integer; override; + procedure Edit; override; + end; + +{$IFDEF VERSION10} +procedure RegisterSplashScreen; +{$ENDIF} + +procedure Register; + +implementation + +{$R php4DelphiSplash.res} + +{$IFDEF VERSION11} +{$R php4delphi.dcr} +{$ENDIF} + +{$IFDEF VERSION10} +procedure RegisterSplashScreen; +var + Bmp: TBitmap; +begin + Bmp := TBitmap.Create; + Bmp.LoadFromResourceName( HInstance, 'PHPDELPHIL' ); + try + SplashScreenServices.AddPluginBitmap('php4Delphi version 7.4', + Bmp.Handle, False, 'Registered', '' ); + finally + Bmp.Free; + end; + +end; + +{$ENDIF} + +procedure Register; +begin + {$IFDEF VERSION10} + RegisterSplashScreen; + {$ENDIF} + RegisterComponents('PHP', [TPHPEngine]); + RegisterComponents('PHP', [TpsvPHP]); + RegisterComponents('PHP', [TPHPLibrary]); + RegisterComponents('PHP', [TPHPClass]); + RegisterPropertyEditor(TypeInfo(String), TpsvPHP, 'FileName', TScriptFileProperty); + RegisterPropertyEditor(TypeInfo(TPHPAboutInfo), TPHPComponent, 'About', TPHPVersionEditor); + RegisterPropertyEditor(TypeInfo(TPHPAboutInfo), TCustomPHPExtension, 'About', TphpVersionEditor); + RegisterComponentEditor(TPHPExtension, TpsvPHPEditor); + RegisterComponentEditor(TPHPLibrary, TpsvPHPEditor); +end; + + +procedure TScriptFileProperty.Edit; +var + MPFileOpen: TOpenDialog; +begin + MPFileOpen := TOpenDialog.Create(Application); + MPFileOpen.Filename := GetValue; + MPFileOpen.Filter := 'PHP Script (*.php)|*.php'; + MPFileOpen.Options := MPFileOpen.Options + [ofPathMustExist, + ofFileMustExist]; + try + if MPFileOpen.Execute then SetValue(MPFileOpen.Filename); + finally + MPFileOpen.Free; + end; +end; + +function TScriptFileProperty.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog]; +end; + +{$IFDEF VERSION6} +procedure TpsvPHPEditor.EditProperty(const Prop: IProperty; var Continue: Boolean); +var + PropName: string; +begin + PropName := Prop.GetName; + if (CompareText(PropName, 'FUNCTIONS') = 0) then + begin + Prop.Edit; + Continue := False; + end; +end; + +{$ELSE} +procedure TpsvPHPEditor.EditProperty(PropertyEditor: TPropertyEditor; + var Continue, + FreeEditor: boolean); +var + PropName: string; +begin + PropName := PropertyEditor.GetName; + if (CompareText(PropName, 'FUNCTIONS') = 0) then + begin + PropertyEditor.Edit; + Continue := False; + end; +end; +{$ENDIF} + +procedure TpsvPHPEditor.Edit; +begin + inherited; +end; + +procedure TpsvPHPEditor.ExecuteVerb(Index: integer); +begin + case Index of + 0: + begin + Edit; + Designer.Modified; + end; + 1: ShellExecute(0, 'open', 'http://www.php.net', nil, nil, SW_SHOW); + 2: ShellExecute(0, 'open', 'http://users.telenet.be/ws36637', nil, nil, SW_SHOW); + end; +end; + +function TpsvPHPEditor.GetVerb(Index: integer): string; +begin + case Index of + 0: Result := 'Edit PHP Functions...'; + 1: Result := 'PHP Home Page'; + 2: Result := 'PHP4Delphi Home Page'; + end; +end; + +function TpsvPHPEditor.GetVerbCount: integer; +begin + Result := 3; +end; + +{ TINIFolderProperty } + +procedure TINIFolderProperty.Edit; +var + BrowseInfo: TBrowseInfo; + ItemIDList: PItemIDList; + ItemSelected : PItemIDList; + NameBuffer: array[0..MAX_PATH] of Char; + WindowList: Pointer; +begin + itemIDList := nil; + FillChar(BrowseInfo, SizeOf(BrowseInfo), 0); + BrowseInfo.hwndOwner := Forms.Application.Handle; + BrowseInfo.pidlRoot := ItemIDList; + BrowseInfo.pszDisplayName := NameBuffer; + BrowseInfo.lpszTitle := 'Select folder'; + BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS; + WindowList := DisableTaskWindows(0); + try + ItemSelected := SHBrowseForFolder(BrowseInfo); + finally + EnableTaskWindows(WindowList); + end; + if (ItemSelected <> nil) then + begin + SHGetPathFromIDList(ItemSelected,NameBuffer); + SetValue(NameBuffer); + end; +end; + +function TINIFolderProperty.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog]; +end; + end. \ No newline at end of file diff --git a/php4DelphiWeb.pas b/php4DelphiWeb.pas index 1b47465..c24a2cf 100644 --- a/php4DelphiWeb.pas +++ b/php4DelphiWeb.pas @@ -1,83 +1,84 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: php4DelphiWeb.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit php4DelphiWeb; - -interface - -uses - Windows, ToolsAPI, Forms, Dialogs, SysUtils, Graphics, Classes, ShellAPI; - -type - Tphp4DelphiWeb = class(TNotifierObject, IOTAWIzard, IOTAMenuWizard) - public - function GetMenuText: string; - function GetIDString: string; - function GetName: string; - function GetState: TWizardState; - procedure Execute; - end; - -procedure Register; - -implementation - -procedure Register; -begin - RegisterPackageWizard(Tphp4DelphiWeb.Create as IOTAWizard); -end; - -procedure InitExpert; -begin - { stubbed out } -end; - -procedure DoneExpert; -begin - { stubbed out } -end; - -{ Tphp4DelphiWeb } - -procedure Tphp4DelphiWeb.Execute; -begin - ShellExecute(0, 'open', 'http://users.chello.be/ws36637', nil, nil, SW_SHOW); -end; - -function Tphp4DelphiWeb.GetIDString: string; -begin - Result := 'Perevoznyk.Tphp4DelphiWeb'; -end; - -function Tphp4DelphiWeb.GetMenuText: string; -begin - Result := 'PHP4Delphi Home Page'; -end; - -function Tphp4DelphiWeb.GetName: string; -begin - Result := 'Tphp4DelphiWeb'; -end; - -function Tphp4DelphiWeb.GetState: TWizardState; -begin - Result := [wsEnabled]; -end; - -initialization - InitExpert; - -finalization - DoneExpert; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} +{$I PHP.INC} + +{ $Id: php4DelphiWeb.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit php4DelphiWeb; + +interface + +uses + Windows, ToolsAPI, Forms, Dialogs, SysUtils, Graphics, Classes, ShellAPI; + +type + Tphp4DelphiWeb = class(TNotifierObject, IOTAWIzard, IOTAMenuWizard) + public + function GetMenuText: string; + function GetIDString: string; + function GetName: string; + function GetState: TWizardState; + procedure Execute; + end; + +procedure Register; + +implementation + +procedure Register; +begin + RegisterPackageWizard(Tphp4DelphiWeb.Create as IOTAWizard); +end; + +procedure InitExpert; +begin + { stubbed out } +end; + +procedure DoneExpert; +begin + { stubbed out } +end; + +{ Tphp4DelphiWeb } + +procedure Tphp4DelphiWeb.Execute; +begin + ShellExecute(0, 'open', 'http://users.chello.be/ws36637', nil, nil, SW_SHOW); +end; + +function Tphp4DelphiWeb.GetIDString: string; +begin + Result := 'Perevoznyk.Tphp4DelphiWeb'; +end; + +function Tphp4DelphiWeb.GetMenuText: string; +begin + Result := 'PHP4Delphi Home Page'; +end; + +function Tphp4DelphiWeb.GetName: string; +begin + Result := 'Tphp4DelphiWeb'; +end; + +function Tphp4DelphiWeb.GetState: TWizardState; +begin + Result := [wsEnabled]; +end; + +initialization + InitExpert; + +finalization + DoneExpert; + +end. diff --git a/php4delphi.dcr b/php4delphi.dcr index eada9adcf293895a7c4db061d4bdcbfa67e6508b..1c9e6a8161d68a226d87ee5efa94c56ce0087f3f 100644 GIT binary patch delta 537 zcmZ8du};G<5IrFz$4L1Br1B3S_yME}!hqVq#*~ben8F59KL8ZMcLp2Q=Ug^;W0;{Kp5ax4wiX#PSYSo24W0JXxD5CFxUx0x*X~jkMBT z$0L*oAz&X#C`$;HS_vhf4nrsqhBXSD0fo|g)SgoWAixDkCF;APR+#5?AI+|j5?AgG d-{o{lH. -} - -unit php4delphi; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, - PHPCommon, - ZendTypes, PHPTypes, zendAPI, PHPAPI, DelphiFunctions; - - -type - - TPHPLogMessage = procedure (Sender : TObject; AText : string) of object; - TPHPErrorEvent = procedure (Sender : TObject; AText : string; - AType : TPHPErrorType; AFileName : string; ALineNo : integer) of object; - - - - IPHPLibrary = interface (IUnknown) - ['{484AE2CA-755A-437C-9B60-E3735973D0A9}'] - procedure AddModule(AModule : Pointer); - procedure RemoveModule(AModule : Pointer); - {$IFDEF PHP510} - procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); - {$ELSE} - procedure HandleRequest(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); - {$ENDIF} - end; - - - TpsvCustomPHP = class(TPHPComponent, IPHPLibrary) - private - FHeaders : TPHPHeaders; - FSafeMode : boolean; - FSafeModeGid : boolean; - FMaxExecutionTime : integer; - FMaxInputTime : integer; - FRegisterGlobals : boolean; - FINIPath : string; - FExecuteMethod : TPHPExecuteMethod; - FKeepSession : boolean; - FModuleActive : boolean; - FSessionActive : boolean; - FOnModuleStartup : TNotifyEvent; - FOnModuleShutdown : TNotifyEvent; - FOnRequestStartup : TNotifyEvent; - FOnRequestShutdown : TNotifyEvent; - FAfterExecute : TNotifyEvent; - FBeforeExecute : TNotifyEvent; - FAdditionalModules : TList; - FTerminated : boolean; - FConstants : TphpConstants; - TSRMLS_D : pppointer; - FVariables : TPHPVariables; - FBuffer : string; - FOnLogMessage : TPHPLogMessage; - FOnScriptError : TPHPErrorEvent; - FHTMLErrors : boolean; - FHandleErrors : boolean; - FFileName : string; - FVirtualReadHandle : THandle; - FVirtualWriteHandle : THandle; - FUseDelimiters : boolean; - FUseMapping : boolean; - FDLLFolder : string; - FReportDLLError : boolean; - procedure SetVariables(Value : TPHPVariables); - procedure SetConstants(Value : TPHPConstants); - procedure SetHeaders(Value : TPHPHeaders); - function GetVariableCount: integer; - function GetConstantCount: integer; - protected - procedure ClearBuffer; - procedure ClearHeaders; - procedure PrepareModule; virtual; - procedure PrepareIniEntry; virtual; - procedure StartupRequest; virtual; - procedure ShutdownRequest; virtual; - procedure PrepareResult(TSRMLS_D : pointer); virtual; - procedure PrepareVariables(TSRMLS_D : pointer); virtual; - procedure RegisterInternalConstants(TSRMLS_DC : pointer); virtual; - procedure AddModule(AModule : Pointer); virtual; - procedure RemoveModule(AModule : Pointer); virtual; - {$IFDEF PHP510} - procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); virtual; - {$ELSE} - procedure HandleRequest(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); virtual; - {$ENDIF} - function RunTime : boolean; - function GetThreadSafeResourceManager : pointer; - procedure RegisterConstants; virtual; - function CreateVirtualFile(ACode : string) : boolean; - procedure CloseVirtualFile; - procedure StartupPHP; virtual; - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - function Execute : string; overload; - function Execute(AFileName : string) : string; overload; - function RunCode(ACode : string) : string; overload; - function RunCode(ACode : TStrings) : string; overload; - function VariableByName(AName : string) : TPHPVariable; - procedure StartupModule; virtual; - procedure ShutdownModule; virtual; - property ExecuteMethod : TPHPExecuteMethod read FExecuteMethod write FExecuteMethod default emServer; - property FileName : string read FFileName write FFileName; - property Constants : TPHPConstants read FConstants write SetConstants; - property ConstantCount : integer read GetConstantCount; - property Variables : TPHPVariables read FVariables write SetVariables; - property VariableCount : integer read GetVariableCount; - property HTMLErrors : boolean read FHTMLErrors write FHTMLErrors default false; - property KeepSession : boolean read FKeepSession write FKeepSession default false; - property HandleErrors : boolean read FHandleErrors write FHandleErrors default true; - property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; - property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; - property OnModuleStartup : TNotifyEvent read FOnModuleStartup write FOnModuleStartup; - property OnModuleShutdown : TNotifyEvent read FOnModuleShutdown write FOnModuleShutdown; - property OnRequestStartup : TNotifyEvent read FOnRequestStartup write FOnRequestStartup; - property OnRequestShutdown : TNotifyEvent read FOnRequestShutdown write FOnRequestShutdown; - property BeforeExecute : TNotifyEvent read FBeforeExecute write FBeforeExecute; - property AfterExecute : TNotifyEvent read FAfterExecute write FAfterExecute; - property ThreadSafeResourceManager : pointer read GetThreadSafeResourceManager; - property ModuleActive : boolean read FModuleActive; - property SessionActive : boolean read FSessionActive; - property IniPath : string read FIniPath write FIniPath; - property UseDelimiters : boolean read FUseDelimiters write FUseDelimiters default true; - property RegisterGlobals : boolean read FRegisterGlobals write FRegisterGlobals default true; - property MaxExecutionTime : integer read FMaxExecutionTime write FMaxExecutionTime default 0; - property MaxInputTime : integer read FMaxInputTime write FMaxInputTime default 0; - property SafeMode : boolean read FSafeMode write FSafeMode default false; - property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; - property DLLFolder : string read FDLLFolder write FDLLFolder; - property ReportDLLError : boolean read FReportDLLError write FReportDLLError; - property Headers : TPHPHeaders read FHeaders write SetHeaders; - end; - - - TpsvPHP = class(TpsvCustomPHP) - published - property About; - property FileName; - property Constants; - property Variables; - property HTMLErrors; - property HandleErrors; - property KeepSession; - property OnLogMessage; - property OnScriptError; - property OnModuleStartup; - property OnModuleShutdown; - property OnRequestStartup; - property OnRequestShutdown; - property BeforeExecute; - property AfterExecute; - property IniPath; - property UseDelimiters; - property RegisterGlobals; - property MaxExecutionTime; - property MaxInputTime; - property SafeMode; - property SafeModeGid; - property DLLFolder; - end; - - - -implementation - -uses - PHPFunctions, - phpCustomLibrary; - -var - delphi_sapi_module : sapi_module_struct; - php_delphi_module : Tzend_module_entry; - module_active : boolean = false; - -procedure php_info_delphi(zend_module : Pointer; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PChar('SAPI module version'), PChar('PHP4Delphi 6.2 Feb 2006')); - php_info_print_table_row(2, PChar('Variables support'), PChar('enabled')); - php_info_print_table_row(2, PChar('Constants support'), PChar('enabled')); - php_info_print_table_row(2, PChar('Classes support'), PChar('enabled')); - php_info_print_table_row(2, PChar('Home page'), PChar('http://users.chello.be/ws36637')); - php_info_print_table_end(); - -end; - -function php_delphi_startup(sapi_module : Psapi_module_struct) : integer; cdecl; -begin - result := php_module_startup(sapi_module, nil, 0); -end; - -function php_delphi_deactivate(p : pointer) : integer; cdecl; -begin - result := 0; -end; - - -function php_delphi_ub_write(str : pchar; len : uint; p : pointer) : integer; cdecl; -var - s : string; - php : TpsvPHP; - gl : psapi_globals_struct; -begin - Result := 0; - gl := GetSAPIGlobals(p); - if Assigned(gl) then - begin - php := TpsvPHP(gl^.server_context); - if Assigned(php) then - begin - SetLength(s, len); - Move(str^, s[1], len); - try - php.FBuffer := php.FBuffer + s; - except - end; - result := len; - end; - end; -end; - - -procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; -var - php : TpsvPHP; - gl : psapi_globals_struct; - ts : pointer; - cnt : integer; -begin - ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(ts); - php := TpsvPHP(gl^.server_context); - php_register_variable('PHP_SELF', '_', nil, p); - php_register_variable('SERVER_NAME','DELPHI', val, p); - php_register_variable('SERVER_SOFTWARE', 'Delphi', val, p); - php_register_variable('IsLibrary', 'False', val, p); - if Assigned(php) then - begin - for cnt := 0 to php.Variables.Count - 1 do - begin - php_register_variable(PChar(php.Variables[cnt].Name), - PChar(php.Variables[cnt].Value), val, p); - end; - end; -end; - -function php_delphi_log_message(msg : Pchar) : integer; cdecl; -var - php : TpsvPHP; - gl : psapi_globals_struct; - p : pointer; -begin - p := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(p); - php := TpsvPHP(gl^.server_context); - if Assigned(php) then - begin - if Assigned(php.OnLogMessage) then - php.FOnLogMessage(php, msg) - else - MessageBox(0, MSG, 'PHP4Delphi', MB_OK) - end - else - MessageBox(0, msg, 'PHP4Delphi', MB_OK); - result := 0; -end; - -procedure php_delphi_send_header(p1, p2, p3 : pointer); cdecl; -var - php : TpsvPHP; - gl : psapi_globals_struct; -begin - gl := GetSAPIGlobals(p3); - php := TpsvPHP(gl^.server_context); - if Assigned(p1) and Assigned(php) then - begin - with php.Headers.Add do - Header := String(Psapi_header_struct(p1).header); - end; -end; - -function php_delphi_header_handler(sapi_header : psapi_header_struct; sapi_headers : psapi_headers_struct; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SAPI_HEADER_ADD; -end; - -function php_delphi_read_cookies(p1 : pointer) : pointer; cdecl; -begin - result := nil; -end; - - - -procedure delphi_error_cb(_type : integer; const error_filename : PChar; - const error_lineno : uint; const _format : PChar; args : PChar); cdecl; -var - buffer : array[0..1023] of char; - err_msg : PChar; - php : TpsvPHP; - gl : psapi_globals_struct; - p : pointer; - error_type_str : string; - err : TPHPErrorType; -begin - wvsprintf(buffer, _format, args); - err_msg := buffer; - p := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(p); - php := TpsvPHP(gl^.server_context); - - case _type of - E_ERROR : err := etError; - E_WARNING : err := etWarning; - E_PARSE : err := etParse; - E_NOTICE : err := etNotice; - E_CORE_ERROR : err := etCoreError; - E_CORE_WARNING : err := etCoreWarning; - E_COMPILE_ERROR : err := etCompileError; - E_COMPILE_WARNING : err := etCompileWarning; - E_USER_ERROR : err := etUserError; - E_USER_WARNING : err := etUserWarning; - E_USER_NOTICE : err := etUserNotice; - else - err := etUnknown; - end; - - if assigned(php) then - begin - if Assigned(php.FOnScriptError) then +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Developers: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ } +{ Toby Allen (Documentation) } +{ tobyphp@toflidium.com } +{ } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} +{$I PHP.INC} + +{$ifdef fpc} + {$mode delphi} +{$endif} + +{ $Id: php4delphi.pas,v 7.4 10/2009 delphi32 Exp $ } + +// Important: +// Please check PHP version you are using and change php.inc file +// See php.inc for more details + +{ +You can download the latest version of PHP from +http://www.php.net/downloads.php +You have to download and install PHP separately. +It is not included in the package. + +For more information on the PHP Group and the PHP project, +please see . +} + +unit php4delphi; + +interface + + + +uses + Windows, Messages, SysUtils, Classes, VCL.Graphics, WinSock, + PHPCommon, + ZendTypes, + PHPTypes, + zendAPI, + PHPAPI, + DelphiFunctions, + PHPCustomLibrary, vcl.dialogs, strUtils, varUtils, + System.UITypes; + +type + + TPHPLogMessage = procedure (Sender : TObject; AText : AnsiString) of object; + TPHPErrorEvent = procedure (Sender: TObject; AText: AnsiString; + AType: integer; AFileName: AnsiString; ALineNo: integer) of object; + TPHPReadPostEvent = procedure(Sender : TObject; Stream : TStream) of object; + TPHPReadResultEvent = procedure(Sender : TObject; Stream : TStream) of object; + + TPHPMemoryStream = class(TMemoryStream) + public + constructor Create; + procedure SetInitialSize(ASize : integer); + end; + + TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) + private + FINIPath : AnsiString; + FOnEngineStartup : TNotifyEvent; + FOnEngineShutdown : TNotifyEvent; + FEngineActive : boolean; + FHandleErrors : boolean; + {$IFNDEF PHP540} + FSafeMode : boolean; + FSafeModeGid : boolean; + {$ENDIF} + FRegisterGlobals : boolean; + FHTMLErrors : boolean; + FMaxInputTime : integer; + FConstants : TphpConstants; + FDLLFolder : AnsiString; + FReportDLLError : boolean; + FLock: TRTLCriticalSection; + FOnScriptError : TPHPErrorEvent; + FOnLogMessage : TPHPLogMessage; + FWaitForShutdown : boolean; + FHash : TStringList; + FLibraryModule : Tzend_module_entry; + FLibraryEntryTable : array of zend_function_entry; + FRequestCount : integer; + procedure SetConstants(Value : TPHPConstants); + function GetConstantCount: integer; + function GetEngineActive : boolean; + protected + MyFuncs: TStringList; + TSRMLS_D : pppointer; + procedure StartupPHP; virtual; + procedure PrepareEngine; virtual; + procedure PrepareIniEntry; virtual; + procedure RegisterConstants; virtual; + procedure RegisterInternalConstants(TSRMLS_DC : pointer); virtual; + procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); virtual; + property RequestCount : integer read FRequestCount; + procedure HandleError (Sender : TObject; AText : string; AType : Integer; AFileName : string; ALineNo : integer); + procedure HandleLogMessage(Sender : TObject; AText : string); + procedure RegisterLibrary(ALib : TCustomPHPLibrary); + procedure RefreshLibrary; + procedure UnlockLibraries; + procedure RemoveRequest; + procedure AddRequest; + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + procedure AddFunction(FN: AnsiString; Func: Pointer); + procedure StartupEngine; virtual; + procedure ShutdownEngine; virtual; + procedure LockEngine; virtual; + procedure UnlockEngine; virtual; + procedure PrepareForShutdown; virtual; + property EngineActive : boolean read GetEngineActive; + property ConstantCount : integer read GetConstantCount; + property WaitForShutdown : boolean read FWaitForShutdown; + procedure ShutdownAndWaitFor; virtual; + property LibraryEntry : Tzend_module_entry read FLibraryModule; + published + property HandleErrors : boolean read FHandleErrors write FHandleErrors default true; + property OnEngineStartup : TNotifyEvent read FOnEngineStartup write FOnEngineStartup; + property OnEngineShutdown : TNotifyEvent read FOnEngineShutdown write FOnEngineShutdown; + property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; + property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; + property IniPath : AnsiString read FIniPath write FIniPath; + {$IFNDEF PHP540} + property SafeMode : boolean read FSafeMode write FSafeMode default false; + property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; + {$ENDIF} + property RegisterGlobals : boolean read FRegisterGlobals write FRegisterGlobals default true; + property HTMLErrors : boolean read FHTMLErrors write FHTMLErrors default false; + property MaxInputTime : integer read FMaxInputTime write FMaxInputTime default 0; + property Constants : TPHPConstants read FConstants write SetConstants; + property DLLFolder : AnsiString read FDLLFolder write FDLLFolder; + property ReportDLLError : boolean read FReportDLLError write FReportDLLError; + end; + + TpsvCustomPHP = class(TPHPComponent) + private + FHeaders : TPHPHeaders; + FMaxExecutionTime : integer; + FExecuteMethod : TPHPExecuteMethod; + FSessionActive : boolean; + FOnRequestStartup : TNotifyEvent; + FOnRequestShutdown : TNotifyEvent; + FAfterExecute : TNotifyEvent; + FBeforeExecute : TNotifyEvent; + FTerminated : boolean; + FVariables : TPHPVariables; + FBuffer : TPHPMemoryStream; + FFileName : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; + {$IFDEF PHP4} + FWriterHandle : THandle; + FVirtualReadHandle : THandle; + FVirtualWriteHandle : THandle; + FVirtualCode : AnsiString; + {$ENDIF} + FUseDelimiters : boolean; + FUseMapping : boolean; + FPostStream : TMemoryStream; + FOnReadPost : TPHPReadPostEvent; + FRequestType : TPHPRequestType; + FOnReadResult : TPHPReadResultEvent; + FContentType: AnsiString; + {$IFDEF PHP5} + FVirtualStream : TMemoryStream; + {$ENDIF} + procedure SetVariables(Value : TPHPVariables); + procedure SetHeaders(Value : TPHPHeaders); + function GetVariableCount: integer; + protected + + procedure ClearBuffer; + procedure ClearHeaders; + procedure PrepareResult; virtual; + procedure PrepareVariables; virtual; + function RunTime : boolean; + function GetThreadSafeResourceManager : pointer; + function CreateVirtualFile(ACode : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}) : boolean; + procedure CloseVirtualFile; + {$IFDEF PHP4} + property VirtualCode : string read FVirtualCode; + {$ENDIF} + function GetEngine : IPHPEngine; + public + TSRMLS_D : pointer; + Thread: TThread; + {fixed} + procedure StartupRequest; virtual; + procedure ShutdownRequest; virtual; + {/fixed} + + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + function EngineActive : boolean; + function Execute : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; overload; + function Execute(AFileName : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}) : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; overload; + function RunCode(ACode : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}) : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; overload; + function RunCode(ACode : TStrings) : string; overload; + function VariableByName(AName : AnsiString) : TPHPVariable; + property PostStream : TMemoryStream read FPostStream; + property ExecuteMethod : TPHPExecuteMethod read FExecuteMethod write FExecuteMethod default emServer; + property FileName : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF} read FFileName write FFileName; + property Variables : TPHPVariables read FVariables write SetVariables; + property VariableCount : integer read GetVariableCount; + property OnRequestStartup : TNotifyEvent read FOnRequestStartup write FOnRequestStartup; + property OnRequestShutdown : TNotifyEvent read FOnRequestShutdown write FOnRequestShutdown; + property BeforeExecute : TNotifyEvent read FBeforeExecute write FBeforeExecute; + property AfterExecute : TNotifyEvent read FAfterExecute write FAfterExecute; + property ThreadSafeResourceManager : pointer read GetThreadSafeResourceManager; + property SessionActive : boolean read FSessionActive; + property UseDelimiters : boolean read FUseDelimiters write FUseDelimiters default true; + property MaxExecutionTime : integer read FMaxExecutionTime write FMaxExecutionTime default 0; + property Headers : TPHPHeaders read FHeaders write SetHeaders; + property OnReadPost : TPHPReadPostEvent read FOnReadPost write FOnReadPost; + property RequestType : TPHPRequestType read FRequestType write FRequestType default prtGet; + property ResultBuffer : TPHPMemoryStream read FBuffer; + property OnReadResult : TPHPReadResultEvent read FOnReadResult write FOnReadResult; + property ContentType : AnsiString read FContentType write FContentType; + end; + + + TpsvPHP = class(TpsvCustomPHP) + published + property About; + property FileName; + property Variables; + property OnRequestStartup; + property OnRequestShutdown; + property OnReadPost; + property BeforeExecute; + property AfterExecute; + property UseDelimiters; + property MaxExecutionTime; + property RequestType; + property OnReadResult; + property ContentType; + end; + + +var + PHPEngine : TPHPEngine = nil; + + var + delphi_sapi_module : sapi_module_struct; + fatal_handler_php: string; + log_handler_php: string; + phpmd: TpsvPHP; + +implementation + +uses + PHPFunctions; + + + + +{$IFDEF REGISTER_COLORS} +const + Colors: array[0..41] of TIdentMapEntry = ( + (Value: clBlack; Name: 'clBlack'), + (Value: clMaroon; Name: 'clMaroon'), + (Value: clGreen; Name: 'clGreen'), + (Value: clOlive; Name: 'clOlive'), + (Value: clNavy; Name: 'clNavy'), + (Value: clPurple; Name: 'clPurple'), + (Value: clTeal; Name: 'clTeal'), + (Value: clGray; Name: 'clGray'), + (Value: clSilver; Name: 'clSilver'), + (Value: clRed; Name: 'clRed'), + (Value: clLime; Name: 'clLime'), + (Value: clYellow; Name: 'clYellow'), + (Value: clBlue; Name: 'clBlue'), + (Value: clFuchsia; Name: 'clFuchsia'), + (Value: clAqua; Name: 'clAqua'), + (Value: clWhite; Name: 'clWhite'), + (Value: clScrollBar; Name: 'clScrollBar'), + (Value: clBackground; Name: 'clBackground'), + (Value: clActiveCaption; Name: 'clActiveCaption'), + (Value: clInactiveCaption; Name: 'clInactiveCaption'), + (Value: clMenu; Name: 'clMenu'), + (Value: clWindow; Name: 'clWindow'), + (Value: clWindowFrame; Name: 'clWindowFrame'), + (Value: clMenuText; Name: 'clMenuText'), + (Value: clWindowText; Name: 'clWindowText'), + (Value: clCaptionText; Name: 'clCaptionText'), + (Value: clActiveBorder; Name: 'clActiveBorder'), + (Value: clInactiveBorder; Name: 'clInactiveBorder'), + (Value: clAppWorkSpace; Name: 'clAppWorkSpace'), + (Value: clHighlight; Name: 'clHighlight'), + (Value: clHighlightText; Name: 'clHighlightText'), + (Value: clBtnFace; Name: 'clBtnFace'), + (Value: clBtnShadow; Name: 'clBtnShadow'), + (Value: clGrayText; Name: 'clGrayText'), + (Value: clBtnText; Name: 'clBtnText'), + (Value: clInactiveCaptionText; Name: 'clInactiveCaptionText'), + (Value: clBtnHighlight; Name: 'clBtnHighlight'), + (Value: cl3DDkShadow; Name: 'cl3DDkShadow'), + (Value: cl3DLight; Name: 'cl3DLight'), + (Value: clInfoText; Name: 'clInfoText'), + (Value: clInfoBk; Name: 'clInfoBk'), + (Value: clNone; Name: 'clNone')); +{$ENDIF} + + +{$IFDEF PHP510} +procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + php : TpsvPHP; + gl : psapi_globals_struct; + Lib : IPHPEngine; +{$IFNDEF PHP510} + return_value_ptr : ppzval; +{$ENDIF} +begin + {$IFNDEF PHP510} + return_value_ptr := nil; + {$ENDIF} + ZVAL_NULL(return_value); + gl := GetSAPIGlobals; + if gl = nil then + Exit; + php := TpsvPHP(gl^.server_context); + if Assigned(php) then + begin + try + Lib := php.GetEngine; + if lib <> nil then + Lib.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); + except + ZVAL_NULL(return_value); + end; + end; +end; + + +procedure php_info_library(zend_module : Pointer; TSRMLS_DC : pointer); cdecl; +begin +end; + +function php_delphi_startup(sapi_module : Psapi_module_struct) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function php_delphi_deactivate(p : pointer) : integer; cdecl; +begin + result := SUCCESS; +end; + + +procedure php_delphi_flush(p : pointer); cdecl; +begin +end; + +function php_delphi_ub_write(str : pointer; len : uint; p : pointer) : integer; cdecl; +var + php : TpsvPHP; + gl : psapi_globals_struct; +begin + Result := 0; + gl := GetSAPIGlobals; + if Assigned(gl) then + begin + php := TpsvPHP(gl^.server_context); + if Assigned(php) then + begin + try + result := php.FBuffer.Write(str^, len); + except + end; + end; + end; +end; + + +function GetLocalIP: String; +const WSVer = $101; +var + wsaData: TWSAData; + P: PHostEnt; + Buf: array [0..127] of Char; +begin + Result := ''; + if WSAStartup(WSVer, wsaData) = 0 then begin + if GetHostName(@Buf, 128) = 0 then begin + P := GetHostByName(@Buf); + if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); + end; + WSACleanup; + end; +end; + +procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; +var + php : TpsvPHP; + gl : psapi_globals_struct; + cnt : integer; + varcnt : integer; +begin + gl := GetSAPIGlobals; + if gl = nil then + Exit; + + php := TpsvPHP(gl^.server_context); + + if PHP = nil then + begin + Exit; + end; + + php_register_variable('PHP_SELF', '_', nil, p); + php_register_variable('REMOTE_ADDR', PAnsiChar(GetLocalIP()), val, p); + php_register_variable('IP_ADDRESS', PAnsiChar(GetLocalIP()), val, p); + {if php.RequestType = prtPost then + php_register_variable('REQUEST_METHOD', 'POST', val, p) + else + php_register_variable('REQUEST_METHOD', 'GET', val, p);} + + varcnt := PHP.Variables.Count; + if varcnt > 0 then + begin + for cnt := 0 to varcnt - 1 do + begin + php_register_variable(PAnsiChar(php.Variables[cnt].Name), + PAnsiChar(php.Variables[cnt].Value), val, p); + end; + end; +end; + +function php_delphi_read_post(buf : PAnsiChar; len : uint; TSRMLS_DC : pointer) : integer; cdecl; +var + gl : psapi_globals_struct; + php : TpsvPHP; +begin + gl := GetSAPIGlobals; + if gl = nil then + begin + Result := 0; + Exit; + end; + + php := TpsvPHP(gl^.server_context); + + if PHP = nil then + begin + Result := 0; + Exit; + end; + + if php.PostStream = nil then + begin + Result := 0; + Exit; + end; + + if php.PostStream.Size = 0 then + begin + Result := 0; + Exit; + end; + + Result := php.PostStream.Read(buf^, len); +end; + +function AddSlashes(const S: ansistring): ansistring; +begin + Result := StringReplace(S, chr(8), '8', [rfReplaceAll]); + Result := StringReplace(S, '\', '\\', [rfReplaceAll]); + Result := StringReplace(Result, '''', '\''', [rfReplaceAll]); + Result := StringReplace(Result, ' '' then begin - php.FOnScriptError(php, Err_Msg, err, error_filename, error_lineno); - end - else - begin - case _type of - E_ERROR, - E_CORE_ERROR, - E_COMPILE_ERROR, - E_USER_ERROR: - error_type_str := 'Fatal error'; - E_WARNING, - E_CORE_WARNING, - E_COMPILE_WARNING, - E_USER_WARNING : - error_type_str := 'Warning'; - E_PARSE: - error_type_str := 'Parse error'; - E_NOTICE, - E_USER_NOTICE: - error_type_str := 'Notice'; - else - error_type_str := 'Unknown error'; - end; - - php_log_err(PChar(Format('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); - end; - end; - - _zend_bailout(error_filename, error_lineno); -end; - - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RegisterInternalClasses(TSRMLS_DC); - module_active := true; - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - module_active := false; - RESULT := SUCCESS; -end; - -{ TpsvCustomPHP } - -constructor TpsvCustomPHP.Create(AOwner: TComponent); -begin - inherited; - FSafeMode := false; - FSafeModeGid := false; - FMaxExecutionTime := 0; - FMaxInputTime := 0; - FRegisterGlobals := true; - FExecuteMethod := emServer; - FModuleActive := false; - FSessionActive := false; - FAdditionalModules := TList.Create; - FVariables := TPHPVariables.Create(Self); - FConstants := TPHPConstants.Create(Self); - FHeaders := TPHPHeaders.Create(Self); - FHandleErrors := true; - FHTMLErrors := false; - FKeepSession := false; - FUseDelimiters := true; -end; - -destructor TpsvCustomPHP.Destroy; -begin - ShutdownModule; - FVariables.Free; - FConstants.Free; - FHeaders.Free; - FAdditionalModules.Free; - FModuleActive := false; - FSessionActive := False; - inherited; -end; - -procedure TpsvCustomPHP.ClearBuffer; -begin - FBuffer := ''; -end; - -procedure TpsvCustomPHP.ClearHeaders; -begin - FHeaders.Clear; -end; - -procedure TpsvCustomPHP.StartupModule; -var - i : integer; - p : pointer; -begin - if php_delphi_module.module_started = 0 then - begin - StartupPHP; - - PrepareModule; - - if FModuleActive then - raise EDelphiErrorEx.Create('PHP engine already active'); - - if not PHPLoaded then //Peter Enz - begin - raise EDelphiErrorEx.Create('PHP engine is not active'); - end; - - try - //Start PHP thread safe resource manager - tsrm_startup(128, 1, TSRM_ERROR_LEVEL_CORE , nil); - sapi_startup(@delphi_sapi_module); - php_module_startup(@delphi_sapi_module, @php_delphi_module, 1); - TSRMLS_D := ts_resource_ex(0, nil); - - PrepareIniEntry; - RegisterConstants; - if FKeepSession then - PG(TSRMLS_D)^.output_buffering := 0; - - - for i := 0 to FAdditionalModules.Count -1 do - begin - p := FAdditionalModules[i]; - TCustomPHPLibrary(p).Refresh; - p := @TCustomPHPLibrary(p).LibraryEntry; - {$IFDEF PHP510} - php_register_extensions(@p, 1, TSRMLS_D); - {$ELSE} - php_startup_extensions(@p, 1); - {$ENDIF} - end; - - if Assigned(FOnModuleStartup) then - FOnModuleStartup(Self); - - FModuleActive := true; - except - FModuleActive := false; - end; - end - else - begin - FModuleActive := true; - TSRMLS_D := ts_resource_ex(0, nil); - end; - StartupRequest; -end; - -function TpsvCustomPHP.Execute : string; -var - file_handle : zend_file_handle; -begin - ClearHeaders; - ClearBuffer; - - if Assigned(FBeforeExecute) then - FBeforeExecute(Self); - - - - FTerminated := false; - if not FUseMapping then - begin - if not FileExists(FFileName) then - raise Exception.CreateFmt('File %s does not exists', [FFileName]); - end; - - if not FModuleActive then - StartupModule - else - StartupRequest; - - if FKeepSession then - PrepareVariables(TSRMLS_D); - - FillChar(file_handle, sizeof(zend_file_handle), 0); - if FUseMapping then - begin - file_handle._type := ZEND_HANDLE_FD; - file_handle.opened_path := nil; - file_handle.filename := '-'; - file_handle.free_filename := 0; - file_handle.handle.fd := FVirtualReadHandle; - end - else - begin - file_handle._type := ZEND_HANDLE_FILENAME; - file_handle.filename := PChar(FFileName); - file_handle.opened_path := nil; - file_handle.free_filename := 0; - end; - - - try - php_execute_script(@file_handle, TSRMLS_D); - except - FBuffer := ''; - end; - - PrepareResult(TSRMLS_D); - - - - if Assigned(FAfterExecute) then - FAfterExecute(Self); - - if not FKeepSession then - ShutdownRequest; - - Result := FBuffer; -end; - -function TpsvCustomPHP.RunCode(ACode : string) : string; -begin - ClearHeaders; - ClearBuffer; - FUseMapping := true; - try - if FUseDelimiters then - begin - if Pos('', ACode) = 0 then - ACode := ACode + ' ?>'; - end; - if not CreateVirtualFile(ACode) then - begin - Result := ''; - Exit; - end; - Result := Execute; - CloseVirtualFile; - finally - FUseMapping := false; - end; -end; - - - -procedure TpsvCustomPHP.PrepareModule; -begin - if php_delphi_module.module_started = 1 then - Exit; - - delphi_sapi_module.name := 'embed'; //to solve a problem with dl() - delphi_sapi_module.pretty_name := 'PHP for Delphi'; (* pretty name *) - delphi_sapi_module.startup := php_delphi_startup; (* startup *) - delphi_sapi_module.shutdown := php_module_shutdown_wrapper; (* shutdown *) - delphi_sapi_module.activate:= nil; (* activate *) - delphi_sapi_module.deactivate := @php_delphi_deactivate; (* deactivate *) - delphi_sapi_module.ub_write := @php_delphi_ub_write; (* unbuffered write *) - delphi_sapi_module.flush := nil; - delphi_sapi_module.stat:= nil; - delphi_sapi_module.getenv:= nil; - delphi_sapi_module.sapi_error := @zend_error; (* error handler *) - delphi_sapi_module.header_handler := @php_delphi_header_handler; - delphi_sapi_module.send_headers := nil; - delphi_sapi_module.send_header := @php_delphi_send_header; - delphi_sapi_module.read_post := nil; - delphi_sapi_module.read_cookies := @php_delphi_read_cookies; - delphi_sapi_module.register_server_variables := @php_delphi_register_variables; (* register server variables *) - delphi_sapi_module.log_message := @php_delphi_log_message; (* Log message *) - if FIniPath <> '' then - delphi_sapi_module.php_ini_path_override := PChar(FIniPath) - else - delphi_sapi_module.php_ini_path_override := nil; - delphi_sapi_module.block_interruptions := nil; - delphi_sapi_module.unblock_interruptions := nil; - delphi_sapi_module.default_post_reader := nil; - delphi_sapi_module.treat_data := nil; - delphi_sapi_module.executable_location := nil; - delphi_sapi_module.php_ini_ignore := 0; - - InitDelphiFunctions; - php_delphi_module.size := sizeOf(Tzend_module_entry); - php_delphi_module.zend_api := ZEND_MODULE_API_NO; - php_delphi_module.zend_debug := 0; - php_delphi_module.zts := USING_ZTS; - php_delphi_module.name := 'php4delphi_support'; - php_delphi_module.functions := @DelphiTable[0]; - php_delphi_module.module_startup_func := @minit; - php_delphi_module.module_shutdown_func := @mshutdown; - php_delphi_module.info_func := @php_info_delphi; - php_delphi_module.version := '6.2'; - {$IFDEF PHP4} - php_delphi_module.global_startup_func := nil; - {$ENDIF} - php_delphi_module.request_shutdown_func := nil; - php_delphi_module.global_id := 0; - php_delphi_module.module_started := 0; - php_delphi_module._type := 0; - php_delphi_module.handle := nil; - php_delphi_module.module_number := 0; -end; - -function TpsvCustomPHP.RunCode(ACode: TStrings): string; -begin - if Assigned(ACode) then - Result := RunCode(ACode.Text); -end; - -procedure TpsvCustomPHP.SetConstants(Value: TPHPConstants); -begin - FConstants.Assign(Value); -end; - -procedure TpsvCustomPHP.SetVariables(Value: TPHPVariables); -begin - FVariables.Assign(Value); -end; - -procedure TpsvCustomPHP.SetHeaders(Value : TPHPHeaders); -begin - FHeaders.Assign(Value); -end; - -procedure TpsvCustomPHP.PrepareIniEntry; + S := AnsiString(fatal_handler_php + '(' + '''' + AddSlashes(msg) + '''' + + ');' + ' ?>'); + + if not phpmd.UseDelimiters then + S := ' 0 then - begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - end; - - FActiveFunctionName := get_active_function_name(TSRMLS_DC); - - for i := 0 to FAdditionalModules.Count - 1 do - begin - for cnt := 0 to TCustomPHPLibrary(FAdditionalModules[i]).Functions.Count - 1 do - begin - if SameText(TCustomPHPLibrary(FAdditionalModules[i]).Functions[cnt].FunctionName, FActiveFunctionName) then - begin - TCustomPHPLibrary(FAdditionalModules[i]).ActiveFunctionName := FActiveFunctionName; - AFunction := TCustomPHPLibrary(FAdditionalModules[i]).Functions[cnt]; - if Assigned(AFunction.OnExecute) then - begin - if AFunction.Parameters.Count <> ht then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - if ht > 0 then - begin - for j := 0 to ht - 1 do - begin - if not IsParamTypeCorrect(AFunction.Parameters[j].ParamType, Params[j]^) then - begin - zend_error(E_WARNING, PChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); - Exit; - end; - AFunction.Parameters[j].ZendValue := (Params[j]^); - end; - end; // if ht > 0 - - AFunction.ZendVar.AsZendVariable := return_value; //direct access to zend variable - AFunction.OnExecute(Self, AFunction.Parameters, AFunction.ReturnValue, this_ptr, TSRMLS_DC); - if AFunction.ZendVar.ISNull then //perform variant conversion - variant2zval(AFunction.ReturnValue, return_value); - end; //if assigned AFunction.OnExecute - Exit; - end; //found function - end; //functions.count + LText := LText + AFname + '(' + inttostr(ALineNo) + '): ' + LBuffer; + if (fatal_handler_php <> '') and not(Atype in [E_CORE_ERROR, E_CORE, E_CORE_WARNING]) then + begin + S := AnsiString(fatal_handler_php + '(' + IntToStr(integer(AType)) + ',' + '''' + + AddSlashes(LBuffer) + ''', ''' + AddSlashes(AFName) + ''', ' + + IntToStr(ALineNo) + ');' + ' ?>'); - end; //modules.count - finally - dispose_pzval_array(Params); - end; -end; + if not phpmd.UseDelimiters then + S := ' 0 then - Close(FVirtualReadHandle); -end; - -function TpsvCustomPHP.CreateVirtualFile(ACode : string): boolean; -var - _handles : array[0..1] of THandle; -begin - Result := false; - if ACode = '' then - Exit; //empty buffer was provided - - if pipe(@_handles, Length(ACode) + 512, 0) = -1 then - Exit; - - FVirtualReadHandle := _handles[0]; - FVirtualWriteHandle := _handles[1]; - _write(FVirtualWriteHandle, @ACode[1], Length(ACode)); - close(_handles[1]); - - Result := true; -end; - -procedure TpsvCustomPHP.StartupPHP; -var - DLLName : string; -begin - if not PHPLoaded then - begin - if FDLLFolder <> '' then - begin - {$IFDEF PHP5} - DLLName := IncludeTrailingBackslash(FDLLFolder) + 'php5ts.dll'; - {$ELSE} - DLLName := IncludeTrailingBackslash(FDLLFolder) + 'php4ts.dll'; - {$ENDIF} - LoadPHP(DLLName); - end - else - {$IFDEF PHP5} - DLLName := 'php5ts.dll'; - {$ELSE} - DLLName := 'php4ts.dll'; - {$ENDIF} - LoadPHP; - if FReportDLLError then - begin - if PHPLib = 0 then raise Exception.CreateFmt('%s not found', [DllName]); - end; - end; -end; - -end. - - + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + + +{Request initialization} +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +{Request shutdown} +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +{$IFDEF PHP5} + +{PHP 5 only} +function delphi_stream_reader (handle : pointer; buf : PAnsiChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS = nil then + result := 0 + else + try + result := MS.Read(buf^, len); + except + result := 0; + end; +end; + +{PHP 5 only} +procedure delphi_stream_closer(handle : pointer; TSRMLS_DC : pointer); cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + MS.Clear; + except + end; +end; + +{$IFDEF PHP530} +function delphi_stream_fsizer(handle : pointer; TSRMLS_DC : pointer) : size_t; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + result := MS.Size; + except + Result := 0; + end + else + Result := 0; +end; +{$ELSE} +{$IFDEF PHP510} + +{ PHP 5.10 and higher } +function delphi_stream_teller(handle : pointer; TSRMLS_DC : pointer) : longint; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + result := MS.Size; + except + Result := 0; + end + else + Result := 0; +end; +{$ENDIF} +{$ENDIF} +{$ENDIF} + +{ TpsvCustomPHP } + +constructor TpsvCustomPHP.Create(AOwner: TComponent); +begin + inherited; + FMaxExecutionTime := 0; + FExecuteMethod := emServer; + FSessionActive := false; + FVariables := TPHPVariables.Create(Self); + FHeaders := TPHPHeaders.Create(Self); + FUseDelimiters := true; + FRequestType := prtGet; + FBuffer := TPHPMemoryStream.Create; + {$IFDEF PHP4} + FVirtualCode := ''; + {$ELSE} + FVirtualStream := TMemoryStream.Create; + {$ENDIF} +end; + +destructor TpsvCustomPHP.Destroy; +begin + FVariables.Free; + FHeaders.Free; + FSessionActive := False; + FBuffer.Free; + {$IFDEF PHP4} + FVirtualCode := ''; + {$ELSE} + if FVirtualStream <> nil then + FreeAndNil(FVirtualStream); + {$ENDIF} + if Assigned(FPostStream) then + FreeAndNil(FPostStream); + inherited; +end; + +procedure TpsvCustomPHP.ClearBuffer; +begin + FBuffer.Clear; +end; + +procedure TpsvCustomPHP.ClearHeaders; +begin + FHeaders.Clear; +end; + + +{$IFDEF PHP4} +function WriterProc(Parameter : Pointer) : integer; +var + n : integer; + php : TpsvCustomPHP; + buf : PAnsiChar; + k : cardinal; +begin + try + php := TPsvCustomPHP(Parameter); + Buf := PAnsiChar(php.FVirtualCode); + k := length(php.FVirtualCode); + repeat + n := _write(php.FVirtualWriteHandle, Buf, k); + if (n <= 0) then + break + else + begin + inc(Buf, n); + dec(K, n); + end; + until (n <= 0); + Close(php.FVirtualWriteHandle); + php.FVirtualWriteHandle := 0; + finally + Result := 0; + ExitThread(0); + end; +end; +{$ENDIF} + +function TpsvCustomPHP.Execute : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; +var + file_handle : zend_file_handle; + {$IFDEF PHP4} + thread_id : cardinal; + {$ENDIF} + {$IFDEF PHP5} + ZendStream : TZendStream; + {$ENDIF} +begin + + if not EngineActive then + begin + Result := ''; + Exit; + end; + + if PHPEngine.WaitForShutdown then + begin + Result := ''; + Exit; + end; + + PHPEngine.AddRequest; + + try + ClearHeaders; + ClearBuffer; + + if Assigned(FBeforeExecute) then + FBeforeExecute(Self); + + + + FTerminated := false; + if not FUseMapping then + begin + if not FileExists(FFileName) then + raise Exception.CreateFmt('File %s does not exists', [FFileName]); + end; + + StartupRequest; + + + ZeroMemory(@file_handle, sizeof(zend_file_handle)); + + if FUseMapping then + begin + {$IFDEF PHP5} + ZeroMemory(@ZendStream, sizeof(ZendStream)); + ZendStream.reader := delphi_stream_reader; + ZendStream.closer := delphi_stream_closer; + {$IFDEF PHP530} + ZendStream.fsizer := delphi_stream_fsizer; + {$ELSE} + {$IFDEF PHP510} + ZendStream.fteller := delphi_stream_teller; + {$ENDIF} + ZendStream.interactive := 0; + {$ENDIF} + + ZendStream.handle := FVirtualStream; + + file_handle._type := ZEND_HANDLE_STREAM; + file_handle.opened_path := nil; + file_handle.filename := '-'; + file_handle.free_filename := 0; + file_handle.handle.stream := ZendStream; + {$ELSE} + {for PHP4 only} + file_handle._type := ZEND_HANDLE_FD; + file_handle.opened_path := nil; + file_handle.filename := '-'; + file_handle.free_filename := 0; + file_handle.handle.fd := FVirtualReadHandle; + FWriterHandle := BeginThread(nil, 8192, @WriterProc, Self, 0, thread_id); + {$ENDIF} + end + else + begin + file_handle._type := ZEND_HANDLE_FILENAME; + file_handle.filename := PAnsiChar(FFileName); + file_handle.opened_path := nil; + file_handle.free_filename := 0; + end; + + try + php_execute_script(@file_handle, TSRMLS_D); + except + FBuffer.Clear; + try + ts_free_thread; + except + + end; + end; + + PrepareResult; + + + if Assigned(FAfterExecute) then + FAfterExecute(Self); + + //ShutdownRequest; + + FBuffer.Position := 0; + if Assigned(FOnReadResult) then + begin + FOnReadResult(Self, FBuffer); + Result := ''; + end + else + begin + SetLength(Result, FBuffer.Size); + FBuffer.Read(Result[1], FBuffer.Size); + end; + FBuffer.Clear; + {$IFDEF PHP4} + FVirtualCode := ''; + {$ENDIF} + finally + PHPEngine.RemoveRequest; + end; +end; + +function TpsvCustomPHP.RunCode(ACode : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}) : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; +begin + if not EngineActive then + begin + Result := ''; + Exit; + end; + + ClearHeaders; + ClearBuffer; + FUseMapping := true; + try + if FUseDelimiters then + begin + if Pos('', [ACode]); + end; + if not CreateVirtualFile(ACode) then + begin + Result := ''; + Exit; + end; + Result := Execute; + CloseVirtualFile; + finally + FUseMapping := false; + end; +end; + + +function TpsvCustomPHP.RunCode(ACode: TStrings): string; +begin + if Assigned(ACode) then + Result := RunCode(ACode.Text); +end; + + +procedure TpsvCustomPHP.SetVariables(Value: TPHPVariables); +begin + FVariables.Assign(Value); +end; + +procedure TpsvCustomPHP.SetHeaders(Value : TPHPHeaders); +begin + FHeaders.Assign(Value); +end; + + + +function TpsvCustomPHP.Execute(AFileName: {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}): {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; +begin + FFileName := AFileName; + Result := Execute; +end; + +procedure TpsvCustomPHP.PrepareResult; +var + ht : PHashTable; + data: ^ppzval; + cnt : integer; + variable : pzval; + {$IFDEF PHP5} + EG : pzend_executor_globals; + {$ENDIF} +begin + if FVariables.Count = 0 then + Exit; + + if FExecuteMethod = emServer then + {$IFDEF PHP4} + ht := GetSymbolsTable + {$ELSE} + begin + EG := GetExecutorGlobals; + if Assigned(EG) then + ht := @EG.symbol_table + else + ht := nil; + end + {$ENDIF} + else + ht := GetTrackHash('_GET'); + if Assigned(ht) then + begin + for cnt := 0 to FVariables.Count - 1 do + begin + new(data); + try + if zend_hash_find(ht, PAnsiChar(FVariables[cnt].Name), + strlen(PAnsiChar(FVariables[cnt].Name)) + 1, data) = SUCCESS then + begin + variable := data^^; + convert_to_string(variable); + FVariables[cnt].Value := variable^.value.str.val; + end; + finally + freemem(data); + end; + end; + end; +end; + +function TpsvCustomPHP.VariableByName(AName: AnsiString): TPHPVariable; +begin + Result := FVariables.ByName(AName); +end; + +{Indicates activity of PHP Engine} +function TpsvCustomPHP.EngineActive : boolean; +begin + if Assigned(PHPEngine) then + Result := PHPEngine.EngineActive + else + Result := false; +end; + +procedure TpsvCustomPHP.StartupRequest; +var + gl : psapi_globals_struct; + TimeStr : string; +begin + if not EngineActive then + raise EDelphiErrorEx.Create('PHP engine is not active '); + + if FSessionActive then + Exit; + + TSRMLS_D := tsrmls_fetch; + + gl := GetSAPIGlobals; + gl^.server_context := Self; + + if PHPEngine.RegisterGlobals then + GetPHPGlobals(TSRMLS_D)^.register_globals := true; + + try + if Assigned(FOnReadPost) then + FOnReadPost(Self, FPostStream); + + zend_alter_ini_entry('max_execution_time', 19, PAnsiChar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_RUNTIME); + + php_request_startup(TSRMLS_D); + if Assigned(FOnRequestStartup) then + FOnRequestStartup(Self); + + FSessionActive := true; + except + FSessionActive := false; + end; +end; + +function TpsvCustomPHP.RunTime: boolean; +begin + Result := not (csDesigning in ComponentState); +end; + +function TpsvCustomPHP.GetThreadSafeResourceManager: pointer; +begin + Result := TSRMLS_D; +end; + +function TpsvCustomPHP.GetVariableCount: integer; +begin + Result := FVariables.Count; +end; + + +procedure TpsvCustomPHP.ShutdownRequest; +var + gl : psapi_globals_struct; +begin + if not FSessionActive then + Exit; + try + + if not FTerminated then + begin + try + php_request_shutdown(nil); + except + end; + gl := GetSAPIGlobals; + gl^.server_context := nil; + end; + + + if Assigned(FOnRequestShutdown) then + FOnRequestShutdown(Self); + + finally + FSessionActive := false; + end; + +end; + + +procedure TpsvCustomPHP.PrepareVariables; +var + ht : PHashTable; + data: ^ppzval; + cnt : integer; + {$IFDEF PHP5} + EG : pzend_executor_globals; + {$ENDIF} +begin + {$IFDEF PHP4} + ht := GetSymbolsTable; + {$ELSE} + begin + EG := GetExecutorGlobals; + if Assigned(EG) then + ht := @EG.symbol_table + else + ht := nil; + end; + {$ENDIF} + + if Assigned(ht) then + begin + for cnt := 0 to FVariables.Count - 1 do + begin + new(data); + try + if zend_hash_find(ht, PAnsiChar(FVariables[cnt].Name), + strlen(PAnsiChar(FVariables[cnt].Name)) + 1, data) = SUCCESS then + begin + if (data^^^._type = IS_STRING) then + begin + efree(data^^^.value.str.val); + ZVAL_STRING(data^^, PAnsiChar(FVariables[cnt].Value), true); + end + else + begin + ZVAL_STRING(data^^, PAnsiChar(FVariables[cnt].Value), true); + end; + end; + finally + freemem(data); + end; + end; + end; +end; + +procedure TpsvCustomPHP.CloseVirtualFile; +begin + {$IFDEF PHP4} + if FWriterHandle <> 0 then + begin + WaitForSingleObject(FWriterHandle, INFINITE); + CloseHandle(FWriterHandle); + FWriterHandle := 0; + end; + {$ELSE} + FVirtualStream.Clear; + {$ENDIF} +end; + +function TpsvCustomPHP.CreateVirtualFile(ACode : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}): boolean; +{$IFDEF PHP4} +var + _handles : array[0..1] of THandle; +{$ENDIF} +begin + + Result := false; + {$IFDEF PHP4} + if ACode = '' then + begin + FVirtualReadHandle := 0; + FVirtualWriteHandle := 0; + Exit; {empty buffer was provided} + end; + + FVirtualCode := ACode; + + if pipe(@_handles, 4096, 0) = -1 then + begin + FVirtualReadHandle := 0; + FVirtualWriteHandle := 0; + FVirtualCode := ''; + Exit; + end; + + FVirtualReadHandle := _handles[0]; + FVirtualWriteHandle := _handles[1]; + Result := true; + {$ELSE} + if ACode = '' then + Exit; + try + FVirtualStream.Clear; + FVirtualStream.Write(ACode[1], Length(ACode)); + FVirtualStream.Position := 0; + Result := true; + except + Result := false; + end; + {$ENDIF} +end; + + +function TpsvCustomPHP.GetEngine: IPHPEngine; +begin + Result := PHPEngine; +end; + +{ TPHPEngine } + + +constructor TPHPEngine.Create(AOwner: TComponent); +begin + inherited; + if Assigned(PHPEngine) then + raise Exception.Create('Only one instance of PHP engine per application'); + FEngineActive := false; + FHandleErrors := true; + {$IFNDEF PHP540} + FSafeMode := false; + FSafeModeGid := false; + {$ENDIF} + FRegisterGlobals := true; + FHTMLErrors := false; + FMaxInputTime := 0; + FWaitForShutdown := false; + FConstants := TPHPConstants.Create(Self); + FRequestCount := 0; + FHash := TStringList.Create; + FHash.Duplicates := dupError; + FHash.Sorted := true; + InitializeCriticalSection(FLock); + PHPEngine := Self; + + MyFuncs := TStringList.Create; +end; + +destructor TPHPEngine.Destroy; +begin + ShutdownAndWaitFor; + FEngineActive := false; + FConstants.Free; + FHash.Free; + MyFuncs.Free; + DeleteCriticalSection(FLock); + if (PHPEngine = Self) then + PHPEngine := nil; + inherited; + if PHPLoaded then + UnloadPHP; +end; + +function TPHPEngine.GetConstantCount: integer; +begin + Result := FConstants.Count; +end; + +procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; + return_value_ptr: ppzval; this_ptr: pzval; return_value_used: integer; + TSRMLS_DC: pointer); + +var + Params : pzval_array; + AFunction : TPHPFunction; + j : integer; + FActiveFunctionName : string; + FunctionIndex : integer; + FZendVar : TZendVariable; + FParameters : TFunctionParams; + ReturnValue : variant; +begin + FParameters := TFunctionParams.Create(nil, TFunctionParam); + try + + if ht > 0 then + begin + if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + end; + + FActiveFunctionName := get_active_function_name(TSRMLS_DC); + if FHash.Find(FActiveFunctionName, FunctionIndex) then + AFunction := TPHPFunction(FHash.Objects[FunctionIndex]) + else + AFunction := nil; + + if Assigned(AFunction) then + begin + if AFunction.Collection = nil then + Exit; {library was destroyed} + + if Assigned(AFunction.OnExecute) then + begin + if AFunction.Parameters.Count <> ht then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + FParameters.Assign(AFunction.Parameters); + if ht > 0 then + begin + for j := 0 to ht - 1 do + begin + if not IsParamTypeCorrect(FParameters[j].ParamType, Params[j]^) then + begin + zend_error(E_WARNING, PAnsiChar(AnsiFormat('Wrong parameter type for %s()', [FActiveFunctionName]))); + Exit; + end; + FParameters[j].ZendValue := (Params[j]^); + end; + end; { if ht > 0} + + FZendVar := TZendVariable.Create; + try + FZendVar.AsZendVariable := return_value; + AFunction.OnExecute(Self, FParameters, ReturnValue, FZendVar, TSRMLS_DC); + if FZendVar.ISNull then {perform variant conversion} + variant2zval(ReturnValue, return_value); + finally + FZendVar.Free; + end; + end; {if assigned AFunction.OnExecute} + end; + + finally + FParameters.Free; + dispose_pzval_array(Params); + end; +end; + +procedure TPHPEngine.PrepareIniEntry; +var + p : integer; + TimeStr : string; +begin + if not PHPLoaded then + Exit; + + if FHandleErrors then + begin + // p := integer(GetProcAddress(PHPLib, 'zend_do_print')); + p := integer(GetProcAddress(PHPLib, 'zend_error_cb')); + asm + mov edx, dword ptr [p] + mov dword ptr [edx], offset delphi_error_cb + end; + end; + {$IFNDEF PHP540} + if FSafeMode then + zend_alter_ini_entry('safe_mode', 10, '1', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP) + else + {$ENDIF} + zend_alter_ini_entry('safe_mode', 10, '0', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP); + {$IFNDEF PHP540} + if FSafeModeGID then + zend_alter_ini_entry('safe_mode_gid', 14, '1', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP) + else + {$ENDIF} + zend_alter_ini_entry('safe_mode_gid', 14, '0', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP); + + zend_alter_ini_entry('register_argc_argv', 19, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + + if FRegisterGlobals then + zend_alter_ini_entry('register_globals', 17, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE) + else + zend_alter_ini_entry('register_globals', 17, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + + if FHTMLErrors then + zend_alter_ini_entry('html_errors', 12, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE) + else + zend_alter_ini_entry('html_errors', 12, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + + zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + + TimeStr := IntToStr(FMaxInputTime); + zend_alter_ini_entry('max_input_time', 15, PAnsiChar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); +end; + +procedure TPHPEngine.PrepareEngine; +begin + delphi_sapi_module.name := 'embed'; {to solve a problem with dl()} + delphi_sapi_module.pretty_name := 'PHP for Delphi'; + delphi_sapi_module.startup := php_delphi_startup; + delphi_sapi_module.shutdown := nil; //php_module_shutdown_wrapper; + delphi_sapi_module.activate:= nil; + delphi_sapi_module.deactivate := @php_delphi_deactivate; + delphi_sapi_module.ub_write := @php_delphi_ub_write; + delphi_sapi_module.flush := @php_delphi_flush; + delphi_sapi_module.stat:= nil; + delphi_sapi_module.getenv:= nil; + delphi_sapi_module.sapi_error := @zend_error; + delphi_sapi_module.header_handler := @php_delphi_header_handler; + delphi_sapi_module.send_headers := nil; + delphi_sapi_module.send_header := @php_delphi_send_header; + delphi_sapi_module.read_post := @php_delphi_read_post; + delphi_sapi_module.read_cookies := @php_delphi_read_cookies; + delphi_sapi_module.register_server_variables := @php_delphi_register_variables; + delphi_sapi_module.log_message := @php_delphi_log_message; + if FIniPath <> '' then + delphi_sapi_module.php_ini_path_override := PAnsiChar(FIniPath) + else + delphi_sapi_module.php_ini_path_override := nil; + delphi_sapi_module.block_interruptions := nil; + delphi_sapi_module.unblock_interruptions := nil; + delphi_sapi_module.default_post_reader := nil; + delphi_sapi_module.treat_data := nil; + delphi_sapi_module.executable_location := nil; + delphi_sapi_module.php_ini_ignore := 0; + + FLibraryModule.size := sizeOf(Tzend_module_entry); + FLibraryModule.zend_api := ZEND_MODULE_API_NO; + {$IFDEF PHP_DEBUG} + FLibraryModule.zend_debug := 1; + {$ELSE} + FLibraryModule.zend_debug := 0; + {$ENDIF} + FLibraryModule.zts := USING_ZTS; + FLibraryModule.name := 'php4delphi_internal'; + FLibraryModule.functions := nil; + FLibraryModule.module_startup_func := @minit; + FLibraryModule.module_shutdown_func := @mshutdown; + FLibraryModule.info_func := @php_info_library; + FLibraryModule.version := '8.0 ds'; + + FLibraryModule.request_shutdown_func := @rshutdown; + FLibraryModule.request_startup_func := @rinit; + + FLibraryModule.module_started := 0; + FLibraryModule._type := MODULE_PERSISTENT; + FLibraryModule.handle := nil; + FLibraryModule.module_number := 0; + FLibraryModule.build_id := DupStr(PAnsiChar(ZEND_MODULE_BUILD_ID)); +end; + +procedure TPHPEngine.RegisterConstants; +var + cnt : integer; + ConstantName : AnsiString; + ConstantValue : AnsiString; +begin + for cnt := 0 to FConstants.Count - 1 do + begin + ConstantName := FConstants[cnt].Name; + ConstantValue := FConstants[cnt].Value; + zend_register_string_constant(PAnsiChar(ConstantName), + strlen(PAnsiChar(ConstantName)) + 1, + PAnsiChar(ConstantValue), CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); + end; + + RegisterInternalConstants(TSRMLS_D); +end; + +procedure TPHPEngine.RegisterInternalConstants(TSRMLS_DC: pointer); +{$IFDEF REGISTER_COLORS} +var + i : integer; + ColorName : AnsiString; +{$ENDIF} +begin + {$IFDEF REGISTER_COLORS} + for I := Low(Colors) to High(Colors) do + begin + ColorName := AnsiString(Colors[i].Name); + zend_register_long_constant( PAnsiChar(ColorName), strlen(PAnsiChar(ColorName)) + 1, Colors[i].Value, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + end; + {$ENDIF} +end; + + +procedure TPHPEngine.SetConstants(Value: TPHPConstants); +begin + FConstants.Assign(Value); +end; + +procedure TPHPEngine.ShutdownEngine; +begin + + if PHPEngine <> Self then + raise EDelphiErrorEx.Create('Only active engine can be stopped'); + + + if not FEngineActive then + Exit; + + try + + if @delphi_sapi_module.shutdown <> nil then + delphi_sapi_module.shutdown(@delphi_sapi_module); + sapi_shutdown; + {Shutdown PHP thread safe resource manager} + if Assigned(FOnEngineShutdown) then + FOnEngineShutdown(Self); + + try + tsrm_shutdown(); + except + + end; + FHash.Clear; + finally + FEngineActive := false; + FWaitForShutdown := False; + end; +end; + +procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); +var + cnt : integer; + skip : boolean; + FN : AnsiString; +begin + skip := false; + ALib.Refresh; + + {No functions defined, skip this library} + if ALib.Functions.Count = 0 then + Exit; + + for cnt := 0 to ALib.Functions.Count - 1 do + begin + FN := AnsiLowerCase(ALib.Functions[cnt].FunctionName); + if FHash.IndexOf(FN) > -1 then + begin + skip := true; + break; + end; + end; + + if not skip then + begin + for cnt := 0 to ALib.Functions.Count - 1 do + begin + FN := AnsiLowercase(ALib.Functions[cnt].FunctionName); + FHash.AddObject(FN, ALib.Functions[cnt]); + end; + ALib.Locked := true; + end; +end; + +procedure TPHPEngine.RefreshLibrary; +var + cnt, offset : integer; + HashName : AnsiString; +begin + SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 2); + + PHP_FUNCTION(FLibraryEntryTable[0], 'InputBox', @delphi_input_box); + + + for cnt := 0 to FHash.Count - 1 do + begin + HashName := FHash[cnt]; + + {$IFNDEF COMPILER_VC9} + FLibraryEntryTable[cnt+1].fname := strdup(PAnsiChar(HashName)); + {$ELSE} + FLibraryEntryTable[cnt+1].fname := DupStr(PAnsiChar(HashName)); + {$ENDIF} + + FLibraryEntryTable[cnt+1].handler := @DispatchRequest; + {$IFDEF PHP4} + FLibraryEntryTable[cnt+1].func_arg_types := nil; + {$ENDIF} + end; + + offset := FHash.Count + 1; + for cnt := 0 to MyFuncs.Count - 1 do + begin + HashName := MyFuncs[cnt]; + {$IFNDEF COMPILER_VC9} + FLibraryEntryTable[cnt+offset].fname := strdup(PAnsiChar(HashName)); + {$ELSE} + FLibraryEntryTable[cnt+offset].fname := DupStr(PAnsiChar(HashName)); + {$ENDIF} + + FLibraryEntryTable[cnt+offset].handler := MyFuncs.Objects[ cnt ]; + {$IFDEF PHP4} + FLibraryEntryTable[cnt+offset].func_arg_types := nil; + {$ENDIF} + end; + + + FLibraryEntryTable[FHash.Count+MyFuncs.Count+1].fname := nil; + FLibraryEntryTable[FHash.Count+MyFuncs.Count+1].handler := nil; + {$IFDEF PHP4} + FLibraryEntryTable[FHash.Count+MyFuncs.Count+1].func_arg_types := nil; + {$ENDIF} + + FLibraryModule.functions := @FLibraryEntryTable[0]; +end; + +procedure TPHPEngine.StartupEngine; +var + i : integer; +begin + if PHPEngine <> Self then + begin + raise EDelphiErrorEx.Create('Only one PHP engine can be activated'); + end; + + if FEngineActive then + raise EDelphiErrorEx.Create('PHP engine already active'); + + StartupPHP; + PrepareEngine; +// ini := GetExecutorGlobals.ini_directives; + + + + if not PHPLoaded then //Peter Enz + begin + raise EDelphiErrorEx.Create('PHP engine is not loaded'); + end; + + try + FHash.Clear; + + for i := 0 to Librarian.Count -1 do + begin + RegisterLibrary(Librarian.GetLibrary(I)); + end; + + + //Start PHP thread safe resource manager + tsrm_startup(128, 1, 0 , nil); + + sapi_startup(@delphi_sapi_module); + + RefreshLibrary; + + + php_module_startup(@delphi_sapi_module, @FLibraryModule, 1); + + + TSRMLS_D := ts_resource_ex(0, nil); + + PrepareIniEntry; + RegisterConstants; + + if Assigned(FOnEngineStartup) then + FOnEngineStartup(Self); + + FEngineActive := true; + except + FEngineActive := false; + end; +end; + +procedure TPHPEngine.StartupPHP; +var + DLLName : string; +begin + if not PHPLoaded then + begin + if FDLLFolder <> '' then + DLLName := IncludeTrailingBackSlash(FDLLFolder) + PHPWin + else + DLLName := PHPWin; + LoadPHP(DLLName); + if FReportDLLError then + begin + if PHPLib = 0 then raise Exception.CreateFmt('%s not found', [DllName]); + end; + end; +end; + +procedure TPHPEngine.LockEngine; +begin + EnterCriticalSection(FLock); +end; + +procedure TPHPEngine.UnlockEngine; +begin + LeaveCriticalSection(FLock); +end; + +procedure TPHPEngine.HandleError(Sender: TObject; AText: string; + AType: Integer; AFileName: string; ALineNo: integer); +begin + LockEngine; + try + if Assigned(FOnScriptError) then + + + FOnScriptError(Sender, AText, AType, AFileName, ALineNo); + //ShowMessage( AText + #10#13 + AType.ToString + #10#13 + AFileName + #10#13 + ALineNo.ToString ); + // FOnScriptError(Sender, AText, AType, AFileName, ALineNo); + finally + UnlockEngine; + end; +end; + +procedure TPHPEngine.HandleLogMessage(Sender: TObject; AText: string); +begin + LockEngine; + try + if Assigned(FOnLogMessage) then + FOnLogMessage(Sender, AText); + finally + UnlockEngine; + end; +end; + +procedure TPHPEngine.PrepareForShutdown; +begin + LockEngine; + try + FWaitForShutdown := true; + finally + UnlockEngine; + end; +end; + +procedure TPHPEngine.ShutdownAndWaitFor; +var + cnt : integer; + AllClear : boolean; +begin + PrepareForShutdown; + + AllClear := false; + while not AllClear do + begin + cnt := FRequestCount; + if cnt <= 0 then + AllClear := true + else + Sleep(250); + end; + ShutdownEngine; +end; + +function TPHPEngine.GetEngineActive: boolean; +begin + Result := FEngineActive; +end; + +procedure TPHPEngine.UnlockLibraries; +var + cnt : integer; +begin + if Assigned(Librarian) then + begin + for cnt := 0 to Librarian.Count - 1 do + Librarian.GetLibrary(cnt).Locked := false; + end; +end; + +procedure TPHPEngine.RemoveRequest; +begin + InterlockedDecrement(FRequestCount); +end; + +procedure TPHPEngine.AddFunction(FN: AnsiString; Func: Pointer); +begin + if MyFuncs.IndexOf(FN) = -1 then + MyFuncs.AddObject(FN, TObject(Func)); +end; + +procedure TPHPEngine.AddRequest; +begin + InterlockedIncrement(FRequestCount); +end; + +{ TPHPMemoryStream } + +constructor TPHPMemoryStream.Create; +begin + inherited; +end; + +procedure TPHPMemoryStream.SetInitialSize(ASize: integer); +begin + Capacity := ASize; +end; + +end. + + diff --git a/phpAbout.dfm b/phpAbout.dfm index 8b6c8c2..e936de1 100644 --- a/phpAbout.dfm +++ b/phpAbout.dfm @@ -1,1233 +1,1233 @@ -object dlgAbout: TdlgAbout - Left = 264 - Top = 289 - BorderStyle = bsDialog - Caption = 'About PHP4Delphi' - ClientHeight = 186 - ClientWidth = 490 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True - Position = poScreenCenter - Scaled = False - OnCreate = FormCreate - PixelsPerInch = 96 - TextHeight = 13 - object pnlLeft: TPanel - Left = 0 - Top = 0 - Width = 213 - Height = 186 - Align = alLeft - BevelOuter = bvNone - TabOrder = 0 - object pnlImage: TPanel - Left = 6 - Top = 8 - Width = 200 - Height = 168 - BevelOuter = bvLowered - Caption = 'pnlImage' - TabOrder = 0 - object imgAbout: TImage - Left = 1 - Top = 1 - Width = 198 - Height = 166 - Align = alClient - Center = True - Picture.Data = { - 07544269746D6170E6850000424DE6850000000000003604000028000000C700 - 0000A60000000100080000000000B08100000000000000000000000100000001 - 0000392110003929100039291800422910003D3118004A2910004A3110004A31 - 18003D2D210052311800523918005A391800423525004E3921004A392D004532 - 3F005E3D1C0065421B006B4221006B4A2100524231005A4A2D006B4A29006B52 - 2900414D37005B4A41005C583D005D6743006B5033006B57400067584E006B6B - 4A00734A2100735221007B522100734A2900735229007B5229007B5A2900845A - 29007B523100735A31007B5A3100845A31008C633100845A3900846339008C63 - 39007756480088634200846B4A008C6B39008C6B42008C6B4A00946B3900946B - 4200946B4A008C734A009473420094734A009C7342009C734A00A5734A00A57B - 4A001665650049516E00615965005F5B910086695C00786E6F006F6F94007373 - 9C005149B5006B6BA9006B6BB5007373A5004541D2004944E0006767BD006767 - D1004A4AE7003939EF004239EF00423DF3004242F7004239FF004242FF004A42 - FF004A4AEF004A4AF7004A4AFF00524AEF005252E7005555F2006565ED006868 - FC00217F7F0035877B00557F6300598E7C008C7B6300887B6F007B7B7F008383 - 8800947352009C7352009C7B5200A77E52009C7C5A00AD845600A38361009F8A - 760017C5BB0012DAD2000FEAE60004F7F30000FFF70000FFFF0008FBFB0014FF - FF00689695006898BE00998C94009C9BCE0030CFC9002DF4F3004ADAD80074CF - CE00B5845A00B58C5A00B58C6300BD8C6300BD946300B58C6B00B5946B00BD94 - 6B00C6946B00C69C6B00CE9C6B00AD8C7300AD947300B5947300BD947300BD9C - 7300AF967E00C19C7700C69C7B00C6A57B00AD9C8400B19C8800BAA28600C6A5 - 8400CE9C7300CEA57300CEA57B00CEA58400CEAD8400D6A57B00D6AD7B00D6AD - 8400B7A79100C3AA8E00BDAB9A00B8ADA600ADADAD00ADADB500BFB5AE00C6BD - B500CEAD8C00D2B19000D2B59800D4BAA200D2BDAD00DAC6A900CEBDB500D6C6 - B100ADA5BD00ADADC100ADADCE00BBB7BF00BDBDBD00C6BDC600C6C6C600CEC6 - BD00D6C6B500D6CABD00CECAC600D6CEC600E1CBB500E1CEC000DED6C600EBD8 - C300B5B5CE00BDBDCE00C6BDCE00C6C6CE00ADCECE00CECECE00D6CECE00C6D6 - CE00BDBDD600BDCED600CECED600D6D6CE00C6D6D600C6C6DE00CECEDE00BDBD - FF00DED6CE00D6D6D600DED6D600DEDED600ADDEDE00C6DEDE00CEDEDE00D6DE - DE00B5E7E700D2DEE700ADF7F700C9F5F500D6FFFF00DEDEDE00DEDEEF00DEEF - EF00E7D6CE00E7DECE00EFDECE00EBDED600EFE7D600E7DEDE00E7E7DE00EFE7 - DE00F7E7DE00E7E7E700EFE7E700EFEFE700F7EFE700E7EFEF00EFEFEF00F7EF - EF00F7F7EF00FFF7EF00DEDEF700DEF7F700F7F7F700FFF7F700FFFFF700DEDE - FF00E7E7FF00EFEFFF00F7F7FF00DEFFFF00E7FFFF00EFFFFF00F7FFFF00FFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFF4C57A676666677AC5F4FFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFF4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFF4C57A676666677AC5F4FFF4 - F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EEEEEEEEEEEEEEEEEEEEEEF4F4 - FFFFFFFFFFFFFFF4F4EEE9DDDDDDDDE9E9EEF4FFFFFFF4EEDE7B7B7B7B7B4F47 - 6666677AB6E9E9DDDDDDE9EEF4FFF4F4EEEEEEEEEEF4FFFFF4EEEEEEEEEEF4F4 - F4EEEEEEEEEEF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E9BAB4B4B4B4 - B4B4B4B4B4B6C5DDE9F4FFFFFFFFF4E9C5B4A4A4A4A4A4A4A5B6D1EEF4EED1B6 - 7B565656565656496666667AA4B3A4A4A4A4A5B6DDEEE9C5B4B4B4B4BAE9F4F4 - D1B6B4B4B4B6C5DDC5B4B4B4B4B6E9F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFF4C5A47A7A7A7A7A7A7A7A7A7A7AA4B4D1EEF4FFF4D1B37A7A676767676767 - 677AA4B6E9E9B37A4B5656565656564966666667676767676767677AB3D1C5A4 - 7A7A7A7AA4C5EEEEB47A7A7A7A7AA4B4A47A7A7A7A7AC5F4FFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFF4B67A6766666666666666666767677AA4C5EEF4DDA57A - 67666666676767666667677AB6D1A46747565656565656496666666667676766 - 666666677AB4B67A676666677AB6EEE9B36766666667A4B37A676666677AB6EE - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B67A676666666666676766666666 - 6767A4D1E9B67A67666666677A7A7A6766666667A4B6A4674756565656565649 - 666666677A7A7A676666666667A4B47A676666677AB6EEE9A56766666667A4B3 - 7A676666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B67A67666666 - 66677A7A6767666666677AB3D1A567666666677AB4C5A467666666677AB4A467 - 475656565656564966666667A4C5B67A6766666667A4B37A676666677AB6EEE9 - A56766666667A4B37A676666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CFCF - CF7B7B4E4E4E4E4E4A4BB3B4A46766666666677B5E5E585454595C5E7BDEB67A - 67494E4E4F4F4F4A475656565656564A4E5C5956595F7BA467664E4E4E4F4F4F - 476666494E7B7B7B4F4A664E4E4E4F4F4F476666667AB6EEFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFCF5656565656565656565656565A5FB17A666666674F5656565656 - 56565656565A7B7A675C56565656565C4756565656565656565656565656565E - 67475656565656564966665C56565656565046565656565656496666667AB6EE - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFCF5656565656565656565656565656594B6766 - 675C565656565656565656565656564A675C56565656565C4756565656565656 - 56565656565656564E475656565656564966665C565656565650465656565656 - 56496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656565656 - 56565656565847664A56565656565656565656565656565C675C56565656565C - 475656565656565656565656565656565C475656565656564966665C56565656 - 565046565656565656496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 - 56565656565656565656565656564F664F56565656565847674F565656565654 - 475C56565656565C475656565656564E67475856565656565047565656565656 - 4966665C56565656565046565656565656496666667AB6EEFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF0068686868686868686868686868686868686868686868 - 6868686868686868686868686868686868686868686868686868A2FFFFFFFFFF - FFFFFFFFFFCF5656565656565647475C56565656565658675056565656565C66 - 66495656565656564B5C56565656565C475656565656564966665C5656565656 - 50475656565656564966665C56565656565046565656565656496666667AB6EE - FFFFFFA268686868686868686868686868686868686868686868686868686868 - 686868686868686868686868686868686800BEBEBEBEBEBEBEBEBEBEBEBEBEBE - BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE - BEBEE6FFFFFFFFFFFFFFFFFFFFCF565656565656564666495656565656565647 - 5056565656565C6666495656565656567B5E56565656565C4756565656565649 - 66665C565656565650475656565656564966665C565656565650465656565656 - 56496666667AB6EEFFFFFFE6BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE - BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656466649 - 56565656565656465056565656565C6666495656565656564B5C56565656565C - 475656565656564966665C565656565650475656565656564966665C56565656 - 565046565656565656496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 - 565656565646664956565656565656465056565656565C666649565656565656 - 4B5C56565656565C475656565656564966665C56565656565047565656565656 - 4966665C56565656565046565656565656496666667AB6EEFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFCF5656565656565646664956565656565656465056565656565C66 - 6649565656565656475C56565656565C475656565656564966665C5656565656 - 50475656565656564966665C56565656565046565656565656496666667AB6EE - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564666495656565656565646 - 5056565656565C666649565656565656475C56565656565C4756565656565649 - 66665C565656565650475656565656564966665C565656565650465656565656 - 56496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656466649 - 56565656565656465056565656565C66666667A4C3CAB17A675C56565656565C - 475656565656564966665C565656565650475656565656564966665C56565656 - 565046565656565656496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 - 565656565646664956565656565656465056565656565654545454545A5A5954 - 475C56565656565C475656565656564966665C56565656565047565656565656 - 4966665C56565656565046565656565656496666667AB6EEFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFCF5656565656565646664956565656565656465056565656565656 - 5656565656565656475C56565656565C475656565656564966665C5656565656 - 50475656565656564966665C56565656565046565656565656496666667AB6EE - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564666495656565656565646 - 50565656565656565656565656565656475C56565656565C4756565656565649 - 66665C565656565650475656565656564966665C565656565650465656565656 - 56496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656466649 - 565656565656564650565656565656565656565656565656475C56565656565C - 475656565656564966665C565656565650475656565656564966665C56565656 - 565046565656565656496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 - 565656565646664956565656565656465056565656565C666649565656565656 - 475C56565656565C475656565656564966665C56565656565047565656565656 - 4966665C56565656565046565656565656496666667AB6EEFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFCF5656565656565646664956565656565656465056565656565C66 - 6649565656565656475C56565656565C475656565656564966665C5656565656 - 50475656565656564966665C56565656565046565656565656496666667AB6EE - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4F4F4F4 - F4FFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564345435656565656565643 - 4D56565656564C454543565656565656434D56565656565C4756565656565649 - 66454C56565656564D435656565656564366665C565656565650435656565656 - 564345454566A4C5D1D1D1D1D1D1D1DDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 - DDD1D1D1D1D1D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656434543 - 56565656565656414C56565656564D1E1941565656565656434D56565656565C - 475656565656564366454C56565656564C41565656565656431E1E4C56565656 - 564D41565656565656431919191E659495959595A3D1D1D1F4FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFE7BCACABA196969696C5D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFCF5656 - 565656565643454356565656565656414C56565656565C1E070F565656565656 - 434D56565656565C475656565656564166454C56565656564C0F565656565656 - 430E004856565656564C0F56565656565641000000030B13202020206CD1D1C5 - EEF4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4FF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFA16D6B6B6B6B6B6B6EC5D1D1EEFFFFFFFFFFFFFF - FFFFFFFFFFCF5656565656565643454356565656565656424C56565656565E65 - 0D0F565656565656464D56565656565C475656565656564166454D5656565656 - 4C0F565656565656430E004856565656564D0F56565656565641010101030B13 - 202020206CD1B6B3B6C5C5C5D1D1D1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD1D1 - D1C5C5C5BAC5E9F4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4826D6D6B6D6B6B6B82C5D1D1 - EEFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564345435656565656565641 - 4C56565656565EA01C415656565656564B5C56565656565C4756565656565641 - 7A7A5C56565656564C0F565656565656430E004856565656564D0F5656565656 - 5641030303071013202020206FC5B47A7A7A7A7A7A7AA4A4A4A4A4A4A4A4A4A4 - A4A4A4A4A4A4A47A7A7A7A7A7AA4C5F4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE06D6D6D6D - 6B6B6B6B8BC6D1D1F4FFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656434543 - 56565656565656424856565656565DB03143565656565656B25E56565656565C - 4756565656565649B6B25D56565656564C195656565656564E0E084C56565656 - 56501E565656565656430A0A0A0B1113202020208BC5B37A7A7A7A6767676767 - 6767676767676767676767676767676767677A7A7A7AB6EEFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFAA6D6D6D6D6D6B6B6B8DCBD1D1F4FFFFFFFFFFFFFFFFFFFFFFFFCF5656 - 565656565643454356565656565656434156565656565659585456565656565D - CD5E56565656565C4756565656565654595A565656565656481E565656565656 - 5452525656565656565C45565656565656430707070710132020202094D1B6A4 - B4A5A5A4A4A4A4A47A6767666666666666666666677A7AA4A4A4A5B3B3B6DDF4 - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFF8F6D6D6D6D6D6D6B6B96D1D1D1F4FFFFFFFFFFFFFF - FFFFFFFFFFCF565656565656564345435656565656565643144C565656565656 - 565656565656567BD15E56565656565C47565656565656565656565656565654 - 421E5656565656565656565656565656565E4556565656565641010101030B13 - 20202020A0D1C5D1EEE9E9E9E9DDDDD1B6A4676666666666666666677AB4C5DD - E9E9E9E9EEEEF4FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA826D6D6D6D6D6D6D6BA0D1D1DD - FFFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564345435656565656565643 - 0E0F5C56565656565656565656537BCAD15E56565656565C4756565656565356 - 5656565656565343231E56565656565656565656565656565DC8655656565656 - 5643010000030B13201318187AC4C4D5DFF3F3FDFDFDF4F4EEC57A6766666767 - 6767677AA5C4C4C4A5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9806D6D6D6D - 6D6D6B6BA2D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656434543 - 565656565656564615167A7B5F5D5A565654504C4330A6D1D15E56565656565C - 4B565656564D1E435C56565A5E7B4523201E5656565656564E484C5356565D7B - CDD16756565656565643010101030B1320164040404040404040404040406040 - 4040404040404040404040404040404040A5FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFA16D6D6D6D6D6D6D6D6BA6D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 - 565656565647674E565656565656547A322AA0D1CACACDCD65302D2D2B2BA6D1 - D15E56565656565C7A7A7AB0C0B32424A3CECDCDCAD16C20201E565656565656 - 49190C0C45B0C3D1D1D16F30B3CDC8B17A660706070710132017606060606060 - 60606060606060606060606060606060606060606060606040A4FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFF4866D6D6D6D6D6D6D6D6DA7D1D1E9FFFFFFFFFFFFFFFF - FFFFFFFFFFCF565656565656564F4F595656565656565DC16E2F95D1D1D1D1D1 - 6F2B2B2B2B2BA6D1D15E56565656565ED1D1D1D1E9BB252595DDD1D1D1D16F20 - 201E5656565656567B32101064B6D1D1D1D17A4D59595959594B161010111220 - 201762637979797F79797C70707070707070707070707070707078797F7F7F7F - 79D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE382816D6D6D6D6D6D6D6DB7D1D1E9 - FFFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656565656565656565656567BC5 - 6F2F8BCBD1D1D1CB6F2E2B2B2B2BA6D1D15E56565656565FF4F4F4F4F4D02525 - 6ED2D1D1D1CB6F20201E5656565656567B68131368BAD1D1D1CB7A5656565656 - 567B2A131313202020202039D1D1D1F4FDFDFCDB7F7C7C7C7C7C7C7C7C7C7C7C - 786767B3E9FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF81816D6D6D6D - 6D6D6D6DBAD1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656565656 - 56565656565ECDCB8B2F6CBAD1D1D1CB6F2E2E2B2B2BA6D1D15E56565656565F - FFFFFFFFFFD025253BC6D1D1D1D16F20201E565656565656B26420202EB7D1D1 - D1D17A5656565656567B2A20202020202020206FD1D1DDFFFFFFFFFFF37E7C7C - 7C7C7C7C7C7C7E7866667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFA18181816D6D6D6D6D6D80BBD1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 - 5656565656565656565656565FCDD1D16E2F3BB7D1D1D1D16E2E2E2E2B2BA7D1 - D15E56565656565FFFFFFFFFFFD025252DA7D1D1D1D16E20201E565656565656 - B264202025A6D1D1D1D17A5656565656567B25202020202020202095D1D1E9FF - FFFFFFFFFE7E7E7E7E7E7E7E7E7E7E6766667AB4EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFF487818180806D6D6D6D6D82C6D1D1EEFFFFFFFFFFFFFFFF - FFFFFFFFFFCF56565656565656565656544D48B0CAD1D1CB6E2F33A6D1D1D1CB - 6E2E2E2B2B2BA7D1D15E56565656565FFFFFFFFFFFD0252525A0D1D1D1D16E20 - 201E565656565656B26420202094D1D1D1D17A5656565656567B282020202020 - 202024A3D1D1E9FFFFFFFFFFFFDA7D7D7D7D7D7D7D7D7E6666667AB4EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE78281818181816D6D6D6D86C6D1D1F0 - FFFFFFFFFFFFFFFFFFFFFFFFFFFAF8F8B5444465C1CDCDCDA4353795D1D1D1C5 - 6E2F2F90D1D1D1C56C2F2E2E2B2EA7D1D1CEF8F8F8F8F8F9FFFFFFFFFFD02525 - 256FCBD1D1C66C2420231D1D1D44CDCDCA642020206CCBD1D1C6641C30A4CDCD - CDA3242020202020202028A7D1D1EEFFFFFFFFFFFFDA7D7D7D7D7D7D7D7D7E66 - 66667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC82818181816D6D - 6D6D6D8DCBD1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE3D3D3DA3D1D1D1 - 9637376EBAD1D1BA692F2F6CBAD1D1BA3B2F2F2E2E2BA7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFD025252531B7D1D1C53524202020202031D1D1D1642020202AA7D1 - D1C53520206FD1D1D1A220202020202020202DC6D1D1F4FFFFFFFFFFFFDA7777 - 7777777777777E6666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - A88282818181816D6D6D6D91CBD1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - E36A3D3C8BC6D1D18B373737A6D1D1A7372F2F34A3D1D1A7342F2E2E2E2EA7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFD02525252595D1D1A72A24242420202031D1D1 - D1682020202094D1D1B72A20202DB7D1D16F202020202020202068D1D1D1FFFF - FFFFFFFFFFDB76767676767676767C6666667AB6EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFF8F828282818181816D6D6D96D1D1D1F4FFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFE76B3D3D3DA2D1A76A3737376EB7CB9037332F2F6CB7CB90 - 2F2F2F2E2E2EA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02525252531A7CB902524 - 242020202031D1D1D168202020202DA6CB90202020206FC6B731202020202020 - 202090D1D1DDFFFFFFFFFFFFFFDC75757575757575757C6666667AB6EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8782828281818181816D6DA1D1D1D2F4 - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF6E3D3D3D3D8B6E37373737376A8B37 - 3733332F2F3D6E342F2F2F2F2E2EA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02525 - 2525252E6C2A2424242420202031D1D1D16820202020202D6825202020202335 - 31131313131313202020A0D1D1E9F4F4F4F4F4F4F4DC75757575757575757C66 - 66667AB4EEF4F4F4F4F4F4F4F4F4FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE08282828282818181 - 816D6DA2D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46E3D3D3D3C3C3C - 3A3737373737373737332F2F2F2F2F2F2F2F2F2F2F2EA7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFD025252525252525252424242424202031D1D1D16C202020202020 - 202020202020201210101010101010111116A0B4B4D1E9E9E9E9E9E9E9D57575 - 7575757575757C66666667A5D1DDDDDDDDDDD1C5C5DDEEFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD - 8282828282818181818181A6D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF863D3D3D3D3C3C3C3A37373737373737373333332F2F2F2F2F2F2F2F2FA7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFD025252525252525252525242424242031D1D1 - D16820202020202020202020202013110703030307070707070D677A7AA4A4A4 - A4A4A4A4A4A475757575757575757C666666677AA4A4A4A4A4A4A47A7AA5E9FF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFA8828282828282818181816DACD1D1DDFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF973D3D3D3D3C3C3C3C373737373737373737332F2F2F2F - 2F2F2F2F2F2EA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD025252525252525252525 - 242424242031D1D1D16C20202020202020202020202013100301010101010101 - 010E45454567676767676767676775757575757575757C666666666767676767 - 6767676767A4DDF4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8282828282828281818181A7D1D1E9FF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA3D3D3D3D3D3C3C3C3A3A37373737 - 37373733332F2F2F2F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02525 - 2525252525252525242424242432D1D1D16C202020202020202020202020130B - 0301000000000000001445454566666666666666666775757575757575757C66 - 66666666666666666666666667A4DDF4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7878382828282828282 - 818181B7D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB83D3D3D3D3D3D - 3C3C3A37373737373737373733332F2F2F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFD025252525252525252525242424242432D1D1D16C202020202020 - 2020202020201310070100000000000000194545456666666666666666677575 - 7575757575757C6666666666666666666666666667A4DDF4FFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF84 - 8483828282828282818181BAD1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFBE6A3D3D3D3D3D3D3C3C3A3A373737373737373333332F2F2F2F2F2F2FA7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFD026252525252525252525252424242432D1D1 - D16C2020202020202020201F1F1F1F1B150C040202020101011E454566676767 - 67676767676775757575757575757C6666666767676778786667676667A4DDF4 - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFAD848484828282828282828182C5D1D1E9FFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFE36B3D3D3D3D3D3C3C3C3C3A3737373737373737373333 - 2F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD026252525252525252525 - 252525242435D1D1D16C202020202020202029797F7F7E7E7E7E717171717171 - 717272727272727272727272727275757575757575757372727D7E7E7E7C7C61 - 607A7A7A7AA4DDF4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFA8848483838382828282828182C6D1D1E9FF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB6E3F3D3D3D3D3D3D3D3C3C3A3737 - 37373737373733332F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02A26 - 2525252525252525252525242435D1D1D16C20202020202020201F797F7F7E7E - 7D7D7D7775757575757575757575757575757575757575757575757575757575 - 77777D7D7E7C7C6160B6B6B4B4C5EEFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91848484848382828282 - 828286C5D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4823F3D3D3D3D - 3D3D3C3C3C3A3A3737373737373737332F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFD02A262525252525252525252525252435D1D1D16C202020202020 - 202062797F7F7E7E7D7D7D777575757575757575757575757575757575757575 - 757575757575757577777D7D7E7C7C6160EEEEEEEEEEF4FFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8784 - 8484848382828282828287C6D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFF8F3F3F3D3D3D3D3D3D3C3C3C3A3A3737373737373434332F2F2F2F2FA7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFD02A2A2A26252525252525252525252435D1D1 - D16C20202020202020201D797F7F7E7E7D7D7D77757575757575757575757575 - 7575757575757575757575757575757577777D7D7E7C7C6160FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFE18784848484848382828282828EC6D1D1EEFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFA13F3F3D3D3D3D3D3D3D3C3C3A3A3737373737373734 - 33332F2F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2A2A2A262525252525 - 252525252535D1D1D16C202020202020202020637F7F7E7E7D7D7D7775757575 - 75757575757575757575757575757575757575757575757577777D7D7E7C7C61 - 60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFBD8484848484848483828282828EC6D1D1EEFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF3F3F3F3D3D3D3D3D3D3D3C3C3A - 3A373737373737373333332F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2A - 2A26262625252525252525252535D1D1D16C24202020202020202029797F7E7E - 7D7D7D7775757575757575757575757575757575757575757575757575757575 - 77777D7D7E7C7C6160FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB84848484848484848382 - 82828FC6D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE6B3F3F3F3D - 3D3D3D3D3C3C3C3A3A373737373737373333332F2F2FA7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFD02B2B2A2A262525252525252525252535D1D1D16C242020202020 - 20202020627F7E7E7E621F1B1A18181863C4D4D8DCDCDCDCDCDCDCDCDCDB7575 - 7575757575757C78787879C4D8DAD47F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA98784 - 848484848484838282828EC6D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFE46D3F3F3F3F3D3D3D3D3D3D3D3C3A3A37373737373737333333332FA7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B2A2A2A2625252525252525252535D1D1 - D16C2420202020202020202024797E7E7D7820131107030142A4B6DDFFFFFFFF - FFFFFFFFFFFC75757575757575757C6666667AB6EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFF938787848484848484838282828EC6D1D1E9FFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFEB6E3F3F3F3F3D3D3D3D3D3D3C3C3A373A3737373737 - 373733332F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B2B2A2A2A25252525 - 252525252535D1D1D16C24202020202020202020201F7E7E7D7D1F20130B0701 - 1E7AB3DDFFFFFFFFFFFFFFFFFFFC75757575757575757C6666667AB6EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFF08F87878484848484848483828286C5D1D1E9FF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6863F3F3F3F3D3D3D3D3D3D3D3C - 3C3C3A373737373737373333332FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B - 2B2B2A2A2A262525252525252535D1D1D16C242424242020202020202024787E - 7D7D7C20201109041E667AC5F4FFFFFFFFFFFFFFFFFC77757575757575757C66 - 66667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA8987878784848484848484 - 838282BBD1D1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF963F3F3F3F - 3F3D3D3D3D3D3D3D3C3C3A3737373737373737333333A7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFD02B2B2B2B2B2A26252525252525252535D1D1D16C242424202020 - 2020202020201F7E7D7D7D6220131007424567A4DDF4FFFFFFFFFFFFFFFC7775 - 7575757575757C6666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1898787 - 8784848484848484848382AED1D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFAC3F3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A37373737373737373333A7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B2B2B2B2B2A262525252525252535D1D1 - D16C24242424202020202020202020637D7D7D7C1720120B1E45457AB4D3EEFF - FFFFFFFFFFFC77757575757575757C6666667AB6EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFBD8887878787848484848484848382A1D1D1D1D1EEF4FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFBD6B3F3F3F3F3F3D3D3D3D3D3D3C3C3C3A3A373737 - 373737373333A7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B2B2B2B2A2B2A2625 - 252525252535D1D1D16C24242424202020202020202020297E7D7D7763201311 - 09144266A4B6D1E9F4FFFFFFFFFC77757575757575757C6666667AB6EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFAD888787878787848484848484838287AED1D1D1 - D1D1DDE9EEF4FFFFFFFFFFFFFFFFFFFFFFFFFFE36D6B3F3F3F3F3D3D3D3D3D3D - 3D3C3C3C3A3A3737373737373733A7D1D1DDEEEEEEEEEEEEEEEEEEEEEEBB2B2B - 2B2B2B2B2A2A2A26252525252535D1D1D16C2524242424202020202020202020 - 627D7D77721D20131007041E67B3C5D1DDEEFFFFFFFD77757575757575757C66 - 66667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA8988878787878484848484 - 848483828796A2B7C6D1D1D1D1D1DDEBF4FFFFFFFFFFFFFFFFFFFFEB826B3F3F - 3F6A3F3D3D3D3D3D3D3D3C3C3A3A3737373737373737A7D1D1D1D1D1D1D1D1D1 - D1D1D1D1D1A72B2B2B2B2B2B2B2A2A26252525252535D1D1D16C252524242420 - 2020202020202020247C7D7775612020110A0301147AB6D1D1D1E9FFFFFD7775 - 7575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B888888 - 878787878484848484848483828282828E97ABB9D1D1D1D1D1DDE9F4FFFFFFFF - FFFFFFF68D6B6B3F3F3F3F3F3F3D3D3D3D3D3D3C3C3A37373737373737376A6C - 6C6C6C6C6C6C6C6C6C6C6C68683B2B2B2B2B2B2B2B2B2A26252525252535D1D1 - D16C2525242424242020202020202020201F7D7775731B2013100701010D6FBA - D1D1D1E9FFFD77757575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFF9289898888878787878484848484848382828282828282868FA2B7CB - D1D1D1D1DDE9F4FFFFFFFFFFA16B6B3F3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A3A - 373737373737373434332F2F2F2F2F2F2F2F2F2E2E2B2B2B2B2B2B2B2B2B2B2A - 2A2525252535D1D1D16C25252524242420202020202020202020637775757017 - 20120B0301030A64BAD1D1D1E9FD77757575757575757C6666667AB4EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFEF9889898888888787878784848484848484838282 - 828282828181828FA2B7C6D1D1D1D1DDEEF4FFFFAC6B6B6B3F3F3F3F3F3D3D3D - 3D3D3D3D3D3C3A3A37373737373737373433332F2F2F2F2F2F2F2F2F2E2E2B2E - 2B2B2B2B2B2B2B2B2A2A26252535D1D1D16C2525252424242424202020202020 - 2020297C75757363201311090301030B64BAD1D1D1D977757575757575757C66 - 66667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7898989898887878787878484 - 848484848483828282828282828181816D828FA2BAD1D1D1D1D1E9F4BE6B6B6B - 3F3F3F3F3F3D3D3D3D3D3D3D3C3C3C3A3A3737373737373433332F2F2F2F2F2F - 2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B2B2A26252535D1D1D16C252525252424 - 242420202020202020202062767575711D20131007010107106CC6D1D1CC7775 - 7575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE189898989 - 898887878787878484848484848483828282828282828181816D6D6D8296A7C6 - D1D1D1D1BB6D6B6B6B3F3F3F3F3F3F3D3D3D3D3D3D3C3C3C3A3A373737373737 - 3733332F2F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B2B2B2A2A2A262535D1D1 - D16C25252525252424242424202020202020201770757575612020120A030103 - 0A126FD1D1CC7D757575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFBF89898989898888878787878784848484848484838282828282828181 - 81816D6D6D6D8086A2BBD1D1BB826B6B6B6B3F3F3F3F3F3D3D3D3D3D3D3D3C3C - 3A3A373737373737373733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B - 2B2A2A262535D1D1D16C2525252525252424242020202020202020201B727575 - 731B201311070101030B16A0D1CC7D757575757575757C6666667AB4EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFBD8989898989888888878787878484848484848483 - 82828282828282818181816D6D6D6D6D6D85A2B7D1866B6B6B6B6B3F3F3F3F3F - 3D3D3D3D3D3D3D3C3C3A37373737373737373733332F2F2F2F2F2F2F2F2F2E2E - 2E2E2B2B2B2B2B2B2B2B2A262635D1D1D16C2525252525252424242420202020 - 202020202061757575701720120B030103071128A6CC7D757575757575757C66 - 66667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC898989898989888887878787 - 84848484848484838282828282828282818180806D6D6D6D6D6D6D82A2906B6B - 6B6B6B3F3F3F3F3F3F3D3D3D3D3D3D3C3C3A3A3737373737373737332F2F2F2F - 2F2F2F2F2F2F2F2E2E2B2B2B2B2B2B2B2B2B2B2A2635D1D1D16C252525252525 - 25242424242020202020202020177175757461202011090301030A1235C77D75 - 7575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD89898989 - 8989898888878787878784848484848383838282828282828181816D6D6D6D6D - 6D6D6D6D6D95966D6B6B6B6B3F3F3F3F3F3F3D3D3D3D3D3D3C3C3A3A37373737 - 373737373333332F2F2F2F2F2F2F2F2F2E2E2B2B2B2B2B2B2B2B2B2A2A35D1D1 - D16C252525252525252524242424202020202020202062737575721B20131007 - 01010710136F7D757575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFAA89898989898989898887878787878484848484848382828282828282 - 828181816D6D6D6D6D6D6D6D6B8DC6AE8C6B6B6B3F3F3F3F3F3F3D3D3D3D3D3D - 3C3C3A3A3A3737373737373733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B - 2B2B2B2A2A39D1D1D16C25252525252525252424242420202020202020202361 - 757575702020120B0301030911297D757575757575757C66666667B4EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFA98989898989898988888887878787878484848484 - 84848382828282828281818181816D6D6D6D6D6D6D82BBD1BBA16E6B6B3F3F3F - 3F3F3D3D3D3D3D3D3D3C3C3C3A3A3737373737373434332F2F2F2F2F2F2F2F2F - 2F2E2E2E2B2B2B2B2B2B2B2B2A39D1D1D16C2525252525252525252424242420 - 202020202020201D7175757362201311090301030B1671757575757575757C66 - 666667B4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C898989898989898988888887 - 878787848484848484848382828282828282818180806D6D6D6D6D6D6D6DB7D1 - D1D2BE856B3F3F3F3F3F3F3D3D3D3D3D3D3D3C3C3A3A37373737373737343333 - 2F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B39D1D1D16C252525252525 - 2525252424242420202020202020202062747575711C20131007010107157175 - 7575757575757C66666667B4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A89898989 - 898989898989888887878787848484848484848382828282828281818181816D - 6D6D6D6D6D6DACD1D1D1F4E78D6B6B3F3F3F3F3F3D3D3D3D3D3D3D3C3C3A3737 - 3737373737373333332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B39D1D1 - D16C252525252525252525252424242420202020202020201770757575612020 - 120A0301030D71757575757575757C66666667B4EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF59A89898989898989898989888888878787878484848484848382828282 - 828282818181806D6D6D6D6D6D6DA2D1D1D1EEFFEA916B3F3F3F3F3F3F3D3D3D - 3D3D3D3C3C3A3A373737373737343733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B - 2B2B2B2B2B39D1D1D16C25252525252525252525252424242420202020202020 - 201B727575721B2013110703010470757575757575757C66666667B4EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFF49A8989898989898989898989888887878784848484 - 8484848483828282828282818181816D6D6D6D6D6D6D96D1D1D1E9FFFFEB8F6B - 3F3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A37373737373737373333332F2F2F2F2F - 2F2F2F2F2E2E2E2B2B2B2B2B2B68D1D1D16C2525252525252525252525242424 - 2420202020202020202061757575701720131007010470757575757575757C66 - 666667B4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9A988989898989898989898988 - 8888878787878484848484848382828282828282828181816D6D6D6D6D6D86C5 - D1D1E9FFFFFFE7863F3F3F3F3F3F3D3D3D3D3D3D3C3C3C3A3737373737373737 - 33332F2F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B68D1D1D16E262525252525 - 2525252525242424242020202020202020201770757574612020120A03027075 - 7575757575757C66666667B4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC9A98898989 - 8989898989898989888887878787848484848484848382828282828282818181 - 816D6D6D6D6D82BAD1D1DDFFFFFFFFE3823F3F3F3F3F3D3D3D3D3D3D3D3C3C3C - 3A3A3737373737373733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B68D1D1 - D16E2A2625252525252525252525252424242420202020202020201B73757572 - 1B201311070470757575757575757C66666667B4EEFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFEB9998988989898989898989898989888887878787848484848484848382 - 828282828282818181816D6D6D6D6DAED1D1D1F4FFFFFFFFBC6B3F3F3F3F3F3D - 3D3D3D3D3D3D3C3C3A373A3737373737373333332F2F2F2F2F2F2F2F2F2E2E2E - 2E2B2B2B2B68D1D1D16E2A262525252525252525252525242424242020202020 - 202020206175757570162013100770757575757575757C66666667B4EEFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFEB999898988989898989898989898988888887878787 - 848484848484848382828282828281818181816D6D6D6DA6D1D1D1F4FFFFFFFF - F6AA6B3F3F3F3F3F3D3D3D3D3D3D3D3C3C3A37373737373737373333332F2F2F - 2F2F2F2F2F2F2E2E2E2E2B2B2B68D1D1D16E2A2A262525252525252525252525 - 2424242420202020202020201C71757573622020110A70757575757575757C66 - 666667B3E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE799989898898989898989898989 - 89898888878787878484848484848483828282828282828181816D6D6D6D6DA1 - D1D1D1EEFFFFFFFFFFEB863F3F3F3F3F3F3D3D3D3D3D3D3C3C3A3A3737373737 - 37373333332F2F2F2F2F2F2F2F2F2F2E2E2B2B2B2B68D1D1D16E2B2A26252525 - 25252525252525252424242420202020202020202062737575721D2013117075 - 7575757575757C66666667B3E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE79998989898 - 8989898989898989898989888887878787878484848484838382828282828281 - 8181816D6D6D6D8FCBD1D1E9FFFFFFFFFFFFBE6D3F3F3F3F3F3D3D3D3D3D3D3D - 3C3C3A3A37373737373737373333332F2F2F2F2F2F2F2F2F2E2E2B2B2B68D1D1 - D16E2B2A2A262525252525252525252525242424242020202020202020236175 - 75757020201370757575757575757C66666667B3E9FFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFE79998989898898989898989898989898988888787878784848484848484 - 8382828282828282818181816D6D6D86BBD1D1DDFFFFFFFFFFFFF6A13F3F3F3F - 3F3D3D3D3D3D3D3D3C3C3A3A3A3737373737373733332F2F2F2F2F2F2F2F2F2E - 2E2E2E2B2B68D1D1D16E2A2A2A2A252525252525252525252525242424202020 - 2020202020201D7175757362201670757575757575757C66666667B3E9FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFE7999998989898898989898989898989898988888787 - 878784848484848484838282828282828181818181806D81B7D1D1DDF4FFFFFF - FFFFFFE7823F3F3F3F3F3D3D3D3D3D3D3D3C3C3A3A3A3737373737373733332F - 2F2F2F2F2F2F2F2F2F2E2E2E2B68D1D1D16E2B2B2A2A26262525252525252525 - 25252524242420202020202020202062737575721D1670757575757575757C66 - 666667A5E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE399999898989898898989898989 - 898F89898888888787878784848484848484838282828282828281818181806D - ACD1D1D1F4FFFFFFFFFFFFFFAA6B3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A373737 - 37373737373333332F2F2F2F2F2F2F2F2F2E2E2E2B68D1D1D16E2B2B2B2A2625 - 2525252525252525252A2A2A2524242020202020202020247075757570177075 - 7575757575757C66666667A5E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39999989898 - 9898988989898989898989898988888887878787848484848484848382828282 - 8282828181818180A1D1D1D1EEFFFFFFFFFFFFFFE7826B3F3F3F3F3F3D3D3D3D - 3D3D3D3C3A3A37373737373737373333332F2F2F2F2F2F2F2F2F2E2E2B68D1D1 - D16E2B2B2B2B2A2A2625252525252EA3A6A6BBD0BEAEA0682520202020202020 - 1D717575736370757575757575757C66666667A5E9FFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFE39999999898989898898989898989898989898988888787878784848484 - 8484838282828282828282818181808096D1D1D1E9FFFFFFFFFFFFFFFFAA6B3F - 3F3F3F3F3F3D3D3D3D3D3C3C3C3A3A37373737373737333333332F2F2F2F2F2F - 2F2F2F2E2E68D1D1D16E2B2B2B2B2B2A26252525252531D1D1D1EEFFFFFFFFF0 - AE2E20202020202020627475757271757575757575757C66666667A4E9FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFE79A9999999898989898898989898989898989898888 - 8787878787848484848484838282828282828281818181808DC6D1D1E9FFFFFF - FFFFFFFFFFE36D6B3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A3A3737373737373737 - 3333332F2F2F2F2F2F2F2F2E2E68D1D1D16E2B2B2B2B2B2A2A262525252531D1 - D1D1EEFFFFFFFFFFFFB925202020202020247075757575757575757575757C45 - 666667A4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39A999999999898989889898989 - 8989898989898988888787878787848484848484838282828282828281818181 - 82BAD1D1DDFFFFFFFFFFFFFFFFF5966B3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A37 - 373737373737373733332F2F2F2F2F2F2F2F2F2E2E68D1D1D16E2B2B2B2B2B2A - 2A2A2625252531D1D1D1EEFFFFFFFFFFFFF596202020202020201D7277777777 - 7777777777777C45666667A4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE79A99999999 - 9898989898898989898989898989898988888887878784848484848484838282 - 828282828281818181B7D1D1DDF4FFFFFFFFFFFFFFFFBD6B6B3F3F3F3F3F3D3D - 3D3D3D3D3D3C3C3A3A3A3737373737373733332F2F2F2F2F2F2F2F2F2F68D1D1 - D16E2B2B2B2B2B2B2A26262A252531D1D1D1EEFFFFFFFFFFFFFFEB3520202020 - 202020637D7777777777777777777E45676667A4E9F4FFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFE79A99999999999898989898898989898989898989898888898F89898784 - 8484848484838282828282828282818181A6D1D1D1F4FFFFFFFFFFFFFFFFEB82 - 6B3F3F3F3F3FA2A6A6AEBEBEBEBEBEBEBEBEBEBEBEAC3737373733332F2F2F2F - 2F2F2F2F2F68D1D1D16E2B2B2B2B2B2B2B2A2625252531D1D1D1EEFFFFFFFFFF - FFFFFFA220202020202020247C7D7D7D7D7D7D7D7D7D7E7A7A6767A4DDF4FFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFE79A9999999999989898989898898989898989898989 - 89ACB7B7BEE7E4E1BCA9878484848483828282828282818181A1D1D1D1EEFFFF - FFFFFFFFFFFFFFA16B3F3F3F3F3FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE13737 - 37373333332F2F2F2F2F2F2F2F6AD1D1D16E2B2B2B2B2B2B2B2B2A26252534D1 - D1D1EEFFFFFFFFFFFFFFFFE625202020202020201D7E7D7D7D7D7D7D7D7D7EB4 - B6A4A4B4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA9A999999999999989898989889 - 898989898989898989BBD1D1E9FFFFFFFFFFE49C848484838282828282818181 - 8196D1D1D1E9FFFFFFFFFFFFFFFFFFBE6B6B3F3F3F3FA7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFE1373737373333332F2F2F2F2F2F2F2F68D1D1D16E2B2B2B2B2B2B - 2B2A2A2A262534D1D1D1EEFFFFFFFFFFFFFFFFF0352020202020202020637E7E - 7E7E7E7E7E7E7FC5EEE9DDE9F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9A99999999 - 9999999898989898898989898989898989BBD1D1E9FFFFFFFFFFFFEB92848483 - 8282828282828282818DC5D1D1E9FFFFFFFFFFFFFFFFFFEB826B6B3F3F3FA7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE1373737373733332F2F2F2F2F2F2F2F6AD1D1 - D16E2B2B2B2B2B2B2B2B2A2A2A2634D1D1D1EEFFFFFFFFFFFFFFFFF56F202020 - 202020202024787E7E7E7E7E7E7E7FD1F4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFF09A999999999999999898989898898989898989898989BBD1D1E9FFFFFF - FFFFFFFFE087848483828282828282818182BAD1D1DDFFFFFFFFFFFFFFFFFFFF - 916B6B6B3F3FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE337373737373733332F2F - 2F2F2F2F2F6AD1D1D16E2E2B2B2B2B2B2B2B2B2A2A2A34D1D1D1EEFFFFFFFFFF - FFFFFFFF952020202020202020201D797F7E7E7E7E7E7FD1F4FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFF59A9999999999999999989898989889898989898989 - 89BBD1D1E9FFFFFFFFFFFFFFFFAA848484838282828282828181B7D1D1D1F4FF - FFFFFFFFFFFFFFFFAC6B6B6B6B3FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE13737 - 373737373733332F2F2F2F2F2F6AD1D1D16E2E2E2B2B2B2B2B2B2B2B2A2A34D1 - D1D1EEFFFFFFFFFFFFFFFFFFA224202020202020202020201F787F7F7F7F7FD1 - F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A999999999999999999989898 - 988989898989898989BBD1D1E9FFFFFFFFFFFFFFFFE387848484838282828282 - 8181ABD1D1D1F4FFFFFFFFFFFFFFFFFFE16D6B6B6B3FA7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFE33737373737373333332F2F2F2F2F2F6AD1D1D16E2E2B2B2B2B2B - 2B2B2B2B2B2A34D1D1D1EEFFFFFFFFFFFFFFFFFFA62424202020202020202020 - 20202962787F7FD1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C99999999 - 9999999999989898989898898989898989BBD1D1E9FFFFFFFFFFFFFFFFF59384 - 84848382828282828282A1D1D1D1EEFFFFFFFFFFFFFFFFFFEB826B6B6B3FA7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE337373737373737373434332F2F2F2F6AD1D1 - D16E2E2E2B2B2B2B2B2B2B2B2B2B34D1D1D1EEFFFFFFFFFFFFFFFFFFA2242420 - 2020202020202020202020206FC4CCD1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFA8999999999999999999989898989898988989898989BBD1D1E9FFFFFF - FFFFFFFFFFFFAB848484838282828282828196D1D1D1E9FFFFFFFFFFFFFFFFFF - F58F6B6B6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33A373737373737373333 - 2F2F2F2F2F6AD1D1D16E2E2E2E2B2B2B2B2B2B2B2B2B35D1D1D1EEFFFFFFFFFF - FFFFFFFFA02424202020202020202020202020206FD1D1D1F4FFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFAB9999999999999999999999989898988989898989 - 89BBD1D1E9FFFFFFFFFFFFFFFFFFBD84848484838282828282828FC6D1D1E9FF - FFFFFFFFFFFFFFFFFFA16B6B6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33A3A - 3737373737373733332F2F2F2F6CD1D1D16E2E2E2E2E2B2B2B2B2B2B2B2B35D1 - D1D1EEFFFFFFFFFFFFFFFFFF902424242420202020202020202020206FD1D1D1 - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD999999999999999999999998 - 989898988989898989BBD1D1E9FFFFFFFFFFFFFFFFFFE1878484848483828282 - 828287BAD1D1DDFFFFFFFFFFFFFFFFFFFFAF6B6B6B6BAED1D1DDFFFFFFFFFFFF - FFFFFFFFFFE33A3A3737373737373733332F2F2F2F6AD1D1D16E2F2E2E2E2E2B - 2B2B2B2B2B2B35D1D1D1EEFFFFFFFFFFFFFFFFF46E2524242420202020202020 - 202020206FD1D1D1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC99999999 - 9999999999999998989898989889898989BBD1D1E9FFFFFFFFFFFFFFFFFFE487 - 8484848484838282828282B7D1D1DDF6FFFFFFFFFFFFFFFFFFE06B6B6B6BAED1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE33A3A37373737373737373434332F2F6CD1D1 - D16E2F2F2E2E2E2E2B2B2B2B2B2B35D1D1D1EEFFFFFFFFFFFFFFFFF035252424 - 24242020202020202020202090D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFBD999999999999999999999999989898989898898989BBD1D1E9FFFFFF - FFFFFFFFFFFFE78F8484848484838282828282ACD1D1D1F4FFFFFFFFFFFFFFFF - FFE66D6B6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33C3A3A37373737373737 - 3434332F2F6CD1D1D16E2F2F2F2E2E2B2B2B2B2B2B2B35D1D1D1EEFFFFFFFFFF - FFFFFFE72A25252424242020202020202020202094D1D1DDFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFE19999999999999999999999999998989898988989 - 89BBD1D1E9FFFFFFFFFFFFFFFFFFE78F8484848484848382828282AAD1D1D1F4 - FFFFFFFFFFFFFFFFFFEB856B6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3C - 3A3A373737373737373733332F6CD1D1D16E2F2F2F2F2E2E2B2B2B2B2B2B35D1 - D1D1EEFFFFFFFFFFFFFFFFAC25252525242424202020202020202020A0D1D1E9 - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39A9999999999999999999999 - 999998989898988989BBD1D1E9FFFFFFFFFFFFFFFFFFE3878484848484848382 - 828282A1D1D1D1EEFFFFFFFFFFFFFFFFFFF08D6D6B6BAED1D1DDFFFFFFFFFFFF - FFFFFFFFFFE33C3C3C3A3A3737373737373733332F6CD1D1D16E2F2F2F2E2E2E - 2E2B2B2B2B2B35D1D1D1EEFFFFFFFFFFFFFFF46F252525252524242024202020 - 20202024A3D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA9A999999 - 9999999999999999999998989898989889BBD1D1E9FFFFFFFFFFFFFFFFFFE187 - 848484848484848382828296D1D1D1EEFFFFFFFFFFFFFFFFFFF58F6D6D6BAED1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3C3C3A3A3737373737373733336CD1D1 - D16F2F2F2F2F2E2E2E2E2B2B2B2B35D1D1D1EEFFFFFFFFFFFFFFE62D25252525 - 252424242420202020202024A7D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFF09A9999999999999999999999999999989898989889BBD1D1E9FFFFFF - FFFFFFFFFFFFBD87878484848484848483828291C6D1D1E9FFFFFFFFFFFFFFFF - FFFF966D6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3C3C3A3737373737 - 37373733336CD1D1D16F2F2F2F2F2F2E2E2E2B2B2B2B35D1D1D1EEFFFFFFFFFF - FFF5902525252525252424242420202020202025BAD1D1EEFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFF9C99999999999999999999999999999999989898 - 98BBD1D1E9FFFFFFFFFFFFFFFFFFAB8787878484848484848483828EBBD1D1E9 - FFFFFFFFFFFFFFFFFFFFA86D6D6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D - 3D3C3C3A3737373737373737336CD1D1D18B2F2F2F2F2F2F2E2E2E2E2B2B35D1 - D1D1EEFFFFFFFFFFFFB92B252525252525252524242420202020202AD1D1D1F4 - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA9999999999999999999999 - 999999999998989898BBD1D1E9FFFFFFFFFFFFFFFFFF9C878787848484848484 - 84838284BAD1D1DDFFFFFFFFFFFFFFFFFFFFAA6D6D6DAED1D1DDFFFFFFFFFFFF - FFFFFFFFFFE33D3D3C3C3C3A3A37373737373737336CD1D1D16F2F2F2F2F2F2E - 2F2E2E2B2B2B35D1D1D1DDE9E9E9E9E9A7312525252525252525242424202420 - 20202035D1D1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD999999 - 9999999999999999999999999898989898BBD1D1E9FFFFFFFFFFFFFFFFEB9287 - 878787848484848484838282B7D1D1DDF4FFFFFFFFFFFFFFFFFFAB6D6D6DAED1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3D3D3C3C3A3A373737373737376CD1D1 - D18B2F2F2F2F2F2F2E2F2E2E2B2B34B7B7BABABAB7A7A06E2B25252525252525 - 25252525242424242020206ED1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFBC9999999999999999999999999999999998989898BBD1D1E9FFFFFF - FFFFFFFFFFBD8987878787848484848484848382ACD1D1D1F4FFFFFFFFFFFFFF - FFFFAC6D6D6DAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3D3D3C3C3A3A3737 - 37373737376CD1D1D16F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2E2F2E2D2B2A2A - 2625252525252525252525252424242420202094D1D1E9FFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFE199999999999999999999999999999999999898 - 98BBD1D1E9FFFFFFFFFFFFFFF4A88888878787878484848484848484AAD1D1D1 - F4FFFFFFFFFFFFFFFFFFAC6D6D6DAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D - 3D3D3D3C3C3C3A3A37373737376CD1D1D18B2F2F2F2F2F2F2F2F2E2E2E2E2B2B - 2B2B2B2B2B2B2B2A2A262525252525252525252525242424202025A6D1D1EEFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE79A99999999999999999999 - 999999999999999898BBD1D1E9FFFFFFFFFFFFFFE08988888887878784848484 - 84848483A1D1D1D1F4FFFFFFFFFFFFFFFFFFAC6D6D6DB7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFE33D3D3D3D3D3D3C3A3A3A37373737376CD1D1D18B2F2F2F2F2F2F - 2F2F2F2E2E2E2B2B2B2B2B2B2B2A2B2A2A262525252525252525252525242424 - 242028BAD1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9999 - 9999999999999999999999999999999998BBD1D1E9FFFFFFFFFFFFEB97898988 - 88888787878784848484848497D1D1D1EEFFFFFFFFFFFFFFFFFFAC6D6D6DB7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3D3D3D3D3D3B3A3A37373737376ED1D1 - D18B332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2A26252525252525 - 2525252525252424242435D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFA899999999999999999999999999999999999998BBD1D1DDE9E9E9 - E9E9D2A88989898988888787878484848484848497CBD1D1EEFFFFFFFFFFFFFF - FFFFAC6D6D6DB7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3D3D3D3D3D3D3B3C3A - 3A373737376ED1D1D18B33332F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B2B2B2B - 2B2A2A2625252525252525252525242424248BD1D1E9FFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFAD999999999999999999999999999999999999 - 99B9BBC6C6C6BBBAAFAA93898989898989888887878787848484848491C6D1D1 - E9FFFFFFFFFFFFFFFFFFAC6D6D6DB7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3D - 3D3D3D3D3D3D3C3C3A3A3737376ED1D1D18B3333332F2F2F2F2F2F2F2E2F2E2E - 2E2B2B2B2B2B2B2B2B2A2A262525252525252525252525242425A3D1D1EEFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD99999999999999999999 - 99999999999999999998989A9A9A998989898989898989898888888787878784 - 848484848FBBD1D1E9FFFFFFFFFFFFFFFFFFAB6D6D6DB7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFE33F3D3D3D3D3D3D3D3C3C3A3A3737376ED1D1D18B33332F2F2F2F - 2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2A2A2A2A262525252525252525252524 - 242DC5D1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39A99 - 9999999999999999999999999999999999999898989898898989898989898989 - 89888888878787878484848487BBD1D1DDFFFFFFFFFFFFFFFFFFAA806D6DB7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F3D3D3D3D3D3D3D3C3C3C3A3A376ED1D1 - D18B3733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2A2A2A262525 - 2525252525252525256ED1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFEF9A99999999999999999999999999999999999999999898989889 - 898989898989898989898888878787878484848487BAD1D1DDFFFFFFFFFFFFFF - FFFFA881806DB7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F3F3D3D3D3D3D3D3D - 3C3A3A37376ED1D1D18B373333332F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B - 2B2B2B2A26252525252525252525252525A0D1D1EFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFA89999999999999999999999999999999999 - 9999999998989898898989898989898989898989888887878784848484B7D1D1 - DDFFFFFFFFFFFFFFFFFF97818180B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F - 3F3F3D3D3D3D3D3D3D3C3B3A376ED1D1D18B37373333332F2F2F2F2F2F2F2F2F - 2E2E2B2E2B2B2B2B2B2B2B2B2A26252525252525252525252DBAD1DDFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD999999999999999999 - 9999999999999999999999999898989898898989898989898989898988878787 - 8787848484B7D1D1DDFFFFFFFFFFFFFFFFF49181806DB7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFE33F3F3F3F3D3D3D3D3D3D3C3C3C3A3A6ED1D1D18B37373333332F - 2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B2B2A26252525252525252525 - 6FD1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF99 - 9999999999999999999999999999999999999999999898989889898989898989 - 89898988888888878787848484AED1D1DDF4FFFFFFFFFFFFFFEF8F818180B7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F3F3F3F3D3D3D3D3D3D3C3C3C3A6ED1D1 - D18B373737333333332F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B2A2A26 - 252525252525252AA7D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFEB9A999999999999999999999999999999999999999999989898 - 989889898989898989898989898888878787878484ACD1D1D1F4FFFFFFFFFFFF - FFEA87818181B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F3F3F3F3D3D3D3D3D - 3D3D3C3C3A6ED1D1D18B3737373733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B - 2B2B2B2B2B2A2626262525252525256ED1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C99999999999999999999999999999999 - 9999999999999998989898898989898989898989898988888787878784ACD1D1 - D1F4FFFFFFFFFFFFFFE782818181B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE36B3F - 3F3F3F3F3D3D3D3D3D3D3D3C3C6ED1D1D18B373737373733332F2F2F2F2F2F2F - 2F2F2E2E2E2E2B2B2B2B2B2B2B2B2A2A2625252525252DA7D1E9FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD9999999999999999 - 9999999999999999999999999999999898989898898989898989898989898888 - 8887878784AAD1D1D1F4FFFFFFFFFFFFFFE182818181B7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFE36B6B3F3F3F3F3F3D3D3D3D3D3D3D3C6ED1D1D18B373737373733 - 33332F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B2B2B2B2A2A262525252590D1 - DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 - 9999999999999999999999999999999999999999999999989898989889898989 - 89898989898989888888878787AAD1D1D1F4FFFFFFFFFFFFFFB882828181B7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE36B6B6B3F3F3F3F3D3D3D3D3D3D3D3D6ED1D1 - D18B37373737373733332F2F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B2B2B2A - 2A2625252568C6DDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFEF9A9999999999999999999999999999999999999999999999 - 989898988989898989898989898989888888878787A1D1D1D1F4FFFFFFFFFFFF - FFAA82828181B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE36B6B3F3F3F3F3F3D3D3D - 3D3D3D3D3C6ED1D1D18B37373737373433332F2F2F2F2F2F2F2F2F2E2E2E2E2B - 2B2B2B2B2B2B2B2A2A2A262535BADDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA999999999999999999999999999999 - 9999999999999999989898989889898989898989898989898888878787A8D1D1 - D1F4FFFFFFFFFFFFFF9782828281B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE36B6B - 6B3F3F3F3F3F3D3D3D3D3D3D3D6ED1D1D18B3737373737373733332F2F2F2F2F - 2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B2A2A68B7E9FFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD99999999999999 - 9999999999999999999999999999999999989898989889898989898989898989 - 8888888787A1D1D1D1F4FFFFFFFFFFFFEF9182828281B7D1D1DDFFFFFFFFFFFF - FFFFFFFFFFE36B6B6B6B3F3F3F3F3F3D3D3D3D3D3D6ED1D1D18B373737373737 - 373333332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B6ECBF4FFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - EA9A999999999999999999999999999999999999999999999999989898988989 - 89898989898989898989888887A8D1D1D1F4FFFFFFFFFFFFE48482828282B7D1 - D1DDFFFFFFFFFFFFFFFFFFFFFFE36B6B6B6B6B3F3F3F3F3F3D3D3D3D3D6ED1D1 - D18C3A373737373737373734332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B - 3BACF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFA899999999999999999999999999999999999999999999 - 999998989898898989898989898989898989888888A1D1D1D1E9E9E9E9E9EEEE - AF8282828281B9DDD1E9FFFFFFFFFFFFFFFFFFFFFFE36B6B6B6B6B3F3F3F3F3F - 3F3D3D3D3D6ED1D1D18C3A37373737373737373434332F2F2F2F2F2F2F2E2F2E - 2E2B2B2B2B2F6CACF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC9C9E9A9A9A9A9A9A999999999999 - 999999999999999999999898989898988989898989898989898989888897C6C6 - C6C6C6C6C6CBCBCB978482828282E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFE36B6B - 6B6B6B6B6B3F3F3F3F3D3D3D3D85FFFFFF963A3A37373737373737373434332F - 2F2F2F2F2F2F2E2F2F34388BA6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F0ECECE7 - E7E3BFBCADAA9C9A9A9A99999999999999999999989898989889898989898989 - 898989898887878E8F8F9192919297A1AEAEAEBEBFBDEFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFEFBCB9BCB8B8B8B8B8B8B8B8AFB8AFAFBDFFFFFFBEAFACAAA2AAA2 - A296969696908C8C8C8B909696A2ABB8BEE7F5FFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EBE1BDADA89A9A999999999999989898 - 9889898989898989898989898988878787878484848484A1D1D1E9FFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EAE1 - BCAA9A9A999998989898988989898989898989898988888787878484848487AE - D1DDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFF4EABFAD9C9A99989889898989898989898989898888 - 87878787848497C6DDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE1BCAA9A99898989 - 8989898989898888878787878491BBE9F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFF5EABFAB9C999889898989898888878789AAEBFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EAE1BCADAAA89BA8AABCE7FFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00} - end - end - end - object pnlBody: TPanel - Left = 213 - Top = 0 - Width = 277 - Height = 186 - Align = alClient - BevelOuter = bvNone - TabOrder = 1 - object labDelphiShadow: TLabel - Left = 77 - Top = 61 - Width = 130 - Height = 32 - Alignment = taCenter - Anchors = [] - Caption = 'for Delphi' - Font.Charset = DEFAULT_CHARSET - Font.Color = clBlack - Font.Height = -27 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - Transparent = True - end - object labDelphi: TLabel - Left = 75 - Top = 56 - Width = 130 - Height = 32 - Alignment = taCenter - Anchors = [] - Caption = 'for Delphi' - Font.Charset = DEFAULT_CHARSET - Font.Color = clRed - Font.Height = -27 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - Transparent = True - end - object bvlSpit: TBevel - Left = 6 - Top = 145 - Width = 269 - Height = 37 - ParentShowHint = False - Shape = bsTopLine - ShowHint = False - end - object labTitleShadow: TLabel - Left = 87 - Top = 8 - Width = 99 - Height = 56 - Alignment = taCenter - Anchors = [] - Caption = 'PHP' - Font.Charset = DEFAULT_CHARSET - Font.Color = clBlack - Font.Height = -48 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - Transparent = True - end - object labTitle: TLabel - Left = 83 - Top = 3 - Width = 99 - Height = 56 - Alignment = taCenter - Anchors = [] - Caption = 'PHP' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite - Font.Height = -48 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - Transparent = True - end - object lblAuthor: TLabel - Left = 9 - Top = 114 - Width = 269 - Height = 31 - Alignment = taCenter - Anchors = [] - AutoSize = False - Caption = '(c) Copyright 2002-2006, Serhiy Perevoznyk'#13#10'All Rights Reserved' - end - object labVersion: TLabel - Left = 4 - Top = 92 - Width = 271 - Height = 13 - Alignment = taCenter - AutoSize = False - Caption = 'Version 6.0' - Layout = tlCenter - end - object btnOK: TButton - Left = 200 - Top = 154 - Width = 75 - Height = 25 - Cursor = crHandPoint - Cancel = True - Caption = 'OK' - Default = True - ModalResult = 1 - TabOrder = 0 - end - end -end +object dlgAbout: TdlgAbout + Left = 264 + Top = 289 + BorderStyle = bsDialog + Caption = 'About PHP4Delphi' + ClientHeight = 186 + ClientWidth = 490 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + Scaled = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object pnlLeft: TPanel + Left = 0 + Top = 0 + Width = 213 + Height = 186 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object pnlImage: TPanel + Left = 6 + Top = 8 + Width = 200 + Height = 168 + BevelOuter = bvLowered + Caption = 'pnlImage' + TabOrder = 0 + object imgAbout: TImage + Left = 1 + Top = 1 + Width = 198 + Height = 166 + Align = alClient + Center = True + Picture.Data = { + 07544269746D6170E6850000424DE6850000000000003604000028000000C700 + 0000A60000000100080000000000B08100000000000000000000000100000001 + 0000392110003929100039291800422910003D3118004A2910004A3110004A31 + 18003D2D210052311800523918005A391800423525004E3921004A392D004532 + 3F005E3D1C0065421B006B4221006B4A2100524231005A4A2D006B4A29006B52 + 2900414D37005B4A41005C583D005D6743006B5033006B57400067584E006B6B + 4A00734A2100735221007B522100734A2900735229007B5229007B5A2900845A + 29007B523100735A31007B5A3100845A31008C633100845A3900846339008C63 + 39007756480088634200846B4A008C6B39008C6B42008C6B4A00946B3900946B + 4200946B4A008C734A009473420094734A009C7342009C734A00A5734A00A57B + 4A001665650049516E00615965005F5B910086695C00786E6F006F6F94007373 + 9C005149B5006B6BA9006B6BB5007373A5004541D2004944E0006767BD006767 + D1004A4AE7003939EF004239EF00423DF3004242F7004239FF004242FF004A42 + FF004A4AEF004A4AF7004A4AFF00524AEF005252E7005555F2006565ED006868 + FC00217F7F0035877B00557F6300598E7C008C7B6300887B6F007B7B7F008383 + 8800947352009C7352009C7B5200A77E52009C7C5A00AD845600A38361009F8A + 760017C5BB0012DAD2000FEAE60004F7F30000FFF70000FFFF0008FBFB0014FF + FF00689695006898BE00998C94009C9BCE0030CFC9002DF4F3004ADAD80074CF + CE00B5845A00B58C5A00B58C6300BD8C6300BD946300B58C6B00B5946B00BD94 + 6B00C6946B00C69C6B00CE9C6B00AD8C7300AD947300B5947300BD947300BD9C + 7300AF967E00C19C7700C69C7B00C6A57B00AD9C8400B19C8800BAA28600C6A5 + 8400CE9C7300CEA57300CEA57B00CEA58400CEAD8400D6A57B00D6AD7B00D6AD + 8400B7A79100C3AA8E00BDAB9A00B8ADA600ADADAD00ADADB500BFB5AE00C6BD + B500CEAD8C00D2B19000D2B59800D4BAA200D2BDAD00DAC6A900CEBDB500D6C6 + B100ADA5BD00ADADC100ADADCE00BBB7BF00BDBDBD00C6BDC600C6C6C600CEC6 + BD00D6C6B500D6CABD00CECAC600D6CEC600E1CBB500E1CEC000DED6C600EBD8 + C300B5B5CE00BDBDCE00C6BDCE00C6C6CE00ADCECE00CECECE00D6CECE00C6D6 + CE00BDBDD600BDCED600CECED600D6D6CE00C6D6D600C6C6DE00CECEDE00BDBD + FF00DED6CE00D6D6D600DED6D600DEDED600ADDEDE00C6DEDE00CEDEDE00D6DE + DE00B5E7E700D2DEE700ADF7F700C9F5F500D6FFFF00DEDEDE00DEDEEF00DEEF + EF00E7D6CE00E7DECE00EFDECE00EBDED600EFE7D600E7DEDE00E7E7DE00EFE7 + DE00F7E7DE00E7E7E700EFE7E700EFEFE700F7EFE700E7EFEF00EFEFEF00F7EF + EF00F7F7EF00FFF7EF00DEDEF700DEF7F700F7F7F700FFF7F700FFFFF700DEDE + FF00E7E7FF00EFEFFF00F7F7FF00DEFFFF00E7FFFF00EFFFFF00F7FFFF00FFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF4C57A676666677AC5F4FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFF4C57A676666677AC5F4FFF4 + F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EEEEEEEEEEEEEEEEEEEEEEF4F4 + FFFFFFFFFFFFFFF4F4EEE9DDDDDDDDE9E9EEF4FFFFFFF4EEDE7B7B7B7B7B4F47 + 6666677AB6E9E9DDDDDDE9EEF4FFF4F4EEEEEEEEEEF4FFFFF4EEEEEEEEEEF4F4 + F4EEEEEEEEEEF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E9BAB4B4B4B4 + B4B4B4B4B4B6C5DDE9F4FFFFFFFFF4E9C5B4A4A4A4A4A4A4A5B6D1EEF4EED1B6 + 7B565656565656496666667AA4B3A4A4A4A4A5B6DDEEE9C5B4B4B4B4BAE9F4F4 + D1B6B4B4B4B6C5DDC5B4B4B4B4B6E9F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF4C5A47A7A7A7A7A7A7A7A7A7A7AA4B4D1EEF4FFF4D1B37A7A676767676767 + 677AA4B6E9E9B37A4B5656565656564966666667676767676767677AB3D1C5A4 + 7A7A7A7AA4C5EEEEB47A7A7A7A7AA4B4A47A7A7A7A7AC5F4FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF4B67A6766666666666666666767677AA4C5EEF4DDA57A + 67666666676767666667677AB6D1A46747565656565656496666666667676766 + 666666677AB4B67A676666677AB6EEE9B36766666667A4B37A676666677AB6EE + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B67A676666666666676766666666 + 6767A4D1E9B67A67666666677A7A7A6766666667A4B6A4674756565656565649 + 666666677A7A7A676666666667A4B47A676666677AB6EEE9A56766666667A4B3 + 7A676666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B67A67666666 + 66677A7A6767666666677AB3D1A567666666677AB4C5A467666666677AB4A467 + 475656565656564966666667A4C5B67A6766666667A4B37A676666677AB6EEE9 + A56766666667A4B37A676666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CFCF + CF7B7B4E4E4E4E4E4A4BB3B4A46766666666677B5E5E585454595C5E7BDEB67A + 67494E4E4F4F4F4A475656565656564A4E5C5956595F7BA467664E4E4E4F4F4F + 476666494E7B7B7B4F4A664E4E4E4F4F4F476666667AB6EEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCF5656565656565656565656565A5FB17A666666674F5656565656 + 56565656565A7B7A675C56565656565C4756565656565656565656565656565E + 67475656565656564966665C56565656565046565656565656496666667AB6EE + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFCF5656565656565656565656565656594B6766 + 675C565656565656565656565656564A675C56565656565C4756565656565656 + 56565656565656564E475656565656564966665C565656565650465656565656 + 56496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656565656 + 56565656565847664A56565656565656565656565656565C675C56565656565C + 475656565656565656565656565656565C475656565656564966665C56565656 + 565046565656565656496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 + 56565656565656565656565656564F664F56565656565847674F565656565654 + 475C56565656565C475656565656564E67475856565656565047565656565656 + 4966665C56565656565046565656565656496666667AB6EEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF0068686868686868686868686868686868686868686868 + 6868686868686868686868686868686868686868686868686868A2FFFFFFFFFF + FFFFFFFFFFCF5656565656565647475C56565656565658675056565656565C66 + 66495656565656564B5C56565656565C475656565656564966665C5656565656 + 50475656565656564966665C56565656565046565656565656496666667AB6EE + FFFFFFA268686868686868686868686868686868686868686868686868686868 + 686868686868686868686868686868686800BEBEBEBEBEBEBEBEBEBEBEBEBEBE + BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE + BEBEE6FFFFFFFFFFFFFFFFFFFFCF565656565656564666495656565656565647 + 5056565656565C6666495656565656567B5E56565656565C4756565656565649 + 66665C565656565650475656565656564966665C565656565650465656565656 + 56496666667AB6EEFFFFFFE6BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE + BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656466649 + 56565656565656465056565656565C6666495656565656564B5C56565656565C + 475656565656564966665C565656565650475656565656564966665C56565656 + 565046565656565656496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 + 565656565646664956565656565656465056565656565C666649565656565656 + 4B5C56565656565C475656565656564966665C56565656565047565656565656 + 4966665C56565656565046565656565656496666667AB6EEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCF5656565656565646664956565656565656465056565656565C66 + 6649565656565656475C56565656565C475656565656564966665C5656565656 + 50475656565656564966665C56565656565046565656565656496666667AB6EE + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564666495656565656565646 + 5056565656565C666649565656565656475C56565656565C4756565656565649 + 66665C565656565650475656565656564966665C565656565650465656565656 + 56496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656466649 + 56565656565656465056565656565C66666667A4C3CAB17A675C56565656565C + 475656565656564966665C565656565650475656565656564966665C56565656 + 565046565656565656496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 + 565656565646664956565656565656465056565656565654545454545A5A5954 + 475C56565656565C475656565656564966665C56565656565047565656565656 + 4966665C56565656565046565656565656496666667AB6EEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCF5656565656565646664956565656565656465056565656565656 + 5656565656565656475C56565656565C475656565656564966665C5656565656 + 50475656565656564966665C56565656565046565656565656496666667AB6EE + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564666495656565656565646 + 50565656565656565656565656565656475C56565656565C4756565656565649 + 66665C565656565650475656565656564966665C565656565650465656565656 + 56496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656466649 + 565656565656564650565656565656565656565656565656475C56565656565C + 475656565656564966665C565656565650475656565656564966665C56565656 + 565046565656565656496666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 + 565656565646664956565656565656465056565656565C666649565656565656 + 475C56565656565C475656565656564966665C56565656565047565656565656 + 4966665C56565656565046565656565656496666667AB6EEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCF5656565656565646664956565656565656465056565656565C66 + 6649565656565656475C56565656565C475656565656564966665C5656565656 + 50475656565656564966665C56565656565046565656565656496666667AB6EE + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4F4F4F4 + F4FFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564345435656565656565643 + 4D56565656564C454543565656565656434D56565656565C4756565656565649 + 66454C56565656564D435656565656564366665C565656565650435656565656 + 564345454566A4C5D1D1D1D1D1D1D1DDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 + DDD1D1D1D1D1D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656434543 + 56565656565656414C56565656564D1E1941565656565656434D56565656565C + 475656565656564366454C56565656564C41565656565656431E1E4C56565656 + 564D41565656565656431919191E659495959595A3D1D1D1F4FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFE7BCACABA196969696C5D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFCF5656 + 565656565643454356565656565656414C56565656565C1E070F565656565656 + 434D56565656565C475656565656564166454C56565656564C0F565656565656 + 430E004856565656564C0F56565656565641000000030B13202020206CD1D1C5 + EEF4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4FF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFA16D6B6B6B6B6B6B6EC5D1D1EEFFFFFFFFFFFFFF + FFFFFFFFFFCF5656565656565643454356565656565656424C56565656565E65 + 0D0F565656565656464D56565656565C475656565656564166454D5656565656 + 4C0F565656565656430E004856565656564D0F56565656565641010101030B13 + 202020206CD1B6B3B6C5C5C5D1D1D1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD1D1 + D1C5C5C5BAC5E9F4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4826D6D6B6D6B6B6B82C5D1D1 + EEFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564345435656565656565641 + 4C56565656565EA01C415656565656564B5C56565656565C4756565656565641 + 7A7A5C56565656564C0F565656565656430E004856565656564D0F5656565656 + 5641030303071013202020206FC5B47A7A7A7A7A7A7AA4A4A4A4A4A4A4A4A4A4 + A4A4A4A4A4A4A47A7A7A7A7A7AA4C5F4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE06D6D6D6D + 6B6B6B6B8BC6D1D1F4FFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656434543 + 56565656565656424856565656565DB03143565656565656B25E56565656565C + 4756565656565649B6B25D56565656564C195656565656564E0E084C56565656 + 56501E565656565656430A0A0A0B1113202020208BC5B37A7A7A7A6767676767 + 6767676767676767676767676767676767677A7A7A7AB6EEFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFAA6D6D6D6D6D6B6B6B8DCBD1D1F4FFFFFFFFFFFFFFFFFFFFFFFFCF5656 + 565656565643454356565656565656434156565656565659585456565656565D + CD5E56565656565C4756565656565654595A565656565656481E565656565656 + 5452525656565656565C45565656565656430707070710132020202094D1B6A4 + B4A5A5A4A4A4A4A47A6767666666666666666666677A7AA4A4A4A5B3B3B6DDF4 + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF8F6D6D6D6D6D6D6B6B96D1D1D1F4FFFFFFFFFFFFFF + FFFFFFFFFFCF565656565656564345435656565656565643144C565656565656 + 565656565656567BD15E56565656565C47565656565656565656565656565654 + 421E5656565656565656565656565656565E4556565656565641010101030B13 + 20202020A0D1C5D1EEE9E9E9E9DDDDD1B6A4676666666666666666677AB4C5DD + E9E9E9E9EEEEF4FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA826D6D6D6D6D6D6D6BA0D1D1DD + FFFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656564345435656565656565643 + 0E0F5C56565656565656565656537BCAD15E56565656565C4756565656565356 + 5656565656565343231E56565656565656565656565656565DC8655656565656 + 5643010000030B13201318187AC4C4D5DFF3F3FDFDFDF4F4EEC57A6766666767 + 6767677AA5C4C4C4A5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9806D6D6D6D + 6D6D6B6BA2D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656434543 + 565656565656564615167A7B5F5D5A565654504C4330A6D1D15E56565656565C + 4B565656564D1E435C56565A5E7B4523201E5656565656564E484C5356565D7B + CDD16756565656565643010101030B1320164040404040404040404040406040 + 4040404040404040404040404040404040A5FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFA16D6D6D6D6D6D6D6D6BA6D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 + 565656565647674E565656565656547A322AA0D1CACACDCD65302D2D2B2BA6D1 + D15E56565656565C7A7A7AB0C0B32424A3CECDCDCAD16C20201E565656565656 + 49190C0C45B0C3D1D1D16F30B3CDC8B17A660706070710132017606060606060 + 60606060606060606060606060606060606060606060606040A4FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF4866D6D6D6D6D6D6D6D6DA7D1D1E9FFFFFFFFFFFFFFFF + FFFFFFFFFFCF565656565656564F4F595656565656565DC16E2F95D1D1D1D1D1 + 6F2B2B2B2B2BA6D1D15E56565656565ED1D1D1D1E9BB252595DDD1D1D1D16F20 + 201E5656565656567B32101064B6D1D1D1D17A4D59595959594B161010111220 + 201762637979797F79797C70707070707070707070707070707078797F7F7F7F + 79D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE382816D6D6D6D6D6D6D6DB7D1D1E9 + FFFFFFFFFFFFFFFFFFFFFFFFFFCF565656565656565656565656565656567BC5 + 6F2F8BCBD1D1D1CB6F2E2B2B2B2BA6D1D15E56565656565FF4F4F4F4F4D02525 + 6ED2D1D1D1CB6F20201E5656565656567B68131368BAD1D1D1CB7A5656565656 + 567B2A131313202020202039D1D1D1F4FDFDFCDB7F7C7C7C7C7C7C7C7C7C7C7C + 786767B3E9FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF81816D6D6D6D + 6D6D6D6DBAD1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFCF56565656565656565656 + 56565656565ECDCB8B2F6CBAD1D1D1CB6F2E2E2B2B2BA6D1D15E56565656565F + FFFFFFFFFFD025253BC6D1D1D1D16F20201E565656565656B26420202EB7D1D1 + D1D17A5656565656567B2A20202020202020206FD1D1DDFFFFFFFFFFF37E7C7C + 7C7C7C7C7C7C7E7866667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFA18181816D6D6D6D6D6D80BBD1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFCF5656 + 5656565656565656565656565FCDD1D16E2F3BB7D1D1D1D16E2E2E2E2B2BA7D1 + D15E56565656565FFFFFFFFFFFD025252DA7D1D1D1D16E20201E565656565656 + B264202025A6D1D1D1D17A5656565656567B25202020202020202095D1D1E9FF + FFFFFFFFFE7E7E7E7E7E7E7E7E7E7E6766667AB4EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF487818180806D6D6D6D6D82C6D1D1EEFFFFFFFFFFFFFFFF + FFFFFFFFFFCF56565656565656565656544D48B0CAD1D1CB6E2F33A6D1D1D1CB + 6E2E2E2B2B2BA7D1D15E56565656565FFFFFFFFFFFD0252525A0D1D1D1D16E20 + 201E565656565656B26420202094D1D1D1D17A5656565656567B282020202020 + 202024A3D1D1E9FFFFFFFFFFFFDA7D7D7D7D7D7D7D7D7E6666667AB4EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE78281818181816D6D6D6D86C6D1D1F0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFAF8F8B5444465C1CDCDCDA4353795D1D1D1C5 + 6E2F2F90D1D1D1C56C2F2E2E2B2EA7D1D1CEF8F8F8F8F8F9FFFFFFFFFFD02525 + 256FCBD1D1C66C2420231D1D1D44CDCDCA642020206CCBD1D1C6641C30A4CDCD + CDA3242020202020202028A7D1D1EEFFFFFFFFFFFFDA7D7D7D7D7D7D7D7D7E66 + 66667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC82818181816D6D + 6D6D6D8DCBD1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE3D3D3DA3D1D1D1 + 9637376EBAD1D1BA692F2F6CBAD1D1BA3B2F2F2E2E2BA7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFD025252531B7D1D1C53524202020202031D1D1D1642020202AA7D1 + D1C53520206FD1D1D1A220202020202020202DC6D1D1F4FFFFFFFFFFFFDA7777 + 7777777777777E6666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + A88282818181816D6D6D6D91CBD1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + E36A3D3C8BC6D1D18B373737A6D1D1A7372F2F34A3D1D1A7342F2E2E2E2EA7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFD02525252595D1D1A72A24242420202031D1D1 + D1682020202094D1D1B72A20202DB7D1D16F202020202020202068D1D1D1FFFF + FFFFFFFFFFDB76767676767676767C6666667AB6EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF8F828282818181816D6D6D96D1D1D1F4FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFE76B3D3D3DA2D1A76A3737376EB7CB9037332F2F6CB7CB90 + 2F2F2F2E2E2EA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02525252531A7CB902524 + 242020202031D1D1D168202020202DA6CB90202020206FC6B731202020202020 + 202090D1D1DDFFFFFFFFFFFFFFDC75757575757575757C6666667AB6EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8782828281818181816D6DA1D1D1D2F4 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF6E3D3D3D3D8B6E37373737376A8B37 + 3733332F2F3D6E342F2F2F2F2E2EA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02525 + 2525252E6C2A2424242420202031D1D1D16820202020202D6825202020202335 + 31131313131313202020A0D1D1E9F4F4F4F4F4F4F4DC75757575757575757C66 + 66667AB4EEF4F4F4F4F4F4F4F4F4FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE08282828282818181 + 816D6DA2D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46E3D3D3D3C3C3C + 3A3737373737373737332F2F2F2F2F2F2F2F2F2F2F2EA7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFD025252525252525252424242424202031D1D1D16C202020202020 + 202020202020201210101010101010111116A0B4B4D1E9E9E9E9E9E9E9D57575 + 7575757575757C66666667A5D1DDDDDDDDDDD1C5C5DDEEFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD + 8282828282818181818181A6D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF863D3D3D3D3C3C3C3A37373737373737373333332F2F2F2F2F2F2F2F2FA7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFD025252525252525252525242424242031D1D1 + D16820202020202020202020202013110703030307070707070D677A7AA4A4A4 + A4A4A4A4A4A475757575757575757C666666677AA4A4A4A4A4A4A47A7AA5E9FF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFA8828282828282818181816DACD1D1DDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF973D3D3D3D3C3C3C3C373737373737373737332F2F2F2F + 2F2F2F2F2F2EA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD025252525252525252525 + 242424242031D1D1D16C20202020202020202020202013100301010101010101 + 010E45454567676767676767676775757575757575757C666666666767676767 + 6767676767A4DDF4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8282828282828281818181A7D1D1E9FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA3D3D3D3D3D3C3C3C3A3A37373737 + 37373733332F2F2F2F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02525 + 2525252525252525242424242432D1D1D16C202020202020202020202020130B + 0301000000000000001445454566666666666666666775757575757575757C66 + 66666666666666666666666667A4DDF4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7878382828282828282 + 818181B7D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB83D3D3D3D3D3D + 3C3C3A37373737373737373733332F2F2F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFD025252525252525252525242424242432D1D1D16C202020202020 + 2020202020201310070100000000000000194545456666666666666666677575 + 7575757575757C6666666666666666666666666667A4DDF4FFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF84 + 8483828282828282818181BAD1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFBE6A3D3D3D3D3D3D3C3C3A3A373737373737373333332F2F2F2F2F2F2FA7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFD026252525252525252525252424242432D1D1 + D16C2020202020202020201F1F1F1F1B150C040202020101011E454566676767 + 67676767676775757575757575757C6666666767676778786667676667A4DDF4 + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFAD848484828282828282828182C5D1D1E9FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFE36B3D3D3D3D3D3C3C3C3C3A3737373737373737373333 + 2F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD026252525252525252525 + 252525242435D1D1D16C202020202020202029797F7F7E7E7E7E717171717171 + 717272727272727272727272727275757575757575757372727D7E7E7E7C7C61 + 607A7A7A7AA4DDF4FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFA8848483838382828282828182C6D1D1E9FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB6E3F3D3D3D3D3D3D3D3C3C3A3737 + 37373737373733332F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02A26 + 2525252525252525252525242435D1D1D16C20202020202020201F797F7F7E7E + 7D7D7D7775757575757575757575757575757575757575757575757575757575 + 77777D7D7E7C7C6160B6B6B4B4C5EEFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91848484848382828282 + 828286C5D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4823F3D3D3D3D + 3D3D3C3C3C3A3A3737373737373737332F2F2F2F2F2FA7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFD02A262525252525252525252525252435D1D1D16C202020202020 + 202062797F7F7E7E7D7D7D777575757575757575757575757575757575757575 + 757575757575757577777D7D7E7C7C6160EEEEEEEEEEF4FFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8784 + 8484848382828282828287C6D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFF8F3F3F3D3D3D3D3D3D3C3C3C3A3A3737373737373434332F2F2F2F2FA7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFD02A2A2A26252525252525252525252435D1D1 + D16C20202020202020201D797F7F7E7E7D7D7D77757575757575757575757575 + 7575757575757575757575757575757577777D7D7E7C7C6160FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFE18784848484848382828282828EC6D1D1EEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFA13F3F3D3D3D3D3D3D3D3C3C3A3A3737373737373734 + 33332F2F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2A2A2A262525252525 + 252525252535D1D1D16C202020202020202020637F7F7E7E7D7D7D7775757575 + 75757575757575757575757575757575757575757575757577777D7D7E7C7C61 + 60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFBD8484848484848483828282828EC6D1D1EEFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF3F3F3F3D3D3D3D3D3D3D3C3C3A + 3A373737373737373333332F2F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2A + 2A26262625252525252525252535D1D1D16C24202020202020202029797F7E7E + 7D7D7D7775757575757575757575757575757575757575757575757575757575 + 77777D7D7E7C7C6160FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB84848484848484848382 + 82828FC6D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE6B3F3F3F3D + 3D3D3D3D3C3C3C3A3A373737373737373333332F2F2FA7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFD02B2B2A2A262525252525252525252535D1D1D16C242020202020 + 20202020627F7E7E7E621F1B1A18181863C4D4D8DCDCDCDCDCDCDCDCDCDB7575 + 7575757575757C78787879C4D8DAD47F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA98784 + 848484848484838282828EC6D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFE46D3F3F3F3F3D3D3D3D3D3D3D3C3A3A37373737373737333333332FA7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B2A2A2A2625252525252525252535D1D1 + D16C2420202020202020202024797E7E7D7820131107030142A4B6DDFFFFFFFF + FFFFFFFFFFFC75757575757575757C6666667AB6EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFF938787848484848484838282828EC6D1D1E9FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFEB6E3F3F3F3F3D3D3D3D3D3D3C3C3A373A3737373737 + 373733332F2FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B2B2A2A2A25252525 + 252525252535D1D1D16C24202020202020202020201F7E7E7D7D1F20130B0701 + 1E7AB3DDFFFFFFFFFFFFFFFFFFFC75757575757575757C6666667AB6EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF08F87878484848484848483828286C5D1D1E9FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6863F3F3F3F3D3D3D3D3D3D3D3C + 3C3C3A373737373737373333332FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B + 2B2B2A2A2A262525252525252535D1D1D16C242424242020202020202024787E + 7D7D7C20201109041E667AC5F4FFFFFFFFFFFFFFFFFC77757575757575757C66 + 66667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA8987878784848484848484 + 838282BBD1D1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF963F3F3F3F + 3F3D3D3D3D3D3D3D3C3C3A3737373737373737333333A7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFD02B2B2B2B2B2A26252525252525252535D1D1D16C242424202020 + 2020202020201F7E7D7D7D6220131007424567A4DDF4FFFFFFFFFFFFFFFC7775 + 7575757575757C6666667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1898787 + 8784848484848484848382AED1D1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFAC3F3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A37373737373737373333A7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B2B2B2B2B2A262525252525252535D1D1 + D16C24242424202020202020202020637D7D7D7C1720120B1E45457AB4D3EEFF + FFFFFFFFFFFC77757575757575757C6666667AB6EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFBD8887878787848484848484848382A1D1D1D1D1EEF4FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFBD6B3F3F3F3F3F3D3D3D3D3D3D3C3C3C3A3A373737 + 373737373333A7D1D1DDFFFFFFFFFFFFFFFFFFFFFFD02B2B2B2B2B2A2B2A2625 + 252525252535D1D1D16C24242424202020202020202020297E7D7D7763201311 + 09144266A4B6D1E9F4FFFFFFFFFC77757575757575757C6666667AB6EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFAD888787878787848484848484838287AED1D1D1 + D1D1DDE9EEF4FFFFFFFFFFFFFFFFFFFFFFFFFFE36D6B3F3F3F3F3D3D3D3D3D3D + 3D3C3C3C3A3A3737373737373733A7D1D1DDEEEEEEEEEEEEEEEEEEEEEEBB2B2B + 2B2B2B2B2A2A2A26252525252535D1D1D16C2524242424202020202020202020 + 627D7D77721D20131007041E67B3C5D1DDEEFFFFFFFD77757575757575757C66 + 66667AB6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA8988878787878484848484 + 848483828796A2B7C6D1D1D1D1D1DDEBF4FFFFFFFFFFFFFFFFFFFFEB826B3F3F + 3F6A3F3D3D3D3D3D3D3D3C3C3A3A3737373737373737A7D1D1D1D1D1D1D1D1D1 + D1D1D1D1D1A72B2B2B2B2B2B2B2A2A26252525252535D1D1D16C252524242420 + 2020202020202020247C7D7775612020110A0301147AB6D1D1D1E9FFFFFD7775 + 7575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B888888 + 878787878484848484848483828282828E97ABB9D1D1D1D1D1DDE9F4FFFFFFFF + FFFFFFF68D6B6B3F3F3F3F3F3F3D3D3D3D3D3D3C3C3A37373737373737376A6C + 6C6C6C6C6C6C6C6C6C6C6C68683B2B2B2B2B2B2B2B2B2A26252525252535D1D1 + D16C2525242424242020202020202020201F7D7775731B2013100701010D6FBA + D1D1D1E9FFFD77757575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF9289898888878787878484848484848382828282828282868FA2B7CB + D1D1D1D1DDE9F4FFFFFFFFFFA16B6B3F3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A3A + 373737373737373434332F2F2F2F2F2F2F2F2F2E2E2B2B2B2B2B2B2B2B2B2B2A + 2A2525252535D1D1D16C25252524242420202020202020202020637775757017 + 20120B0301030A64BAD1D1D1E9FD77757575757575757C6666667AB4EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFEF9889898888888787878784848484848484838282 + 828282828181828FA2B7C6D1D1D1D1DDEEF4FFFFAC6B6B6B3F3F3F3F3F3D3D3D + 3D3D3D3D3D3C3A3A37373737373737373433332F2F2F2F2F2F2F2F2F2E2E2B2E + 2B2B2B2B2B2B2B2B2A2A26252535D1D1D16C2525252424242424202020202020 + 2020297C75757363201311090301030B64BAD1D1D1D977757575757575757C66 + 66667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7898989898887878787878484 + 848484848483828282828282828181816D828FA2BAD1D1D1D1D1E9F4BE6B6B6B + 3F3F3F3F3F3D3D3D3D3D3D3D3C3C3C3A3A3737373737373433332F2F2F2F2F2F + 2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B2B2A26252535D1D1D16C252525252424 + 242420202020202020202062767575711D20131007010107106CC6D1D1CC7775 + 7575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE189898989 + 898887878787878484848484848483828282828282828181816D6D6D8296A7C6 + D1D1D1D1BB6D6B6B6B3F3F3F3F3F3F3D3D3D3D3D3D3C3C3C3A3A373737373737 + 3733332F2F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B2B2B2A2A2A262535D1D1 + D16C25252525252424242424202020202020201770757575612020120A030103 + 0A126FD1D1CC7D757575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFBF89898989898888878787878784848484848484838282828282828181 + 81816D6D6D6D8086A2BBD1D1BB826B6B6B6B3F3F3F3F3F3D3D3D3D3D3D3D3C3C + 3A3A373737373737373733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B + 2B2A2A262535D1D1D16C2525252525252424242020202020202020201B727575 + 731B201311070101030B16A0D1CC7D757575757575757C6666667AB4EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFBD8989898989888888878787878484848484848483 + 82828282828282818181816D6D6D6D6D6D85A2B7D1866B6B6B6B6B3F3F3F3F3F + 3D3D3D3D3D3D3D3C3C3A37373737373737373733332F2F2F2F2F2F2F2F2F2E2E + 2E2E2B2B2B2B2B2B2B2B2A262635D1D1D16C2525252525252424242420202020 + 202020202061757575701720120B030103071128A6CC7D757575757575757C66 + 66667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC898989898989888887878787 + 84848484848484838282828282828282818180806D6D6D6D6D6D6D82A2906B6B + 6B6B6B3F3F3F3F3F3F3D3D3D3D3D3D3C3C3A3A3737373737373737332F2F2F2F + 2F2F2F2F2F2F2F2E2E2B2B2B2B2B2B2B2B2B2B2A2635D1D1D16C252525252525 + 25242424242020202020202020177175757461202011090301030A1235C77D75 + 7575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD89898989 + 8989898888878787878784848484848383838282828282828181816D6D6D6D6D + 6D6D6D6D6D95966D6B6B6B6B3F3F3F3F3F3F3D3D3D3D3D3D3C3C3A3A37373737 + 373737373333332F2F2F2F2F2F2F2F2F2E2E2B2B2B2B2B2B2B2B2B2A2A35D1D1 + D16C252525252525252524242424202020202020202062737575721B20131007 + 01010710136F7D757575757575757C6666667AB4EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFAA89898989898989898887878787878484848484848382828282828282 + 828181816D6D6D6D6D6D6D6D6B8DC6AE8C6B6B6B3F3F3F3F3F3F3D3D3D3D3D3D + 3C3C3A3A3A3737373737373733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B + 2B2B2B2A2A39D1D1D16C25252525252525252424242420202020202020202361 + 757575702020120B0301030911297D757575757575757C66666667B4EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFA98989898989898988888887878787878484848484 + 84848382828282828281818181816D6D6D6D6D6D6D82BBD1BBA16E6B6B3F3F3F + 3F3F3D3D3D3D3D3D3D3C3C3C3A3A3737373737373434332F2F2F2F2F2F2F2F2F + 2F2E2E2E2B2B2B2B2B2B2B2B2A39D1D1D16C2525252525252525252424242420 + 202020202020201D7175757362201311090301030B1671757575757575757C66 + 666667B4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C898989898989898988888887 + 878787848484848484848382828282828282818180806D6D6D6D6D6D6D6DB7D1 + D1D2BE856B3F3F3F3F3F3F3D3D3D3D3D3D3D3C3C3A3A37373737373737343333 + 2F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B39D1D1D16C252525252525 + 2525252424242420202020202020202062747575711C20131007010107157175 + 7575757575757C66666667B4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A89898989 + 898989898989888887878787848484848484848382828282828281818181816D + 6D6D6D6D6D6DACD1D1D1F4E78D6B6B3F3F3F3F3F3D3D3D3D3D3D3D3C3C3A3737 + 3737373737373333332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B39D1D1 + D16C252525252525252525252424242420202020202020201770757575612020 + 120A0301030D71757575757575757C66666667B4EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF59A89898989898989898989888888878787878484848484848382828282 + 828282818181806D6D6D6D6D6D6DA2D1D1D1EEFFEA916B3F3F3F3F3F3F3D3D3D + 3D3D3D3C3C3A3A373737373737343733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B + 2B2B2B2B2B39D1D1D16C25252525252525252525252424242420202020202020 + 201B727575721B2013110703010470757575757575757C66666667B4EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF49A8989898989898989898989888887878784848484 + 8484848483828282828282818181816D6D6D6D6D6D6D96D1D1D1E9FFFFEB8F6B + 3F3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A37373737373737373333332F2F2F2F2F + 2F2F2F2F2E2E2E2B2B2B2B2B2B68D1D1D16C2525252525252525252525242424 + 2420202020202020202061757575701720131007010470757575757575757C66 + 666667B4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9A988989898989898989898988 + 8888878787878484848484848382828282828282828181816D6D6D6D6D6D86C5 + D1D1E9FFFFFFE7863F3F3F3F3F3F3D3D3D3D3D3D3C3C3C3A3737373737373737 + 33332F2F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B68D1D1D16E262525252525 + 2525252525242424242020202020202020201770757574612020120A03027075 + 7575757575757C66666667B4EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC9A98898989 + 8989898989898989888887878787848484848484848382828282828282818181 + 816D6D6D6D6D82BAD1D1DDFFFFFFFFE3823F3F3F3F3F3D3D3D3D3D3D3D3C3C3C + 3A3A3737373737373733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B68D1D1 + D16E2A2625252525252525252525252424242420202020202020201B73757572 + 1B201311070470757575757575757C66666667B4EEFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFEB9998988989898989898989898989888887878787848484848484848382 + 828282828282818181816D6D6D6D6DAED1D1D1F4FFFFFFFFBC6B3F3F3F3F3F3D + 3D3D3D3D3D3D3C3C3A373A3737373737373333332F2F2F2F2F2F2F2F2F2E2E2E + 2E2B2B2B2B68D1D1D16E2A262525252525252525252525242424242020202020 + 202020206175757570162013100770757575757575757C66666667B4EEFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFEB999898988989898989898989898988888887878787 + 848484848484848382828282828281818181816D6D6D6DA6D1D1D1F4FFFFFFFF + F6AA6B3F3F3F3F3F3D3D3D3D3D3D3D3C3C3A37373737373737373333332F2F2F + 2F2F2F2F2F2F2E2E2E2E2B2B2B68D1D1D16E2A2A262525252525252525252525 + 2424242420202020202020201C71757573622020110A70757575757575757C66 + 666667B3E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE799989898898989898989898989 + 89898888878787878484848484848483828282828282828181816D6D6D6D6DA1 + D1D1D1EEFFFFFFFFFFEB863F3F3F3F3F3F3D3D3D3D3D3D3C3C3A3A3737373737 + 37373333332F2F2F2F2F2F2F2F2F2F2E2E2B2B2B2B68D1D1D16E2B2A26252525 + 25252525252525252424242420202020202020202062737575721D2013117075 + 7575757575757C66666667B3E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE79998989898 + 8989898989898989898989888887878787878484848484838382828282828281 + 8181816D6D6D6D8FCBD1D1E9FFFFFFFFFFFFBE6D3F3F3F3F3F3D3D3D3D3D3D3D + 3C3C3A3A37373737373737373333332F2F2F2F2F2F2F2F2F2E2E2B2B2B68D1D1 + D16E2B2A2A262525252525252525252525242424242020202020202020236175 + 75757020201370757575757575757C66666667B3E9FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFE79998989898898989898989898989898988888787878784848484848484 + 8382828282828282818181816D6D6D86BBD1D1DDFFFFFFFFFFFFF6A13F3F3F3F + 3F3D3D3D3D3D3D3D3C3C3A3A3A3737373737373733332F2F2F2F2F2F2F2F2F2E + 2E2E2E2B2B68D1D1D16E2A2A2A2A252525252525252525252525242424202020 + 2020202020201D7175757362201670757575757575757C66666667B3E9FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFE7999998989898898989898989898989898988888787 + 878784848484848484838282828282828181818181806D81B7D1D1DDF4FFFFFF + FFFFFFE7823F3F3F3F3F3D3D3D3D3D3D3D3C3C3A3A3A3737373737373733332F + 2F2F2F2F2F2F2F2F2F2E2E2E2B68D1D1D16E2B2B2A2A26262525252525252525 + 25252524242420202020202020202062737575721D1670757575757575757C66 + 666667A5E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE399999898989898898989898989 + 898F89898888888787878784848484848484838282828282828281818181806D + ACD1D1D1F4FFFFFFFFFFFFFFAA6B3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A373737 + 37373737373333332F2F2F2F2F2F2F2F2F2E2E2E2B68D1D1D16E2B2B2B2A2625 + 2525252525252525252A2A2A2524242020202020202020247075757570177075 + 7575757575757C66666667A5E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39999989898 + 9898988989898989898989898988888887878787848484848484848382828282 + 8282828181818180A1D1D1D1EEFFFFFFFFFFFFFFE7826B3F3F3F3F3F3D3D3D3D + 3D3D3D3C3A3A37373737373737373333332F2F2F2F2F2F2F2F2F2E2E2B68D1D1 + D16E2B2B2B2B2A2A2625252525252EA3A6A6BBD0BEAEA0682520202020202020 + 1D717575736370757575757575757C66666667A5E9FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFE39999999898989898898989898989898989898988888787878784848484 + 8484838282828282828282818181808096D1D1D1E9FFFFFFFFFFFFFFFFAA6B3F + 3F3F3F3F3F3D3D3D3D3D3C3C3C3A3A37373737373737333333332F2F2F2F2F2F + 2F2F2F2E2E68D1D1D16E2B2B2B2B2B2A26252525252531D1D1D1EEFFFFFFFFF0 + AE2E20202020202020627475757271757575757575757C66666667A4E9FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFE79A9999999898989898898989898989898989898888 + 8787878787848484848484838282828282828281818181808DC6D1D1E9FFFFFF + FFFFFFFFFFE36D6B3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A3A3737373737373737 + 3333332F2F2F2F2F2F2F2F2E2E68D1D1D16E2B2B2B2B2B2A2A262525252531D1 + D1D1EEFFFFFFFFFFFFB925202020202020247075757575757575757575757C45 + 666667A4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39A999999999898989889898989 + 8989898989898988888787878787848484848484838282828282828281818181 + 82BAD1D1DDFFFFFFFFFFFFFFFFF5966B3F3F3F3F3F3D3D3D3D3D3D3D3C3A3A37 + 373737373737373733332F2F2F2F2F2F2F2F2F2E2E68D1D1D16E2B2B2B2B2B2A + 2A2A2625252531D1D1D1EEFFFFFFFFFFFFF596202020202020201D7277777777 + 7777777777777C45666667A4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE79A99999999 + 9898989898898989898989898989898988888887878784848484848484838282 + 828282828281818181B7D1D1DDF4FFFFFFFFFFFFFFFFBD6B6B3F3F3F3F3F3D3D + 3D3D3D3D3D3C3C3A3A3A3737373737373733332F2F2F2F2F2F2F2F2F2F68D1D1 + D16E2B2B2B2B2B2B2A26262A252531D1D1D1EEFFFFFFFFFFFFFFEB3520202020 + 202020637D7777777777777777777E45676667A4E9F4FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFE79A99999999999898989898898989898989898989898888898F89898784 + 8484848484838282828282828282818181A6D1D1D1F4FFFFFFFFFFFFFFFFEB82 + 6B3F3F3F3F3FA2A6A6AEBEBEBEBEBEBEBEBEBEBEBEAC3737373733332F2F2F2F + 2F2F2F2F2F68D1D1D16E2B2B2B2B2B2B2B2A2625252531D1D1D1EEFFFFFFFFFF + FFFFFFA220202020202020247C7D7D7D7D7D7D7D7D7D7E7A7A6767A4DDF4FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFE79A9999999999989898989898898989898989898989 + 89ACB7B7BEE7E4E1BCA9878484848483828282828282818181A1D1D1D1EEFFFF + FFFFFFFFFFFFFFA16B3F3F3F3F3FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE13737 + 37373333332F2F2F2F2F2F2F2F6AD1D1D16E2B2B2B2B2B2B2B2B2A26252534D1 + D1D1EEFFFFFFFFFFFFFFFFE625202020202020201D7E7D7D7D7D7D7D7D7D7EB4 + B6A4A4B4E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA9A999999999999989898989889 + 898989898989898989BBD1D1E9FFFFFFFFFFE49C848484838282828282818181 + 8196D1D1D1E9FFFFFFFFFFFFFFFFFFBE6B6B3F3F3F3FA7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFE1373737373333332F2F2F2F2F2F2F2F68D1D1D16E2B2B2B2B2B2B + 2B2A2A2A262534D1D1D1EEFFFFFFFFFFFFFFFFF0352020202020202020637E7E + 7E7E7E7E7E7E7FC5EEE9DDE9F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9A99999999 + 9999999898989898898989898989898989BBD1D1E9FFFFFFFFFFFFEB92848483 + 8282828282828282818DC5D1D1E9FFFFFFFFFFFFFFFFFFEB826B6B3F3F3FA7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE1373737373733332F2F2F2F2F2F2F2F6AD1D1 + D16E2B2B2B2B2B2B2B2B2A2A2A2634D1D1D1EEFFFFFFFFFFFFFFFFF56F202020 + 202020202024787E7E7E7E7E7E7E7FD1F4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF09A999999999999999898989898898989898989898989BBD1D1E9FFFFFF + FFFFFFFFE087848483828282828282818182BAD1D1DDFFFFFFFFFFFFFFFFFFFF + 916B6B6B3F3FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE337373737373733332F2F + 2F2F2F2F2F6AD1D1D16E2E2B2B2B2B2B2B2B2B2A2A2A34D1D1D1EEFFFFFFFFFF + FFFFFFFF952020202020202020201D797F7E7E7E7E7E7FD1F4FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF59A9999999999999999989898989889898989898989 + 89BBD1D1E9FFFFFFFFFFFFFFFFAA848484838282828282828181B7D1D1D1F4FF + FFFFFFFFFFFFFFFFAC6B6B6B6B3FA7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE13737 + 373737373733332F2F2F2F2F2F6AD1D1D16E2E2E2B2B2B2B2B2B2B2B2A2A34D1 + D1D1EEFFFFFFFFFFFFFFFFFFA224202020202020202020201F787F7F7F7F7FD1 + F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A999999999999999999989898 + 988989898989898989BBD1D1E9FFFFFFFFFFFFFFFFE387848484838282828282 + 8181ABD1D1D1F4FFFFFFFFFFFFFFFFFFE16D6B6B6B3FA7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFE33737373737373333332F2F2F2F2F2F6AD1D1D16E2E2B2B2B2B2B + 2B2B2B2B2B2A34D1D1D1EEFFFFFFFFFFFFFFFFFFA62424202020202020202020 + 20202962787F7FD1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C99999999 + 9999999999989898989898898989898989BBD1D1E9FFFFFFFFFFFFFFFFF59384 + 84848382828282828282A1D1D1D1EEFFFFFFFFFFFFFFFFFFEB826B6B6B3FA7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE337373737373737373434332F2F2F2F6AD1D1 + D16E2E2E2B2B2B2B2B2B2B2B2B2B34D1D1D1EEFFFFFFFFFFFFFFFFFFA2242420 + 2020202020202020202020206FC4CCD1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFA8999999999999999999989898989898988989898989BBD1D1E9FFFFFF + FFFFFFFFFFFFAB848484838282828282828196D1D1D1E9FFFFFFFFFFFFFFFFFF + F58F6B6B6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33A373737373737373333 + 2F2F2F2F2F6AD1D1D16E2E2E2E2B2B2B2B2B2B2B2B2B35D1D1D1EEFFFFFFFFFF + FFFFFFFFA02424202020202020202020202020206FD1D1D1F4FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFAB9999999999999999999999989898988989898989 + 89BBD1D1E9FFFFFFFFFFFFFFFFFFBD84848484838282828282828FC6D1D1E9FF + FFFFFFFFFFFFFFFFFFA16B6B6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33A3A + 3737373737373733332F2F2F2F6CD1D1D16E2E2E2E2E2B2B2B2B2B2B2B2B35D1 + D1D1EEFFFFFFFFFFFFFFFFFF902424242420202020202020202020206FD1D1D1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD999999999999999999999998 + 989898988989898989BBD1D1E9FFFFFFFFFFFFFFFFFFE1878484848483828282 + 828287BAD1D1DDFFFFFFFFFFFFFFFFFFFFAF6B6B6B6BAED1D1DDFFFFFFFFFFFF + FFFFFFFFFFE33A3A3737373737373733332F2F2F2F6AD1D1D16E2F2E2E2E2E2B + 2B2B2B2B2B2B35D1D1D1EEFFFFFFFFFFFFFFFFF46E2524242420202020202020 + 202020206FD1D1D1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC99999999 + 9999999999999998989898989889898989BBD1D1E9FFFFFFFFFFFFFFFFFFE487 + 8484848484838282828282B7D1D1DDF6FFFFFFFFFFFFFFFFFFE06B6B6B6BAED1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE33A3A37373737373737373434332F2F6CD1D1 + D16E2F2F2E2E2E2E2B2B2B2B2B2B35D1D1D1EEFFFFFFFFFFFFFFFFF035252424 + 24242020202020202020202090D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFBD999999999999999999999999989898989898898989BBD1D1E9FFFFFF + FFFFFFFFFFFFE78F8484848484838282828282ACD1D1D1F4FFFFFFFFFFFFFFFF + FFE66D6B6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33C3A3A37373737373737 + 3434332F2F6CD1D1D16E2F2F2F2E2E2B2B2B2B2B2B2B35D1D1D1EEFFFFFFFFFF + FFFFFFE72A25252424242020202020202020202094D1D1DDFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFE19999999999999999999999999998989898988989 + 89BBD1D1E9FFFFFFFFFFFFFFFFFFE78F8484848484848382828282AAD1D1D1F4 + FFFFFFFFFFFFFFFFFFEB856B6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3C + 3A3A373737373737373733332F6CD1D1D16E2F2F2F2F2E2E2B2B2B2B2B2B35D1 + D1D1EEFFFFFFFFFFFFFFFFAC25252525242424202020202020202020A0D1D1E9 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39A9999999999999999999999 + 999998989898988989BBD1D1E9FFFFFFFFFFFFFFFFFFE3878484848484848382 + 828282A1D1D1D1EEFFFFFFFFFFFFFFFFFFF08D6D6B6BAED1D1DDFFFFFFFFFFFF + FFFFFFFFFFE33C3C3C3A3A3737373737373733332F6CD1D1D16E2F2F2F2E2E2E + 2E2B2B2B2B2B35D1D1D1EEFFFFFFFFFFFFFFF46F252525252524242024202020 + 20202024A3D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA9A999999 + 9999999999999999999998989898989889BBD1D1E9FFFFFFFFFFFFFFFFFFE187 + 848484848484848382828296D1D1D1EEFFFFFFFFFFFFFFFFFFF58F6D6D6BAED1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3C3C3A3A3737373737373733336CD1D1 + D16F2F2F2F2F2E2E2E2E2B2B2B2B35D1D1D1EEFFFFFFFFFFFFFFE62D25252525 + 252424242420202020202024A7D1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF09A9999999999999999999999999999989898989889BBD1D1E9FFFFFF + FFFFFFFFFFFFBD87878484848484848483828291C6D1D1E9FFFFFFFFFFFFFFFF + FFFF966D6B6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3C3C3A3737373737 + 37373733336CD1D1D16F2F2F2F2F2F2E2E2E2B2B2B2B35D1D1D1EEFFFFFFFFFF + FFF5902525252525252424242420202020202025BAD1D1EEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF9C99999999999999999999999999999999989898 + 98BBD1D1E9FFFFFFFFFFFFFFFFFFAB8787878484848484848483828EBBD1D1E9 + FFFFFFFFFFFFFFFFFFFFA86D6D6BAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D + 3D3C3C3A3737373737373737336CD1D1D18B2F2F2F2F2F2F2E2E2E2E2B2B35D1 + D1D1EEFFFFFFFFFFFFB92B252525252525252524242420202020202AD1D1D1F4 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA9999999999999999999999 + 999999999998989898BBD1D1E9FFFFFFFFFFFFFFFFFF9C878787848484848484 + 84838284BAD1D1DDFFFFFFFFFFFFFFFFFFFFAA6D6D6DAED1D1DDFFFFFFFFFFFF + FFFFFFFFFFE33D3D3C3C3C3A3A37373737373737336CD1D1D16F2F2F2F2F2F2E + 2F2E2E2B2B2B35D1D1D1DDE9E9E9E9E9A7312525252525252525242424202420 + 20202035D1D1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD999999 + 9999999999999999999999999898989898BBD1D1E9FFFFFFFFFFFFFFFFEB9287 + 878787848484848484838282B7D1D1DDF4FFFFFFFFFFFFFFFFFFAB6D6D6DAED1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3D3D3C3C3A3A373737373737376CD1D1 + D18B2F2F2F2F2F2F2E2F2E2E2B2B34B7B7BABABAB7A7A06E2B25252525252525 + 25252525242424242020206ED1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFBC9999999999999999999999999999999998989898BBD1D1E9FFFFFF + FFFFFFFFFFBD8987878787848484848484848382ACD1D1D1F4FFFFFFFFFFFFFF + FFFFAC6D6D6DAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3D3D3C3C3A3A3737 + 37373737376CD1D1D16F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2E2F2E2D2B2A2A + 2625252525252525252525252424242420202094D1D1E9FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFE199999999999999999999999999999999999898 + 98BBD1D1E9FFFFFFFFFFFFFFF4A88888878787878484848484848484AAD1D1D1 + F4FFFFFFFFFFFFFFFFFFAC6D6D6DAED1D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D + 3D3D3D3C3C3C3A3A37373737376CD1D1D18B2F2F2F2F2F2F2F2F2E2E2E2E2B2B + 2B2B2B2B2B2B2B2A2A262525252525252525252525242424202025A6D1D1EEFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE79A99999999999999999999 + 999999999999999898BBD1D1E9FFFFFFFFFFFFFFE08988888887878784848484 + 84848483A1D1D1D1F4FFFFFFFFFFFFFFFFFFAC6D6D6DB7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFE33D3D3D3D3D3D3C3A3A3A37373737376CD1D1D18B2F2F2F2F2F2F + 2F2F2F2E2E2E2B2B2B2B2B2B2B2A2B2A2A262525252525252525252525242424 + 242028BAD1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9999 + 9999999999999999999999999999999998BBD1D1E9FFFFFFFFFFFFEB97898988 + 88888787878784848484848497D1D1D1EEFFFFFFFFFFFFFFFFFFAC6D6D6DB7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE33D3D3D3D3D3D3D3B3A3A37373737376ED1D1 + D18B332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2A26252525252525 + 2525252525252424242435D1D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFA899999999999999999999999999999999999998BBD1D1DDE9E9E9 + E9E9D2A88989898988888787878484848484848497CBD1D1EEFFFFFFFFFFFFFF + FFFFAC6D6D6DB7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3D3D3D3D3D3D3B3C3A + 3A373737376ED1D1D18B33332F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B2B2B2B + 2B2A2A2625252525252525252525242424248BD1D1E9FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFAD999999999999999999999999999999999999 + 99B9BBC6C6C6BBBAAFAA93898989898989888887878787848484848491C6D1D1 + E9FFFFFFFFFFFFFFFFFFAC6D6D6DB7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3D + 3D3D3D3D3D3D3C3C3A3A3737376ED1D1D18B3333332F2F2F2F2F2F2F2E2F2E2E + 2E2B2B2B2B2B2B2B2B2A2A262525252525252525252525242425A3D1D1EEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD99999999999999999999 + 99999999999999999998989A9A9A998989898989898989898888888787878784 + 848484848FBBD1D1E9FFFFFFFFFFFFFFFFFFAB6D6D6DB7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFE33F3D3D3D3D3D3D3D3C3C3A3A3737376ED1D1D18B33332F2F2F2F + 2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2A2A2A2A262525252525252525252524 + 242DC5D1D1F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE39A99 + 9999999999999999999999999999999999999898989898898989898989898989 + 89888888878787878484848487BBD1D1DDFFFFFFFFFFFFFFFFFFAA806D6DB7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F3D3D3D3D3D3D3D3C3C3C3A3A376ED1D1 + D18B3733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2A2A2A262525 + 2525252525252525256ED1D1E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFEF9A99999999999999999999999999999999999999999898989889 + 898989898989898989898888878787878484848487BAD1D1DDFFFFFFFFFFFFFF + FFFFA881806DB7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F3F3D3D3D3D3D3D3D + 3C3A3A37376ED1D1D18B373333332F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B + 2B2B2B2A26252525252525252525252525A0D1D1EFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFA89999999999999999999999999999999999 + 9999999998989898898989898989898989898989888887878784848484B7D1D1 + DDFFFFFFFFFFFFFFFFFF97818180B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F + 3F3F3D3D3D3D3D3D3D3C3B3A376ED1D1D18B37373333332F2F2F2F2F2F2F2F2F + 2E2E2B2E2B2B2B2B2B2B2B2B2A26252525252525252525252DBAD1DDFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD999999999999999999 + 9999999999999999999999999898989898898989898989898989898988878787 + 8787848484B7D1D1DDFFFFFFFFFFFFFFFFF49181806DB7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFE33F3F3F3F3D3D3D3D3D3D3C3C3C3A3A6ED1D1D18B37373333332F + 2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B2B2A26252525252525252525 + 6FD1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF99 + 9999999999999999999999999999999999999999999898989889898989898989 + 89898988888888878787848484AED1D1DDF4FFFFFFFFFFFFFFEF8F818180B7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F3F3F3F3D3D3D3D3D3D3C3C3C3A6ED1D1 + D18B373737333333332F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B2A2A26 + 252525252525252AA7D1DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFEB9A999999999999999999999999999999999999999999989898 + 989889898989898989898989898888878787878484ACD1D1D1F4FFFFFFFFFFFF + FFEA87818181B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE33F3F3F3F3F3D3D3D3D3D + 3D3D3C3C3A6ED1D1D18B3737373733332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B + 2B2B2B2B2B2A2626262525252525256ED1D1EEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C99999999999999999999999999999999 + 9999999999999998989898898989898989898989898988888787878784ACD1D1 + D1F4FFFFFFFFFFFFFFE782818181B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE36B3F + 3F3F3F3F3D3D3D3D3D3D3D3C3C6ED1D1D18B373737373733332F2F2F2F2F2F2F + 2F2F2E2E2E2E2B2B2B2B2B2B2B2B2A2A2625252525252DA7D1E9FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD9999999999999999 + 9999999999999999999999999999999898989898898989898989898989898888 + 8887878784AAD1D1D1F4FFFFFFFFFFFFFFE182818181B7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFE36B6B3F3F3F3F3F3D3D3D3D3D3D3D3C6ED1D1D18B373737373733 + 33332F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B2B2B2B2A2A262525252590D1 + DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 + 9999999999999999999999999999999999999999999999989898989889898989 + 89898989898989888888878787AAD1D1D1F4FFFFFFFFFFFFFFB882828181B7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE36B6B6B3F3F3F3F3D3D3D3D3D3D3D3D6ED1D1 + D18B37373737373733332F2F2F2F2F2F2F2F2F2F2E2E2E2B2B2B2B2B2B2B2B2A + 2A2625252568C6DDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFEF9A9999999999999999999999999999999999999999999999 + 989898988989898989898989898989888888878787A1D1D1D1F4FFFFFFFFFFFF + FFAA82828181B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE36B6B3F3F3F3F3F3D3D3D + 3D3D3D3D3C6ED1D1D18B37373737373433332F2F2F2F2F2F2F2F2F2E2E2E2E2B + 2B2B2B2B2B2B2B2A2A2A262535BADDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA999999999999999999999999999999 + 9999999999999999989898989889898989898989898989898888878787A8D1D1 + D1F4FFFFFFFFFFFFFF9782828281B7D1D1DDFFFFFFFFFFFFFFFFFFFFFFE36B6B + 6B3F3F3F3F3F3D3D3D3D3D3D3D6ED1D1D18B3737373737373733332F2F2F2F2F + 2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B2A2A68B7E9FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD99999999999999 + 9999999999999999999999999999999999989898989889898989898989898989 + 8888888787A1D1D1D1F4FFFFFFFFFFFFEF9182828281B7D1D1DDFFFFFFFFFFFF + FFFFFFFFFFE36B6B6B6B3F3F3F3F3F3D3D3D3D3D3D6ED1D1D18B373737373737 + 373333332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B2B2B2B6ECBF4FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + EA9A999999999999999999999999999999999999999999999999989898988989 + 89898989898989898989888887A8D1D1D1F4FFFFFFFFFFFFE48482828282B7D1 + D1DDFFFFFFFFFFFFFFFFFFFFFFE36B6B6B6B6B3F3F3F3F3F3D3D3D3D3D6ED1D1 + D18C3A373737373737373734332F2F2F2F2F2F2F2F2F2E2E2E2E2B2B2B2B2B2B + 3BACF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFA899999999999999999999999999999999999999999999 + 999998989898898989898989898989898989888888A1D1D1D1E9E9E9E9E9EEEE + AF8282828281B9DDD1E9FFFFFFFFFFFFFFFFFFFFFFE36B6B6B6B6B3F3F3F3F3F + 3F3D3D3D3D6ED1D1D18C3A37373737373737373434332F2F2F2F2F2F2F2E2F2E + 2E2B2B2B2B2F6CACF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC9C9E9A9A9A9A9A9A999999999999 + 999999999999999999999898989898988989898989898989898989888897C6C6 + C6C6C6C6C6CBCBCB978482828282E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFE36B6B + 6B6B6B6B6B3F3F3F3F3D3D3D3D85FFFFFF963A3A37373737373737373434332F + 2F2F2F2F2F2F2E2F2F34388BA6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F0ECECE7 + E7E3BFBCADAA9C9A9A9A99999999999999999999989898989889898989898989 + 898989898887878E8F8F9192919297A1AEAEAEBEBFBDEFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFEFBCB9BCB8B8B8B8B8B8B8B8AFB8AFAFBDFFFFFFBEAFACAAA2AAA2 + A296969696908C8C8C8B909696A2ABB8BEE7F5FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EBE1BDADA89A9A999999999999989898 + 9889898989898989898989898988878787878484848484A1D1D1E9FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EAE1 + BCAA9A9A999998989898988989898989898989898988888787878484848487AE + D1DDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF4EABFAD9C9A99989889898989898989898989898888 + 87878787848497C6DDF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE1BCAA9A99898989 + 8989898989898888878787878491BBE9F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF5EABFAB9C999889898989898888878789AAEBFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EAE1BCADAAA89BA8AABCE7FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00} + end + end + end + object pnlBody: TPanel + Left = 213 + Top = 0 + Width = 277 + Height = 186 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + object labDelphiShadow: TLabel + Left = 77 + Top = 61 + Width = 130 + Height = 32 + Alignment = taCenter + Anchors = [] + Caption = 'for Delphi' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -27 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + end + object labDelphi: TLabel + Left = 75 + Top = 56 + Width = 130 + Height = 32 + Alignment = taCenter + Anchors = [] + Caption = 'for Delphi' + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -27 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + end + object bvlSpit: TBevel + Left = 6 + Top = 145 + Width = 269 + Height = 37 + ParentShowHint = False + Shape = bsTopLine + ShowHint = False + end + object labTitleShadow: TLabel + Left = 87 + Top = 8 + Width = 99 + Height = 56 + Alignment = taCenter + Anchors = [] + Caption = 'PHP' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -48 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + end + object labTitle: TLabel + Left = 83 + Top = 3 + Width = 99 + Height = 56 + Alignment = taCenter + Anchors = [] + Caption = 'PHP' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -48 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + Transparent = True + end + object lblAuthor: TLabel + Left = 9 + Top = 114 + Width = 269 + Height = 31 + Alignment = taCenter + Anchors = [] + AutoSize = False + Caption = 'Copyright (c) 2002-2009, Serhiy Perevoznyk'#13#10'All Rights Reserved' + end + object labVersion: TLabel + Left = 4 + Top = 92 + Width = 271 + Height = 13 + Alignment = taCenter + AutoSize = False + Caption = 'Version 6.0' + Layout = tlCenter + end + object btnOK: TButton + Left = 200 + Top = 154 + Width = 75 + Height = 25 + Cursor = crHandPoint + Cancel = True + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end + end +end diff --git a/phpAbout.pas b/phpAbout.pas index 2e467ee..5c7ff02 100644 --- a/phpAbout.pas +++ b/phpAbout.pas @@ -1,111 +1,112 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpAbout.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit phpAbout; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, - {$IFDEF VERSION6} - DesignIntf, - DesignEditors, - {$ELSE} - dsgnintf, - {$ENDIF} - math; - -type - TdlgAbout = class(TForm) - pnlLeft: TPanel; - pnlImage: TPanel; - imgAbout: TImage; - pnlBody: TPanel; - bvlSpit: TBevel; - labTitleShadow: TLabel; - labTitle: TLabel; - labDelphiShadow: TLabel; - lblAuthor: TLabel; - labDelphi: TLabel; - labVersion: TLabel; - btnOK: TButton; - procedure FormCreate(Sender: TObject); - protected - end; - - TPHPVersionEditor = class(TPropertyEditor) - function AllEqual: boolean; override; - procedure Edit; override; - function GetAttributes: TPropertyAttributes; override; - function GetValue: string; override; - procedure SetValue(const Value: string); override; - end; - - -const php4DelphiVersion = '6.2'; - -implementation - -{$R *.DFM} - -function TPHPVersionEditor.AllEqual: boolean; -var - componentIndex: integer; - currentValue: string; -begin - Result := False; - if (PropCount > 1) then - begin - currentValue := GetStrValue; - for componentIndex := 1 to PropCount - 1 do - begin - if (GetStrValueAt(componentIndex) <> currentValue) then - exit; - end; - end; - Result := True; -end; - -procedure TPHPVersionEditor.Edit; -begin - with TdlgAbout.Create(NIL) do - begin - try - ShowModal; - finally - Free; { Free dialog. } - end; - end; -end; - -function TPHPVersionEditor.GetAttributes: TPropertyAttributes; -begin - Result := [paDialog, paReadOnly]; -end; - -function TPHPVersionEditor.GetValue: string; -begin - Result := 'PHP4Delphi ' + php4DelphiVersion; -end; - -procedure TPHPVersionEditor.SetValue(const Value: string); -begin -end; - -procedure TdlgAbout.FormCreate(Sender: TObject); -begin - labVersion.Caption := 'Version ' + php4DelphiVersion; -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} +{$I PHP.INC} + +{ $Id: phpAbout.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit phpAbout; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, + {$IFDEF VERSION6} + DesignIntf, + DesignEditors, + {$ELSE} + dsgnintf, + {$ENDIF} + math; + +type + TdlgAbout = class(TForm) + pnlLeft: TPanel; + pnlImage: TPanel; + imgAbout: TImage; + pnlBody: TPanel; + bvlSpit: TBevel; + labTitleShadow: TLabel; + labTitle: TLabel; + labDelphiShadow: TLabel; + lblAuthor: TLabel; + labDelphi: TLabel; + labVersion: TLabel; + btnOK: TButton; + procedure FormCreate(Sender: TObject); + protected + end; + + TPHPVersionEditor = class(TPropertyEditor) + function AllEqual: boolean; override; + procedure Edit; override; + function GetAttributes: TPropertyAttributes; override; + function GetValue: string; override; + procedure SetValue(const Value: string); override; + end; + + +const php4DelphiVersion = '7.4'; + +implementation + +{$R *.DFM} + +function TPHPVersionEditor.AllEqual: boolean; +var + componentIndex: integer; + currentValue: string; +begin + Result := False; + if (PropCount > 1) then + begin + currentValue := GetStrValue; + for componentIndex := 1 to PropCount - 1 do + begin + if (GetStrValueAt(componentIndex) <> currentValue) then + exit; + end; + end; + Result := True; +end; + +procedure TPHPVersionEditor.Edit; +begin + with TdlgAbout.Create(NIL) do + begin + try + ShowModal; + finally + Free; { Free dialog. } + end; + end; +end; + +function TPHPVersionEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog, paReadOnly]; +end; + +function TPHPVersionEditor.GetValue: string; +begin + Result := 'PHP4Delphi ' + php4DelphiVersion; +end; + +procedure TPHPVersionEditor.SetValue(const Value: string); +begin +end; + +procedure TdlgAbout.FormCreate(Sender: TObject); +begin + labVersion.Caption := 'Version ' + php4DelphiVersion; +end; + +end. diff --git a/phpApp.pas b/phpApp.pas index 381b015..7dd7745 100644 --- a/phpApp.pas +++ b/phpApp.pas @@ -1,56 +1,56 @@ -{*******************************************************} -{ PHP4Delphi } -{ Custom PHP extension application } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpApp.pas,v 6.2 02/2006 delphi32 Exp $ } - - -{$DENYPACKAGEUNIT} - -unit phpAPP; - -interface - -uses - Windows, SysUtils, PHPAPI, phpModules; - -implementation - -{ InitApplication } -procedure InitApplication; -begin - Application := TPHPApplication.Create(nil); -end; - -{ DoneApplication } -procedure DoneApplication; -begin - try - if Assigned(Application) then - begin - Application.CacheConnections := false; - Application.Free; - Application := nil; - end; - except - end; -end; - -initialization - if not PHPLoaded then - LoadPHP; - - InitApplication; - -finalization - DoneApplication; - -end. - +{*******************************************************} +{ PHP4Delphi } +{ Custom PHP extension application } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: phpApp.pas,v 7.4 10/2009 delphi32 Exp $ } + + +{$DENYPACKAGEUNIT} + +unit phpAPP; + +interface + +uses + Windows, SysUtils, PHPAPI, phpModules; + +implementation + +{ InitApplication } +procedure InitApplication; +begin + Application := TPHPApplication.Create(nil); +end; + +{ DoneApplication } +procedure DoneApplication; +begin + try + if Assigned(Application) then + begin + Application.CacheConnections := false; + Application.Free; + Application := nil; + end; + except + end; +end; + +initialization + if not PHPLoaded then + LoadPHP; + + InitApplication; + +finalization + DoneApplication; + +end. + diff --git a/phpClass.pas b/phpClass.pas index d39470f..4726009 100644 --- a/phpClass.pas +++ b/phpClass.pas @@ -1,1131 +1,1165 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP classes support } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpClass.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit phpClass; - -interface - -uses - Windows, SysUtils, Classes, PHPCommon, - ZendTypes, ZendAPI, phpTypes, PHPAPI, - phpFunctions; - -type - // Instance of the class - TPHPClassInstance = class; - - //Execute method - TClassMethodExecute = procedure (Sender : TPHPClassInstance; Parameters : TFunctionParams; - var ReturnValue : variant; ZendValue : pzval; this_ptr : pzval; TSRMLS_DC : pointer) of object; - - //Property - TClassProperty = class(TCollectionItem) - private - FName : string; - FValue : string; - function GetAsBoolean: boolean; - function GetAsFloat: double; - function GetAsInteger: integer; - procedure SetAsBoolean(const Value: boolean); - procedure SetAsFloat(const Value: double); - procedure SetAsInteger(const Value: integer); - protected - function GetDisplayName : string; override; - public - procedure Assign(Source : TPersistent); override; - property AsInteger : integer read GetAsInteger write SetAsInteger; - property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; - property AsString : string read FValue write FValue; - property AsFloat : double read GetAsFloat write SetAsFloat; - published - property Name : string read FName write FName; - property Value : string read FValue write FValue; - end; - - //Collection of the class properties - TClassProperties = class(TCollection) - private - FOwner : TComponent; - procedure SetItem(Index: Integer; const Value: TClassProperty); - function GetItem(Index: Integer): TClassProperty; - protected - function GetOwner : TPersistent; override; - public - function Add: TClassProperty; - constructor Create(AOwner: TComponent); - function GetVariables : string; - function IndexOf(AName : string) : integer; - function ByName(AName : string) : TClassProperty; - property Items[Index: Integer]: TClassProperty read GetItem write SetItem; default; - end; - - //The method of the class - TPHPClassMethod = class(TCollectionItem) - private - FOnExecute : TClassMethodExecute; - FName: string; - FTag : integer; - FFunctionParams: TFunctionParams; - FZendVar : TZendVariable; - procedure SetFunctionParams(const Value: TFunctionParams); - public - ReturnValue : variant; - constructor Create(Collection : TCollection); override; - destructor Destroy; override; - function GetDisplayName: string; override; - procedure SetDisplayName(const Value: string); override; - procedure AssignTo(Dest: TPersistent); override; - property ZendVar: TZendVariable read FZendVar; - published - property Name : string read FName write SetDisplayName; - property Tag : integer read FTag write FTag; - property Parameters: TFunctionParams read FFunctionParams write SetFunctionParams; - property OnExecute : TClassMethodExecute read FOnExecute write FOnExecute; - end; - - //Collection of the class methods - TPHPClassMethods = class(TCollection) - private - FOwner: TPersistent; - function GetItem(Index: Integer): TPHPClassMethod; - procedure SetItem(Index: Integer; Value: TPHPClassMethod); - protected - function GetOwner: TPersistent; override; - procedure SetItemName(Item: TCollectionItem); override; - public - constructor Create(Owner: TPersistent; ItemClass: TCollectionItemClass); - function Add : TPHPClassMethod; - function ByName(AName : string) : TPHPClassMethod; - property Items[Index: Integer]: TPHPClassMethod read GetItem write SetItem; default; - end; - - //Represents PHP class - TPHPClass = class(TPHPComponent) - private - FProperties : TClassProperties; - FMethods : TPHPClassMethods; - FClassObject: pzend_class_entry; - FClassName : string; - FClassEntry : tzend_class_entry; - {$IFDEF PHP5} - FClassFunction : array[0..1] of zend_function_entry; - {$ENDIF} - procedure SetProperties(const Value: TClassProperties); - procedure SetMethods(const Value : TPHPClassMethods); - procedure SetClassName(const Value: string); - protected - function GetClassEntry : pzend_class_entry; virtual; - procedure Loaded; override; - function InstanceConstructor(return_value : pzval) : TPHPClassInstance; - property ZendClassObject : pzend_class_entry read FClassObject write FClassObject; - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - procedure ClassRegister(AModuleNumber : integer); virtual; - procedure ProduceInstance(AValue : pzval); virtual; - published - property Properties : TClassProperties read FProperties write SetProperties; - property Methods : TPHPClassMethods read FMethods write SetMethods; - property PHPClassName : string read FClassName write SetClassName; - end; - - - TPHPClassInstance = class(TComponent) - private - FProperties : TClassProperties; - FProducer : TPHPClass; - procedure SetProperties(const Value: TClassProperties); - protected - property Producer : TPHPClass read FProducer; - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - property Properties : TClassProperties read FProperties write SetProperties; - end; - - -{$IFDEF PHP5} -procedure RegisterClassHandlers; -{$ENDIF} - -implementation - -uses - phpModules; - -var - le_classresource : integer = 0; - - {$IFDEF PHP5} - ClassObjectHandlers : zend_object_handlers; - {$ENDIF} - -const - {$IFDEF PHP4} - le_classresource_name = 'TPHPCLASS4'; - {$ELSE} - le_classresource_name = 'TPHPCLASS5'; - {$ENDIF} - -procedure class_destructor_handler(rsrc : PZend_rsrc_list_entry; TSRMLS_D : pointer); cdecl; -var - resource : TPHPClassInstance; -begin - if rsrc = nil then - Exit; - resource := rsrc^.ptr; - if Assigned(Resource) then - try - resource.free; - except - end; -end; - -{ TphpClass } - - -//when object created from script using "new" -function class_call_constructor(AClassName : string; return_value : pzval) : TPHPClassInstance; -var - Extension : TPHPExtension; - idp : pointer; - id : integer; - cnt : integer; -begin - Result := nil; - idp := ts_resource_ex(integer(app_globals_id), nil); - id := integer(idp^); - if id <= 0 then - Exit; - Extension := TPHPExtension(id); - for cnt := 0 to Extension.ComponentCount - 1 do - begin - if (Extension.Components[cnt] is TphpClass) then - begin - if SameText(AClassName, TphpClass(Extension.Components[cnt]).PHPClassName) then - begin - Result := TPHPClass(Extension.Components[cnt]).InstanceConstructor(return_value); - break; - end; - end; - end; -end; - -{$IFDEF PHP4} - -//PHP4 -function class_set_property_handler(property_reference : Pzend_property_reference; value : pzval) : integer; cdecl; -var - this_ptr : pzval; - OBJ : TPHPClassInstance; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - propname : string; - tsrmls : pointer; - param : TClassProperty; -begin - tsrmls := ts_resource_ex(0, nil); - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - - this_ptr := property_reference^._object; - new(data); - if zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) = SUCCESS then - Obj := zend_fetch_resource(data^, TSRMLS, -1, 'class resource', nil, 1, le_classresource) - else - OBJ := nil; - freemem(data); - if Assigned(Obj) then - begin - convert_to_string(value); - param := Obj.Properties.ByName(propname); - if Assigned(param) then - param.Value := value.value.str.val; - end; - Result := SUCCESS; -end; - - - -//PHP4 -procedure class_call_function(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; -var - OBJ : TPHPClassInstance; - Producer : TPHPClass; - M : TPHPClassMethod; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - MethodName : string; - Params : pzval_array; - j : integer; -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - MethodName := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - if (zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) = SUCCESS) then - Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) - else - Obj := nil; - freemem(data); - - if not Assigned(Obj) then - begin - //not assigned obj = new instance (constructor) - class_call_constructor(MethodName, this_ptr); - exit; - end; - - if ht > 0 then - begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - end; - - - Producer := Obj.Producer; - if Assigned(Producer) then - begin - M := Producer.Methods.ByName(MethodName); - if Assigned(M) then - begin - if Assigned(M.FOnExecute) then - begin - if M.Parameters.Count <> ht then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - if ht > 0 then - begin - for j := 0 to ht - 1 do - begin - if not IsParamTypeCorrect(M.Parameters[j].ParamType, Params[j]^) then - begin - zend_error(E_WARNING, PChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); - Exit; - end; - M.Parameters[j].Value := zval2variant(Params[j]^^); - end; - end; // if ht > 0 - - - M.ZendVar.AsZendVariable := return_value; //direct access to zend variable - M.FOnExecute(Obj, M.Parameters, M.ReturnValue, M.FZendVar.AsZendVariable, this_ptr, TSRMLS_DC); - if M.ZendVar.ISNull then //perform variant conversion - variant2zval(M.ReturnValue, return_value); - - end; - end; - end; - dispose_pzval_array(Params); -end; - - -//PHP4 -procedure class_get_property_handler(val : pzval; property_reference : PZend_property_reference); cdecl; -var - this_ptr : pzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - obj : TPHPClassInstance; - p : pointer; - propname : string; - tsrmls : pointer; - data: ^ppzval; - param : TClassProperty; -begin - tsrmls := ts_resource_ex(0, nil); - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - if ( zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) <> SUCCESS) then - Obj := nil - else - Obj := zend_fetch_resource(data^, TSRMLS, -1, 'class resource', nil, 1, le_classresource); - freemem(data); - if Assigned(Obj) then - begin - param := Obj.Properties.ByName(propname); - if Assigned(param) then - ZVAL_STRING(val, PChar(param.value), true) - else - ZVAL_EMPTY_STRING(val) - end - else - ZVAL_STRING(val, 'undefined', true); -end; - -//PHP4 -procedure _class_get_property_wrapper; assembler; -asm - push ebp - mov ebp,esp - sub esp,50h - push ebx - push esi - push edi - lea edi,[ebp-50h] - mov ecx,14h - mov eax,0CCCCCCCCh - rep stosd - mov eax,dword ptr [ebp+0Ch] - push eax - lea ecx,[ebp-10h] - push ecx - call class_get_property_handler - add esp,8 - mov edx,dword ptr [ebp+8] - mov eax,dword ptr [ebp-10h] - mov dword ptr [edx],eax - mov ecx,dword ptr [ebp-0Ch] - mov dword ptr [edx+4],ecx - mov eax,dword ptr [ebp-8] - mov dword ptr [edx+8],eax - mov ecx,dword ptr [ebp-4] - mov dword ptr [edx+0Ch],ecx - mov eax,dword ptr [ebp+8] - - pop edi - pop esi - pop ebx - add esp,50h - cmp ebp,esp - mov esp,ebp - pop ebp - ret -end; -{$ENDIF} - - - - -{$IFDEF PHP5} - -// Read object property value (getter) -//PHP5 -function class_get_property_handler(_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; -var - retval : pzval; - obj : TPHPClassInstance; - data: ^ppzval; - propname : string; - object_properties : PHashTable; - param : TClassProperty; -begin - retval := emalloc(sizeof(zval)); - FillChar(retval^, sizeof(zval), 0); - propname := member^.value.str.val; - new(data); - try - object_properties := Z_OBJPROP(_object^); - if zend_hash_find(object_properties, 'instance', strlen('instance') + 1, data) = SUCCESS then - Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) - else - Obj := nil; - finally - freemem(data); - end; - - if Assigned(Obj) then - begin - param := Obj.Properties.ByName(propname); - if Assigned(param) then - ZVAL_STRING(retval, PChar(param.value), true) - else - ZVAL_EMPTY_STRING(retval); - end - else - ZVAL_STRING(retval, 'undefined', true); - - Result := retval; -end; - -// Write object property value (setter) -//PHP5 -procedure class_set_property_handler(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; -var - OBJ : TPHPClassInstance; - data: ^ppzval; - propname : string; - object_properties : PHashTable; - param : TClassProperty; -begin - propname := member^.value.str.val; - new(data); - try - object_properties := Z_OBJPROP(_object^); - if zend_hash_find(object_properties, 'instance', strlen('instance') + 1, data) = SUCCESS then - Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) - else - Obj := nil; - finally - freemem(data); - end; - - if Assigned(Obj) then - begin - convert_to_string(value); - param := Obj.Properties.ByName(propname); - if Assigned(param) then - param.Value := value.value.str.val; - end; - -end; - -{$IFDEF PHP510} -function class_call_method(method : pchar; ht : integer; return_value : pzval; return_value_ptr : ppzval; - this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; -{$ELSE} -function class_call_method(method : pchar; ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; -{$ENDIF} -var - OBJ : TPHPClassInstance; - data: ^ppzval; - Params : pzval_array; - Producer : TPHPClass; - M : TPHPClassMethod; - j : integer; -begin - new(data); - if zend_hash_find(this_ptr^.value.obj.handlers.get_properties(this_ptr, TSRMLS_DC), 'instance', strlen('instance') + 1, data) = SUCCESS then - Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) - else - Obj := nil; - freemem(data); - - if not Assigned(Obj) then - begin - //not assigned obj = new instance (constructor) - class_call_constructor(Method, this_ptr); - Result := SUCCESS; - exit; - end; - - if ht > 0 then - begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Result := FAILURE; - Exit; - end; - end; - - - Producer := Obj.Producer; - if Assigned(Producer) then - begin - M := Producer.Methods.ByName(Method); - if Assigned(M) then - begin - if Assigned(M.FOnExecute) then - begin - if M.Parameters.Count <> ht then - begin - zend_wrong_param_count(TSRMLS_DC); - Result := FAILURE; - Exit; - end; - - if ht > 0 then - begin - for j := 0 to ht - 1 do - begin - if not IsParamTypeCorrect(M.Parameters[j].ParamType, Params[j]^) then - begin - zend_error(E_WARNING, PChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); - Result := FAILURE; - Exit; - end; - M.Parameters[j].ZendValue := (Params[j]^); - end; - end; // if ht > 0 - - - M.ZendVar.AsZendVariable := return_value; //direct access to zend variable - M.FOnExecute(Obj, M.Parameters, M.ReturnValue, M.FZendVar.AsZendVariable, this_ptr, TSRMLS_DC); - if M.ZendVar.ISNull then //perform variant conversion - variant2zval(M.ReturnValue, return_value); - - end; - end; - end; - dispose_pzval_array(Params); - - result := SUCCESS; -end; - -//PHP5 -function class_get_method(_object : pzval; method_name : pchar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; -var - fnc : pZendFunction; -begin - fnc := emalloc(sizeof(TZendFunction)); - FillChar(fnc^, sizeOf(TZendFunction), 0); - fnc^.internal_function._type := ZEND_OVERLOADED_FUNCTION; - fnc^.internal_function.function_name := estrndup(method_name, method_len); - fnc^.internal_function.handler := @class_call_method; - result := fnc; -end; - - -{$IFDEF PHP510} -procedure class_init_new(ht : integer; return_value : pzval; return_value_ptr : ppzval; - this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure class_init_new(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - AClassName : PChar; - len : integer; - Extension : TPHPExtension; - idp : pointer; - id : integer; - cnt : integer; -begin - if not Assigned(Application) then - Exit; - - AClassName := ''; - this_ptr^.value.obj.handlers.get_class_name(this_ptr, @AClassName, @len, 0, TSRMLS_DC); - - idp := ts_resource_ex(integer(app_globals_id), nil); - id := integer(idp^); - if id <= 0 then - Exit; - Extension := TPHPExtension(id); - for cnt := 0 to Extension.ComponentCount - 1 do - begin - if (Extension.Components[cnt] is TphpClass) then - begin - if SameText(AClassName, TphpClass(Extension.Components[cnt]).PHPClassName) then - begin - TPHPClass(Extension.Components[cnt]).ProduceInstance(this_ptr); - break; - end; - end; - end; - - -end; - -{$ENDIF} - - -procedure TPHPClass.ClassRegister(AModuleNumber : integer); -var - tsrmls : pointer; -begin - if not Assigned(Application) then - Exit; - - if not Application.Loading then - Exit; - - if (csDesigning in ComponentState) then - Exit; - - {$IFDEF PHP5} - RegisterClassHandlers; - {$ENDIF} - - if le_classresource = 0 then - le_classresource := zend_register_list_destructors_ex(@class_destructor_handler, nil, PChar(le_classresource_name), AModuleNumber); - - if (Application.GetPHPClass(FClassName) = nil) then - begin - tsrmls := ts_resource_ex(0, nil); - FillChar(FClassEntry, SizeOf(TZend_Class_Entry), #0); - - {$IFDEF PHP5} - FClassFunction[0].fname := PChar(FClassName); - FClassFunction[0].handler := @class_init_new; - INIT_CLASS_ENTRY(FClassEntry, PChar(FClassName) , @FClassFunction); - {$ELSE} - INIT_CLASS_ENTRY(FClassEntry, PChar(FClassName) , nil); - {$ENDIF} - - - FClassObject := zend_register_internal_class(@FClassEntry, tsrmls); - - {$IFDEF PHP4} - FClassObject.handle_property_get := @_class_get_property_wrapper; - FClassObject.handle_property_set := @class_set_property_handler; - FClassObject.handle_function_call := @class_call_function; - {$ENDIF} - - - Application.RegisterPHPClass(FClassName, FClassObject); - end; -end; - -constructor TPHPClass.Create(AOwner: TComponent); -begin - inherited; - if Assigned(Owner) then - begin - if ( not (AOwner is TCustomPHPExtension)) then - raise Exception.Create('TPHPClass component can be placed only on PHPExtension module'); - end; - FProperties := TClassProperties.Create(Self); - FMethods := TPHPClassMethods.Create(Self, TPHPClassMethod); -end; - -destructor TPHPClass.Destroy; -begin - FProperties.Free; - FMethods.Free; - inherited; -end; - -function TPHPClass.GetClassEntry: pzend_class_entry; -begin - Result := Application.GetPHPClass(FClassName); -end; - -function TPHPClass.InstanceConstructor(return_value : pzval): TPHPClassInstance; -var - CI : TphpClassInstance; - rn : integer; - tsrmls : pointer; -begin - Result := nil; - if not Assigned(Application) then - Exit; - tsrmls := ts_resource_ex(0, nil); - CI := TPHPClassInstance.Create(nil); - CI.FProperties.Assign(FProperties); - CI.FProducer := Self; - Result := CI; - rn := zend_register_resource(nil, CI, le_classresource); - FClassObject := GetClassEntry; - if not assigned(FClassObject) then - Exit; - {$IFDEF PHP4} - _object_init_ex(return_value, FClassObject, nil, 0, TSRMLS); - {$ELSE} - object_init(return_value, FClassObject, TSRMLS ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_resource_ex(return_value, 'instance', strlen('instance') +1, rn); - {$ELSE} - add_property_resource_ex(return_value, 'instance', strlen('instance') +1, rn, TSRMLS); - {$ENDIF} - - {$IFDEF PHP5} - return_value.value.obj.handlers := @ClassObjectHandlers; - {$ENDIF} - -end; - -procedure TPHPClass.Loaded; -begin - inherited; - if ( not (csDesigning in ComponentState)) then - begin - if Assigned(Application) then - ClassRegister(Application.ModuleNumber); - end; -end; - -procedure TPHPClass.ProduceInstance(AValue: pzval); -var - CI : TphpClassInstance; - rn : integer; - tsrmls : pointer; -begin - if not Assigned(Application) then - Exit; - tsrmls := ts_resource_ex(0, nil); - CI := TPHPClassInstance.Create(nil); - CI.FProperties.Assign(FProperties); - CI.FProducer := Self; - rn := zend_register_resource(nil, CI, le_classresource); - FClassObject := Application.GetPHPClass(FClassName); - if not assigned(FClassObject) then - Exit; - - {$IFDEF PHP4} - _object_init_ex(AValue, FClassObject, nil, 0, TSRMLS); - {$ELSE} - object_init(AValue, FClassObject, TSRMLS ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_resource_ex(AValue, 'instance', strlen('instance') +1, rn); - {$ELSE} - add_property_resource_ex(AValue, 'instance', strlen('instance') +1, rn, TSRMLS); - {$ENDIF} - - {$IFDEF PHP5} - AValue.value.obj.handlers := @ClassObjectHandlers; - {$ENDIF} - -end; - -procedure TPHPClass.SetClassName(const Value: string); -begin - FClassName := LowerCase(Value); -end; - -procedure TPHPClass.SetMethods(const Value: TPHPClassmethods); -begin - FMethods.Assign(Value); -end; - -procedure TphpClass.SetProperties(const Value: TClassProperties); -begin - FProperties.Assign(Value); -end; - -{ TPHPClassInstance } - -constructor TPHPClassInstance.Create; -begin - inherited; - FProperties := TClassProperties.Create(Self); -end; - -destructor TPHPClassInstance.Destroy; -begin - FProperties.Free; - inherited; -end; - - -procedure TPHPClassInstance.SetProperties(const Value: TClassProperties); -begin - FProperties.Assign(Value); -end; - - -{ TClassProperty } - -procedure TClassProperty.Assign(Source: TPersistent); -begin - if (Source is TClassProperty) then - begin - FName := TClassProperty(Source).Name; - FValue := TClassProperty(Source).Value; - end - else - inherited; -end; - -function TClassProperty.GetAsBoolean: boolean; -begin - if FValue = '' then - begin - Result := false; - Exit; - end; - - if SameText(FValue, 'True') then - Result := true - else - Result := false; -end; - -function TClassProperty.GetAsFloat: double; -begin - if FValue = '' then - begin - Result := 0; - Exit; - end; - - Result := ValueToFloat(FValue); -end; - -function TClassProperty.GetAsInteger: integer; -var - c : char; -begin - c := DecimalSeparator; - DecimalSeparator := '.'; - Result := Round(ValueToFloat(FValue)); - DecimalSeparator := c; -end; - -function TClassProperty.GetDisplayName: string; -begin - if FName = '' then - result := inherited GetDisplayName - else - Result := FName; -end; - -procedure TClassProperty.SetAsBoolean(const Value: boolean); -begin - if Value then - FValue := 'True' - else - FValue := 'False'; -end; - -procedure TClassProperty.SetAsFloat(const Value: double); -begin - FValue := FloatToValue(Value); -end; - -procedure TClassProperty.SetAsInteger(const Value: integer); -var - c : char; -begin - c := DecimalSeparator; - DecimalSeparator := '.'; - FValue := IntToStr(Value); - DecimalSeparator := c; -end; - - -{ TClassProperties } -function TClassProperties.Add: TClassProperty; -begin - result := TClassProperty(inherited Add); -end; - -constructor TClassProperties.Create(AOwner: TComponent); -begin - inherited create(TClassProperty); - FOwner := AOwner; -end; - -function TClassProperties.GetItem(Index: Integer): TClassProperty; -begin - Result := TClassProperty(inherited GetItem(Index)); -end; - -procedure TClassProperties.SetItem(Index: Integer; const Value: TClassProperty); -begin - inherited SetItem(Index, Value) -end; - -function TClassProperties.GetOwner : TPersistent; -begin - Result := FOwner; -end; - -function TClassProperties.GetVariables: string; -var i : integer; -begin - for i := 0 to Count - 1 do - begin - Result := Result + Items[i].FName + '=' + Items[i].FValue; - if i < Count - 1 then - Result := Result + '&'; - end; -end; - -function TClassProperties.IndexOf(AName: string): integer; -var - i : integer; -begin - Result := -1; - for i := 0 to Count - 1 do - begin - if SameText(Items[i].Name, AName) then - begin - Result := i; - break; - end; - end; -end; - - -function TClassProperties.ByName(AName: string): TClassProperty; -var - i : integer; -begin - Result := nil; - for i := 0 to Count - 1 do - begin - if SameText(Items[i].Name, AName) then - begin - Result := Items[i]; - break; - end; - end; -end; - -{ TPHPClassMethods } - -function TPHPClassMethods.Add: TPHPClassMethod; -begin - Result := TPHPClassMethod(inherited Add); -end; - -function TPHPClassMethods.ByName(AName: string): TPHPClassMethod; -var - i : integer; -begin - Result := nil; - for i := 0 to Count - 1 do - begin - if SameText(Items[i].Name, AName) then - begin - Result := Items[i]; - break; - end; - end; -end; - -constructor TPHPClassMethods.Create(Owner: TPersistent; - ItemClass: TCollectionItemClass); -begin - inherited Create(ItemClass); - FOwner := Owner; -end; - -function TPHPClassMethods.GetItem(Index: Integer): TPHPClassMethod; -begin - Result := TPHPClassMethod(inherited GetItem(Index)); -end; - -function TPHPClassMethods.GetOwner: TPersistent; -begin - Result := FOwner; -end; - -procedure TPHPClassMethods.SetItem(Index: Integer; Value: TPHPClassMethod); -begin - inherited SetItem(Index, TCollectionItem(Value)); -end; - -procedure TPHPClassMethods.SetItemName(Item: TCollectionItem); -var - I, J: Integer; - ItemName: string; - CurItem: TPHPClassMethod; -begin - J := 1; - while True do - begin - ItemName := Format('classmethod%d', [J]); - I := 0; - while I < Count do - begin - CurItem := Items[I] as TPHPClassMethod; - if (CurItem <> Item) and (CompareText(CurItem.Name, ItemName) = 0) then - begin - Inc(J); - Break; - end; - Inc(I); - end; - if I >= Count then - begin - (Item as TPHPClassMethod).Name := ItemName; - Break; - end; - end; -end; - -{ TPHPClassMethod } - -procedure TPHPClassMethod.AssignTo(Dest: TPersistent); -begin - if Dest is TPHPClassMethod then - begin - if Assigned(Collection) then Collection.BeginUpdate; - try - with TPHPClassMethod(Dest) do - begin - Tag := Self.Tag; - Name := Self.Name; - end; - finally - if Assigned(Collection) then Collection.EndUpdate; - end; - end else inherited AssignTo(Dest); -end; - -constructor TPHPClassMethod.Create(Collection: TCollection); -begin - inherited; - FFunctionParams := TFunctionParams.Create(TPHPClassMethods(Self.Collection).GetOwner, TFunctionParam); - FZendVar := TZendVariable.Create; -end; - -destructor TPHPClassMethod.Destroy; -begin - FFunctionParams.Free; - FZendVar.Free; - inherited; -end; - -function TPHPClassMethod.GetDisplayName: string; -begin - if FName = '' then - result := inherited GetDisplayName else - Result := FName; -end; - -procedure TPHPClassMethod.SetDisplayName(const Value: string); -var - I: Integer; - F: TPHPClassMethod; -begin - if AnsiCompareText(Value, FName) <> 0 then - begin - if Collection <> nil then - for I := 0 to Collection.Count - 1 do - begin - F := TPHPClassMethods(Collection).Items[I]; - if (F <> Self) and (F is TPHPClassMethod) and - (AnsiCompareText(Value, F.Name) = 0) then - raise Exception.Create('Duplicate method name'); - end; - FName := LowerCase(Value); - Changed(False); - end; -end; - -procedure TPHPClassMethod.SetFunctionParams(const Value: TFunctionParams); -begin - FFunctionParams.Assign(Value); -end; - - -{$IFDEF PHP5} -procedure RegisterClassHandlers; -begin - Move(zend_get_std_object_handlers()^, ClassObjectHandlers, sizeof(zend_object_handlers)); - ClassObjectHandlers.read_property := @class_get_property_handler; - ClassObjecthandlers.write_property := @class_set_property_handler; - ClassObjectHandlers.call_method := @class_call_method; - ClassObjectHandlers.get_method := @class_get_method; -end; -{$ENDIF} - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP classes support } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} +{$I PHP.INC} + +{ $Id: phpClass.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit phpClass; + +interface + +uses + Windows, SysUtils, Classes, PHPCommon, + ZendTypes, ZendAPI, phpTypes, PHPAPI, + phpFunctions; + +type + // Instance of the class + TPHPClassInstance = class; + + //Execute method + TClassMethodExecute = procedure (Sender : TPHPClassInstance; Parameters : TFunctionParams; + var ReturnValue : variant; ZendValue : pzval; this_ptr : pzval; TSRMLS_DC : pointer) of object; + + //Property + TClassProperty = class(TCollectionItem) + private + FName : AnsiString; + FValue : AnsiString; + function GetAsBoolean: boolean; + function GetAsFloat: double; + function GetAsInteger: integer; + procedure SetAsBoolean(const Value: boolean); + procedure SetAsFloat(const Value: double); + procedure SetAsInteger(const Value: integer); + protected + function GetDisplayName : string; override; + public + procedure Assign(Source : TPersistent); override; + property AsInteger : integer read GetAsInteger write SetAsInteger; + property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; + property AsString : AnsiString read FValue write FValue; + property AsFloat : double read GetAsFloat write SetAsFloat; + published + property Name : AnsiString read FName write FName; + property Value : AnsiString read FValue write FValue; + end; + + //Collection of the class properties + TClassProperties = class(TCollection) + private + FOwner : TComponent; + procedure SetItem(Index: Integer; const Value: TClassProperty); + function GetItem(Index: Integer): TClassProperty; + protected + function GetOwner : TPersistent; override; + public + function Add: TClassProperty; + constructor Create(AOwner: TComponent); + function GetVariables : AnsiString; + function IndexOf(AName : AnsiString) : integer; + function ByName(AName : AnsiString) : TClassProperty; + property Items[Index: Integer]: TClassProperty read GetItem write SetItem; default; + end; + + //The method of the class + TPHPClassMethod = class(TCollectionItem) + private + FOnExecute : TClassMethodExecute; + FName: AnsiString; + FTag : integer; + FFunctionParams: TFunctionParams; + FZendVar : TZendVariable; + procedure SetFunctionParams(const Value: TFunctionParams); + procedure _SetDisplayName(value : AnsiString); + public + ReturnValue : variant; + constructor Create(Collection : TCollection); override; + destructor Destroy; override; + function GetDisplayName: string; override; + procedure SetDisplayName(const Value: string); override; + procedure AssignTo(Dest: TPersistent); override; + property ZendVar: TZendVariable read FZendVar; + published + property Name : AnsiString read FName write _SetDisplayName; + property Tag : integer read FTag write FTag; + property Parameters: TFunctionParams read FFunctionParams write SetFunctionParams; + property OnExecute : TClassMethodExecute read FOnExecute write FOnExecute; + end; + + //Collection of the class methods + TPHPClassMethods = class(TCollection) + private + FOwner: TPersistent; + function GetItem(Index: Integer): TPHPClassMethod; + procedure SetItem(Index: Integer; Value: TPHPClassMethod); + protected + function GetOwner: TPersistent; override; + procedure SetItemName(Item: TCollectionItem); override; + public + constructor Create(Owner: TPersistent; ItemClass: TCollectionItemClass); + function Add : TPHPClassMethod; + function ByName(AName : AnsiString) : TPHPClassMethod; + property Items[Index: Integer]: TPHPClassMethod read GetItem write SetItem; default; + end; + + //Represents PHP class + TPHPClass = class(TPHPComponent) + private + FProperties : TClassProperties; + FMethods : TPHPClassMethods; + FClassObject: pzend_class_entry; + FClassName : AnsiString; + FClassEntry : tzend_class_entry; + {$IFDEF PHP5} + FClassFunction : array[0..1] of zend_function_entry; + {$ENDIF} + procedure SetProperties(const Value: TClassProperties); + procedure SetMethods(const Value : TPHPClassMethods); + procedure SetClassName(const Value: AnsiString); + protected + function GetClassEntry : pzend_class_entry; virtual; + procedure Loaded; override; + function InstanceConstructor(return_value : pzval) : TPHPClassInstance; + property ZendClassObject : pzend_class_entry read FClassObject write FClassObject; + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + procedure ClassRegister(AModuleNumber : integer); virtual; + procedure ProduceInstance(AValue : pzval); virtual; + published + property Properties : TClassProperties read FProperties write SetProperties; + property Methods : TPHPClassMethods read FMethods write SetMethods; + property PHPClassName : AnsiString read FClassName write SetClassName; + end; + + + TPHPClassInstance = class(TComponent) + private + FProperties : TClassProperties; + FProducer : TPHPClass; + procedure SetProperties(const Value: TClassProperties); + protected + property Producer : TPHPClass read FProducer; + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + property Properties : TClassProperties read FProperties write SetProperties; + end; + + +{$IFDEF PHP5} +procedure RegisterClassHandlers; +{$ENDIF} + +implementation + +uses + phpModules; + +var + le_classresource : integer = 0; + + {$IFDEF PHP5} + ClassObjectHandlers : zend_object_handlers; + {$ENDIF} + +const + {$IFDEF PHP4} + le_classresource_name = 'TPHPCLASS4'; + {$ELSE} + le_classresource_name = 'TPHPCLASS5'; + {$ENDIF} + +procedure class_destructor_handler(rsrc : PZend_rsrc_list_entry; TSRMLS_D : pointer); cdecl; +var + resource : TPHPClassInstance; +begin + if rsrc = nil then + Exit; + resource := rsrc^.ptr; + if Assigned(Resource) then + try + resource.free; + except + end; +end; + +{ TphpClass } + + +//when object created from script using "new" +function class_call_constructor(AClassName : AnsiString; return_value : pzval) : TPHPClassInstance; +var + Extension : TPHPExtension; + idp : pointer; + id : integer; + cnt : integer; +begin + Result := nil; + idp := ts_resource_ex(integer(app_globals_id), nil); + id := integer(idp^); + if id <= 0 then + Exit; + Extension := TPHPExtension(id); + for cnt := 0 to Extension.ComponentCount - 1 do + begin + if (Extension.Components[cnt] is TphpClass) then + begin + if SameText(AClassName, TphpClass(Extension.Components[cnt]).PHPClassName) then + begin + Result := TPHPClass(Extension.Components[cnt]).InstanceConstructor(return_value); + break; + end; + end; + end; +end; + +{$IFDEF PHP4} + +//PHP4 +function class_set_property_handler(property_reference : Pzend_property_reference; value : pzval) : integer; cdecl; +var + this_ptr : pzval; + OBJ : TPHPClassInstance; + data: ^ppzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + p : pointer; + propname : AnsiString; + tsrmls : pointer; + param : TClassProperty; +begin + tsrmls := ts_resource_ex(0, nil); + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + + this_ptr := property_reference^._object; + new(data); + if zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) = SUCCESS then + Obj := zend_fetch_resource(data^, TSRMLS, -1, 'class resource', nil, 1, le_classresource) + else + OBJ := nil; + freemem(data); + if Assigned(Obj) then + begin + convert_to_string(value); + param := Obj.Properties.ByName(propname); + if Assigned(param) then + param.Value := value.value.str.val; + end; + Result := SUCCESS; +end; + + + +//PHP4 +procedure class_call_function(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; +var + OBJ : TPHPClassInstance; + Producer : TPHPClass; + M : TPHPClassMethod; + data: ^ppzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + p : pointer; + MethodName : AnsiString; + Params : pzval_array; + j : integer; +begin + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + MethodName := prop^.element.value.str.val; + this_ptr := property_reference^._object; + new(data); + if (zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) = SUCCESS) then + Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) + else + Obj := nil; + freemem(data); + + if not Assigned(Obj) then + begin + //not assigned obj = new instance (constructor) + class_call_constructor(MethodName, this_ptr); + exit; + end; + + if ht > 0 then + begin + if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + end; + + + Producer := Obj.Producer; + if Assigned(Producer) then + begin + M := Producer.Methods.ByName(MethodName); + if Assigned(M) then + begin + if Assigned(M.FOnExecute) then + begin + if M.Parameters.Count <> ht then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + if ht > 0 then + begin + for j := 0 to ht - 1 do + begin + if not IsParamTypeCorrect(M.Parameters[j].ParamType, Params[j]^) then + begin + zend_error(E_WARNING, PAnsiChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); + Exit; + end; + M.Parameters[j].Value := zval2variant(Params[j]^^); + end; + end; // if ht > 0 + + + M.ZendVar.AsZendVariable := return_value; //direct access to zend variable + M.FOnExecute(Obj, M.Parameters, M.ReturnValue, M.FZendVar.AsZendVariable, this_ptr, TSRMLS_DC); + if M.ZendVar.ISNull then //perform variant conversion + variant2zval(M.ReturnValue, return_value); + + end; + end; + end; + dispose_pzval_array(Params); +end; + + +//PHP4 +procedure class_get_property_handler(val : pzval; property_reference : PZend_property_reference); cdecl; +var + this_ptr : pzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + obj : TPHPClassInstance; + p : pointer; + propname : AnsiString; + tsrmls : pointer; + data: ^ppzval; + param : TClassProperty; +begin + tsrmls := ts_resource_ex(0, nil); + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + this_ptr := property_reference^._object; + new(data); + if ( zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) <> SUCCESS) then + Obj := nil + else + Obj := zend_fetch_resource(data^, TSRMLS, -1, 'class resource', nil, 1, le_classresource); + freemem(data); + if Assigned(Obj) then + begin + param := Obj.Properties.ByName(propname); + if Assigned(param) then + ZVAL_STRING(val, PAnsiChar(param.value), true) + else + ZVAL_EMPTY_STRING(val) + end + else + ZVAL_STRING(val, 'undefined', true); +end; + +//PHP4 +procedure _class_get_property_wrapper; assembler; +asm + push ebp + mov ebp,esp + sub esp,50h + push ebx + push esi + push edi + lea edi,[ebp-50h] + mov ecx,14h + mov eax,0CCCCCCCCh + rep stosd + mov eax,dword ptr [ebp+0Ch] + push eax + lea ecx,[ebp-10h] + push ecx + call class_get_property_handler + add esp,8 + mov edx,dword ptr [ebp+8] + mov eax,dword ptr [ebp-10h] + mov dword ptr [edx],eax + mov ecx,dword ptr [ebp-0Ch] + mov dword ptr [edx+4],ecx + mov eax,dword ptr [ebp-8] + mov dword ptr [edx+8],eax + mov ecx,dword ptr [ebp-4] + mov dword ptr [edx+0Ch],ecx + mov eax,dword ptr [ebp+8] + + pop edi + pop esi + pop ebx + add esp,50h + cmp ebp,esp + mov esp,ebp + pop ebp + ret +end; +{$ENDIF} + + + + +{$IFDEF PHP5} + +// Read object property value (getter) +//PHP5 +function class_get_property_handler(_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; +var + retval : pzval; + obj : TPHPClassInstance; + data: ^ppzval; + propname : AnsiString; + object_properties : PHashTable; + param : TClassProperty; +begin + retval := emalloc(sizeof(zval)); + ZeroMemory(retval, sizeof(zval)); + propname := member^.value.str.val; + new(data); + try + object_properties := Z_OBJPROP(_object); + if zend_hash_find(object_properties, 'instance', strlen('instance') + 1, data) = SUCCESS then + Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) + else + Obj := nil; + finally + freemem(data); + end; + + if Assigned(Obj) then + begin + param := Obj.Properties.ByName(propname); + if Assigned(param) then + ZVAL_STRING(retval, PAnsiChar(param.value), true) + else + ZVAL_EMPTY_STRING(retval); + end + else + ZVAL_STRING(retval, 'undefined', true); + + retval.refcount := 1; + Result := retval; +end; + +// Write object property value (setter) +//PHP5 +procedure class_set_property_handler(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; +var + OBJ : TPHPClassInstance; + data: ^ppzval; + propname : AnsiString; + object_properties : PHashTable; + param : TClassProperty; +begin + propname := member^.value.str.val; + new(data); + try + object_properties := Z_OBJPROP(_object); + if zend_hash_find(object_properties, 'instance', strlen('instance') + 1, data) = SUCCESS then + Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) + else + Obj := nil; + finally + freemem(data); + end; + + if Assigned(Obj) then + begin + convert_to_string(value); + param := Obj.Properties.ByName(propname); + if Assigned(param) then + param.Value := value.value.str.val; + end; + +end; + +{$IFDEF PHP510} +function class_call_method(method : PAnsiChar; ht : integer; return_value : pzval; return_value_ptr : ppzval; + this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; +{$ELSE} +function class_call_method(method : PAnsiChar; ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; +{$ENDIF} +var + OBJ : TPHPClassInstance; + data: ^ppzval; + Params : pzval_array; + Producer : TPHPClass; + M : TPHPClassMethod; + j : integer; +begin + new(data); + if zend_hash_find(this_ptr^.value.obj.handlers.get_properties(this_ptr, TSRMLS_DC), 'instance', strlen('instance') + 1, data) = SUCCESS then + Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) + else + Obj := nil; + freemem(data); + + if not Assigned(Obj) then + begin + //not assigned obj = new instance (constructor) + class_call_constructor(Method, this_ptr); + Result := SUCCESS; + exit; + end; + + if ht > 0 then + begin + if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Result := FAILURE; + Exit; + end; + end; + + + Producer := Obj.Producer; + if Assigned(Producer) then + begin + M := Producer.Methods.ByName(Method); + if Assigned(M) then + begin + if Assigned(M.FOnExecute) then + begin + if M.Parameters.Count <> ht then + begin + zend_wrong_param_count(TSRMLS_DC); + Result := FAILURE; + Exit; + end; + + if ht > 0 then + begin + for j := 0 to ht - 1 do + begin + if not IsParamTypeCorrect(M.Parameters[j].ParamType, Params[j]^) then + begin + zend_error(E_WARNING, PAnsiChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); + Result := FAILURE; + Exit; + end; + M.Parameters[j].ZendValue := (Params[j]^); + end; + end; // if ht > 0 + + + M.ZendVar.AsZendVariable := return_value; //direct access to zend variable + M.FOnExecute(Obj, M.Parameters, M.ReturnValue, M.FZendVar.AsZendVariable, this_ptr, TSRMLS_DC); + if M.ZendVar.ISNull then //perform variant conversion + variant2zval(M.ReturnValue, return_value); + + end; + end; + end; + dispose_pzval_array(Params); + + result := SUCCESS; +end; + +//PHP5 +function class_get_method(_object : pzval; method_name : PAnsiChar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; +var + fnc : pZendFunction; +begin + fnc := emalloc(sizeof(TZendFunction)); + + ZeroMemory(fnc, sizeOf(TZendFunction)); + + fnc^.internal_function._type := ZEND_OVERLOADED_FUNCTION; + + {$IFNDEF COMPILER_VC9} + fnc^.internal_function.function_name := strdup(method_name); + {$ELSE} + fnc^.internal_function.function_name := DupStr(method_name); + {$ENDIF} + + fnc^.internal_function.handler := @class_call_method; + result := fnc; +end; + + +{$IFDEF PHP510} +procedure class_init_new(ht : integer; return_value : pzval; return_value_ptr : ppzval; + this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure class_init_new(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + AClassName : PAnsiChar; + len : integer; + Extension : TPHPExtension; + idp : pointer; + id : integer; + cnt : integer; +begin + if not Assigned(Application) then + Exit; + + AClassName := ''; + this_ptr^.value.obj.handlers.get_class_name(this_ptr, @AClassName, @len, 0, TSRMLS_DC); + + idp := ts_resource_ex(integer(app_globals_id), nil); + id := integer(idp^); + if id <= 0 then + Exit; + Extension := TPHPExtension(id); + for cnt := 0 to Extension.ComponentCount - 1 do + begin + if (Extension.Components[cnt] is TphpClass) then + begin + if SameText(AClassName, TphpClass(Extension.Components[cnt]).PHPClassName) then + begin + TPHPClass(Extension.Components[cnt]).ProduceInstance(this_ptr); + break; + end; + end; + end; + + +end; + +{$ENDIF} + + +procedure TPHPClass.ClassRegister(AModuleNumber : integer); +var + tsrmls : pointer; +begin + if not Assigned(Application) then + Exit; + + if not Application.Loading then + Exit; + + if (csDesigning in ComponentState) then + Exit; + + {$IFDEF PHP5} + RegisterClassHandlers; + {$ENDIF} + + if le_classresource = 0 then + le_classresource := zend_register_list_destructors_ex(@class_destructor_handler, nil, PAnsiChar(le_classresource_name), AModuleNumber); + + if (Application.GetPHPClass(FClassName) = nil) then + begin + tsrmls := ts_resource_ex(0, nil); + + ZeroMemory(@FClassEntry, SizeOf(TZend_Class_Entry)); + + {$IFDEF PHP5} + FClassFunction[0].fname := PAnsiChar(FClassName); + FClassFunction[0].handler := @class_init_new; + INIT_CLASS_ENTRY(FClassEntry, PAnsiChar(FClassName) , @FClassFunction); + {$ELSE} + INIT_CLASS_ENTRY(FClassEntry, PAnsiChar(FClassName) , nil); + {$ENDIF} + + + FClassObject := zend_register_internal_class(@FClassEntry, tsrmls); + + {$IFDEF PHP4} + FClassObject.handle_property_get := @_class_get_property_wrapper; + FClassObject.handle_property_set := @class_set_property_handler; + FClassObject.handle_function_call := @class_call_function; + {$ENDIF} + + + Application.RegisterPHPClass(FClassName, FClassObject); + end; +end; + +constructor TPHPClass.Create(AOwner: TComponent); +begin + inherited; + if Assigned(Owner) then + begin + if ( not (AOwner is TCustomPHPExtension)) then + raise Exception.Create('TPHPClass component can be placed only on PHPExtension module'); + end; + FProperties := TClassProperties.Create(Self); + FMethods := TPHPClassMethods.Create(Self, TPHPClassMethod); +end; + +destructor TPHPClass.Destroy; +begin + FProperties.Free; + FMethods.Free; + inherited; +end; + +function TPHPClass.GetClassEntry: pzend_class_entry; +begin + Result := Application.GetPHPClass(FClassName); +end; + +function TPHPClass.InstanceConstructor(return_value : pzval): TPHPClassInstance; +var + CI : TphpClassInstance; + rn : integer; + tsrmls : pointer; +begin + Result := nil; + if not Assigned(Application) then + Exit; + tsrmls := ts_resource_ex(0, nil); + CI := TPHPClassInstance.Create(nil); + CI.FProperties.Assign(FProperties); + CI.FProducer := Self; + Result := CI; + rn := zend_register_resource(nil, CI, le_classresource); + FClassObject := GetClassEntry; + if not assigned(FClassObject) then + Exit; + {$IFDEF PHP4} + _object_init_ex(return_value, FClassObject, nil, 0, TSRMLS); + {$ELSE} + object_init(return_value, FClassObject, TSRMLS ); + {$ENDIF} + + {$IFDEF PHP4} + add_property_resource_ex(return_value, 'instance', strlen('instance') +1, rn); + {$ELSE} + add_property_resource_ex(return_value, 'instance', strlen('instance') +1, rn, TSRMLS); + {$ENDIF} + + {$IFDEF PHP5} + return_value.value.obj.handlers := @ClassObjectHandlers; + {$ENDIF} + +end; + +procedure TPHPClass.Loaded; +begin + inherited; + if ( not (csDesigning in ComponentState)) then + begin + if Assigned(Application) then + ClassRegister(Application.ModuleNumber); + end; +end; + +procedure TPHPClass.ProduceInstance(AValue: pzval); +var + CI : TphpClassInstance; + rn : integer; + tsrmls : pointer; +begin + if not Assigned(Application) then + Exit; + tsrmls := ts_resource_ex(0, nil); + CI := TPHPClassInstance.Create(nil); + CI.FProperties.Assign(FProperties); + CI.FProducer := Self; + rn := zend_register_resource(nil, CI, le_classresource); + FClassObject := Application.GetPHPClass(FClassName); + if not assigned(FClassObject) then + Exit; + + {$IFDEF PHP4} + _object_init_ex(AValue, FClassObject, nil, 0, TSRMLS); + {$ELSE} + object_init(AValue, FClassObject, TSRMLS ); + {$ENDIF} + + {$IFDEF PHP4} + add_property_resource_ex(AValue, 'instance', strlen('instance') +1, rn); + {$ELSE} + add_property_resource_ex(AValue, 'instance', strlen('instance') +1, rn, TSRMLS); + {$ENDIF} + + {$IFDEF PHP5} + AValue.value.obj.handlers := @ClassObjectHandlers; + {$ENDIF} + +end; + +procedure TPHPClass.SetClassName(const Value: AnsiString); +begin + FClassName := LowerCase(Value); +end; + +procedure TPHPClass.SetMethods(const Value: TPHPClassmethods); +begin + FMethods.Assign(Value); +end; + +procedure TphpClass.SetProperties(const Value: TClassProperties); +begin + FProperties.Assign(Value); +end; + +{ TPHPClassInstance } + +constructor TPHPClassInstance.Create; +begin + inherited; + FProperties := TClassProperties.Create(Self); +end; + +destructor TPHPClassInstance.Destroy; +begin + FProperties.Free; + inherited; +end; + + +procedure TPHPClassInstance.SetProperties(const Value: TClassProperties); +begin + FProperties.Assign(Value); +end; + + +{ TClassProperty } + +procedure TClassProperty.Assign(Source: TPersistent); +begin + if (Source is TClassProperty) then + begin + FName := TClassProperty(Source).Name; + FValue := TClassProperty(Source).Value; + end + else + inherited; +end; + +function TClassProperty.GetAsBoolean: boolean; +begin + if FValue = '' then + begin + Result := false; + Exit; + end; + + if SameText(FValue, 'True') then + Result := true + else + Result := false; +end; + +function TClassProperty.GetAsFloat: double; +begin + if FValue = '' then + begin + Result := 0; + Exit; + end; + + Result := ValueToFloat(FValue); +end; + +function TClassProperty.GetAsInteger: integer; +var + {$IFDEF VERSION12} + c : WideChar; + {$ELSE} + c : AnsiChar; + {$ENDIF} +begin + c := FormatSettings.DecimalSeparator; + try + FormatSettings.DecimalSeparator := '.'; + Result := Round(ValueToFloat(FValue)); + finally + FormatSettings.DecimalSeparator := c; + end; +end; + +function TClassProperty.GetDisplayName: string; +begin + if FName = '' then + result := inherited GetDisplayName + else + Result := FName; +end; + +procedure TClassProperty.SetAsBoolean(const Value: boolean); +begin + if Value then + FValue := 'True' + else + FValue := 'False'; +end; + +procedure TClassProperty.SetAsFloat(const Value: double); +begin + FValue := FloatToValue(Value); +end; + +procedure TClassProperty.SetAsInteger(const Value: integer); +var + {$IFDEF VERSION12} + c : WideChar; + {$ELSE} + c : AnsiChar; + {$ENDIF} +begin + c := FormatSettings.DecimalSeparator; + try + FormatSettings.DecimalSeparator := '.'; + FValue := IntToStr(Value); + finally + FormatSettings.DecimalSeparator := c; + end; +end; + + +{ TClassProperties } +function TClassProperties.Add: TClassProperty; +begin + result := TClassProperty(inherited Add); +end; + +constructor TClassProperties.Create(AOwner: TComponent); +begin + inherited create(TClassProperty); + FOwner := AOwner; +end; + +function TClassProperties.GetItem(Index: Integer): TClassProperty; +begin + Result := TClassProperty(inherited GetItem(Index)); +end; + +procedure TClassProperties.SetItem(Index: Integer; const Value: TClassProperty); +begin + inherited SetItem(Index, Value) +end; + +function TClassProperties.GetOwner : TPersistent; +begin + Result := FOwner; +end; + +function TClassProperties.GetVariables: AnsiString; +var i : integer; +begin + for i := 0 to Count - 1 do + begin + Result := Result + Items[i].FName + '=' + Items[i].FValue; + if i < Count - 1 then + Result := Result + '&'; + end; +end; + +function TClassProperties.IndexOf(AName: AnsiString): integer; +var + i : integer; +begin + Result := -1; + for i := 0 to Count - 1 do + begin + if SameText(Items[i].Name, AName) then + begin + Result := i; + break; + end; + end; +end; + + +function TClassProperties.ByName(AName: AnsiString): TClassProperty; +var + i : integer; +begin + Result := nil; + for i := 0 to Count - 1 do + begin + if SameText(Items[i].Name, AName) then + begin + Result := Items[i]; + break; + end; + end; +end; + +{ TPHPClassMethods } + +function TPHPClassMethods.Add: TPHPClassMethod; +begin + Result := TPHPClassMethod(inherited Add); +end; + +function TPHPClassMethods.ByName(AName: AnsiString): TPHPClassMethod; +var + i : integer; +begin + Result := nil; + for i := 0 to Count - 1 do + begin + if SameText(Items[i].Name, AName) then + begin + Result := Items[i]; + break; + end; + end; +end; + +constructor TPHPClassMethods.Create(Owner: TPersistent; + ItemClass: TCollectionItemClass); +begin + inherited Create(ItemClass); + FOwner := Owner; +end; + +function TPHPClassMethods.GetItem(Index: Integer): TPHPClassMethod; +begin + Result := TPHPClassMethod(inherited GetItem(Index)); +end; + +function TPHPClassMethods.GetOwner: TPersistent; +begin + Result := FOwner; +end; + +procedure TPHPClassMethods.SetItem(Index: Integer; Value: TPHPClassMethod); +begin + inherited SetItem(Index, TCollectionItem(Value)); +end; + +procedure TPHPClassMethods.SetItemName(Item: TCollectionItem); +var + I, J: Integer; + ItemName: string; + CurItem: TPHPClassMethod; +begin + J := 1; + while True do + begin + ItemName := Format('classmethod%d', [J]); + I := 0; + while I < Count do + begin + CurItem := Items[I] as TPHPClassMethod; + if (CurItem <> Item) and (CompareText(CurItem.Name, ItemName) = 0) then + begin + Inc(J); + Break; + end; + Inc(I); + end; + if I >= Count then + begin + (Item as TPHPClassMethod).Name := ItemName; + Break; + end; + end; +end; + +{ TPHPClassMethod } + +procedure TPHPClassMethod.AssignTo(Dest: TPersistent); +begin + if Dest is TPHPClassMethod then + begin + if Assigned(Collection) then Collection.BeginUpdate; + try + with TPHPClassMethod(Dest) do + begin + Tag := Self.Tag; + Name := Self.Name; + end; + finally + if Assigned(Collection) then Collection.EndUpdate; + end; + end else inherited AssignTo(Dest); +end; + +constructor TPHPClassMethod.Create(Collection: TCollection); +begin + inherited; + FFunctionParams := TFunctionParams.Create(TPHPClassMethods(Self.Collection).GetOwner, TFunctionParam); + FZendVar := TZendVariable.Create; +end; + +destructor TPHPClassMethod.Destroy; +begin + FFunctionParams.Free; + FZendVar.Free; + inherited; +end; + +function TPHPClassMethod.GetDisplayName: string; +begin + if FName = '' then + result := inherited GetDisplayName else + Result := FName; +end; + +procedure TPHPClassMethod.SetDisplayName(const Value: string); +var + I: Integer; + F: TPHPClassMethod; +begin + if AnsiCompareText(Value, FName) <> 0 then + begin + if Collection <> nil then + for I := 0 to Collection.Count - 1 do + begin + F := TPHPClassMethods(Collection).Items[I]; + if (F <> Self) and (F is TPHPClassMethod) and + (AnsiCompareText(Value, F.Name) = 0) then + raise Exception.Create('Duplicate method name'); + end; + FName := LowerCase(Value); + Changed(False); + end; +end; + +procedure TPHPClassMethod._SetDisplayName(Value: AnsiString); +var + NewName : string; +begin + NewName := value; + SetDisplayName(NewName); +end; + +procedure TPHPClassMethod.SetFunctionParams(const Value: TFunctionParams); +begin + FFunctionParams.Assign(Value); +end; + + +{$IFDEF PHP5} +procedure RegisterClassHandlers; +begin + Move(zend_get_std_object_handlers()^, ClassObjectHandlers, sizeof(zend_object_handlers)); + ClassObjectHandlers.read_property := @class_get_property_handler; + ClassObjecthandlers.write_property := @class_set_property_handler; + ClassObjectHandlers.call_method := @class_call_method; + ClassObjectHandlers.get_method := @class_get_method; +end; +{$ENDIF} + +end. diff --git a/phpCustomLibrary.pas b/phpCustomLibrary.pas index 4e51716..26d767e 100644 --- a/phpCustomLibrary.pas +++ b/phpCustomLibrary.pas @@ -1,196 +1,177 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpCustomLibrary.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit PHPCustomLibrary; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - PHPCommon, - ZendTypes, PHPTypes, PHPAPI, ZENDAPI, php4Delphi, phpFunctions; - -type - - TCustomPHPLibrary = class(TPHPComponent) - private - FExecutor : TpsvCustomPHP; - FLibraryName : string; - FFunctions : TPHPFunctions; - FActiveFunctionName : string; - module_entry_table : array of zend_function_entry; - procedure SetFunctions(const Value : TPHPFunctions); - procedure SetExecutor(AValue : TpsvCustomPHP); - procedure SetLibraryName(AValue : string); - protected - php_delphi_module : Tzend_module_entry; - procedure Notification(AComponent: TComponent; Operation: TOperation); override; - procedure RegisterLibrary; virtual; - procedure UnregisterLibrary; virtual; - procedure Loaded; override; - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - procedure Refresh; virtual; - property LibraryEntry : Tzend_module_entry read php_delphi_module; - property Executor : TpsvCustomPHP read FExecutor write SetExecutor; - property LibraryName : string read FLibraryName write SetLibraryName; - property Functions : TPHPFunctions read FFunctions write SetFunctions; - property ActiveFunctionName: string read FActiveFunctionName write FActiveFunctionName; - published - end; - - -implementation - -{$IFDEF PHP510} -procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - php : TpsvCustomPHP; - gl : psapi_globals_struct; - p : pointer; -begin - ZVAL_NULL(return_value); - p := ts_resource_ex(0, nil); - gl := GetSAPIGlobals(p); - php := TpsvPHP(gl^.server_context); - if Assigned(php) then - begin - try - {$IFNDEF PHP510} - IPHPLibrary(php).HandleRequest(ht, return_value, this_ptr, return_value_used, TSRMLS_DC); - {$ELSE} - IPHPLibrary(php).HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); - {$ENDIF} - except - ZVAL_NULL(return_value); - end; - end; -end; - -{ TCustomPHPLibrary } - -constructor TCustomPHPLibrary.Create(AOwner: TComponent); -begin - inherited; - FFunctions := TPHPFunctions.Create(Self, TPHPFunction); - php_delphi_module.size := sizeOf(Tzend_module_entry); - php_delphi_module.zend_api := ZEND_MODULE_API_NO; - php_delphi_module.zend_debug := 0; - php_delphi_module.zts := USING_ZTS; - php_delphi_module.name := PChar(FLibraryName); - php_delphi_module.functions := nil; - php_delphi_module.module_startup_func := nil; - php_delphi_module.module_shutdown_func := nil; - php_delphi_module.info_func := nil; - php_delphi_module.version := '6.2'; - {$IFDEF PHP4} - php_delphi_module.global_startup_func := nil; - {$ENDIF} - php_delphi_module.request_shutdown_func := nil; - php_delphi_module.global_id := 0; - php_delphi_module.module_started := 0; - php_delphi_module._type := 1; - php_delphi_module.handle := nil; - php_delphi_module.module_number := 0; -end; - -destructor TCustomPHPLibrary.Destroy; -begin - UnregisterLibrary; - FFunctions.Free; - inherited; -end; - - -procedure TCustomPHPLibrary.Loaded; -begin - inherited; - UnregisterLibrary; - RegisterLibrary; -end; - -procedure TCustomPHPLibrary.Notification(AComponent: TComponent; - Operation: TOperation); -begin - inherited Notification(AComponent, Operation); - if (Operation = opRemove) and (AComponent = FExecutor) then - FExecutor := nil; -end; - -procedure TCustomPHPLibrary.Refresh; -var - cnt : integer; -begin - SetLength(module_entry_table, FFunctions.Count + 1); - for cnt := 0 to FFunctions.Count - 1 do - begin - module_entry_table[cnt].fname := PChar(FFunctions[cnt].FunctionName); - module_entry_table[cnt].handler := @DispatchRequest; - {$IFDEF PHP4} - module_entry_table[cnt].func_arg_types := nil; - {$ENDIF} - end; - module_entry_table[FFunctions.Count].fname := nil; - module_entry_table[FFunctions.Count].handler := nil; - {$IFDEF PHP4} - module_entry_table[FFunctions.Count].func_arg_types := nil; - {$ENDIF} - - php_delphi_module.functions := @module_entry_table[0]; -end; - -procedure TCustomPHPLibrary.RegisterLibrary; -begin - if Assigned(FExecutor) then - IPHPLibrary(FExecutor).AddModule(Self); -end; - -procedure TCustomPHPLibrary.SetExecutor(AValue: TpsvCustomPHP); -begin - if FExecutor <> AValue then - begin - if Assigned(FExecutor) then - UnregisterLibrary; - FExecutor := AValue; //Peter Enz - if AValue <> nil then - begin - Avalue.FreeNotification(Self); - RegisterLibrary; - end; - end; -end; - -procedure TCustomPHPLibrary.SetFunctions(const Value: TPHPFunctions); -begin - FFunctions.Assign(Value); -end; - -procedure TCustomPHPLibrary.SetLibraryName(AValue: string); -begin - FLibraryName := AValue; - php_delphi_module.name := PChar(FLibraryName); -end; - -procedure TCustomPHPLibrary.UnregisterLibrary; -begin - if Assigned(Executor) then - IPHPLibrary(FExecutor).RemoveModule(Self); -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: phpCustomLibrary.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit PHPCustomLibrary; + +interface + +uses + Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, VCL.Controls, VCL.Forms, VCL.Dialogs, + PHPCommon, + ZendTypes, PHPTypes, PHPAPI, ZENDAPI, + phpFunctions; + +type + + IPHPEngine = interface (IUnknown) + ['{484AE2CA-755A-437C-9B60-E3735973D0A9}'] + procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); + function GetEngineActive : boolean; + end; + + + TCustomPHPLibrary = class(TPHPComponent) + private + FLibraryName : AnsiString; + FFunctions : TPHPFunctions; + FLocked: boolean; + procedure SetFunctions(const Value : TPHPFunctions); + procedure SetLibraryName(AValue : AnsiString); + protected + procedure RegisterLibrary; virtual; + procedure UnregisterLibrary; virtual; + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + procedure Refresh; virtual; + property LibraryName : AnsiString read FLibraryName write SetLibraryName; + property Functions : TPHPFunctions read FFunctions write SetFunctions; + property Locked : boolean read FLocked write FLocked; + end; + + TPHPLibrarian = class + private + FLibraries : TList; + public + constructor Create; virtual; + destructor Destroy; override; + procedure AddLibrary(ALibrary : TCustomPHPLibrary); + procedure RemoveLibrary(ALibrary : TCustomPHPLibrary); + function Count : integer; + function GetLibrary(Index : integer) : TCustomPHPLibrary; + property Libraries : TList read FLibraries write FLibraries; + end; + +var + Librarian : TPHPLibrarian = nil; + +implementation + +{ TCustomPHPLibrary } + +constructor TCustomPHPLibrary.Create(AOwner: TComponent); +begin + inherited; + FFunctions := TPHPFunctions.Create(Self, TPHPFunction); + RegisterLibrary; +end; + +destructor TCustomPHPLibrary.Destroy; +begin + UnregisterLibrary; + FFunctions.Free; + FFunctions := nil; + inherited; +end; + +procedure TCustomPHPLibrary.Refresh; +begin +end; + + +procedure TCustomPHPLibrary.RegisterLibrary; +begin + if Assigned(Librarian) then + Librarian.AddLibrary(Self); +end; + + + +procedure TCustomPHPLibrary.SetFunctions(const Value: TPHPFunctions); +begin + FFunctions.Assign(Value); +end; + +procedure TCustomPHPLibrary.SetLibraryName(AValue: AnsiString); +begin + if FLibraryName <> AValue then + begin + FLibraryName := AValue; + end; +end; + +procedure TCustomPHPLibrary.UnregisterLibrary; +begin + if Assigned(Librarian) then + Librarian.RemoveLibrary(Self); +end; + + +procedure InitLibrarian; +begin + Librarian := TPHPLibrarian.Create; +end; + +procedure UninitLibrarian; +begin + if Assigned(Librarian) then + try + Librarian.Free; + finally + Librarian := nil; + end; +end; + +{ TPHPLibrarian } + +procedure TPHPLibrarian.AddLibrary(ALibrary: TCustomPHPLibrary); +begin + if FLibraries.IndexOf(ALibrary) = -1 then + FLibraries.Add(ALibrary); +end; + +function TPHPLibrarian.Count: integer; +begin + Result := FLibraries.Count; +end; + +constructor TPHPLibrarian.Create; +begin + inherited; + FLibraries := TList.Create; +end; + +destructor TPHPLibrarian.Destroy; +begin + FLibraries.Free; + inherited; +end; + +function TPHPLibrarian.GetLibrary(Index: integer): TCustomPHPLibrary; +begin + Result := TCustomPHPLibrary(FLibraries[Index]); +end; + +procedure TPHPLibrarian.RemoveLibrary(ALibrary: TCustomPHPLibrary); +begin + FLibraries.Remove(ALibrary); +end; + +initialization + InitLibrarian; + +finalization + UnInitLibrarian; + +end. diff --git a/phpModules.pas b/phpModules.pas index 1ad29e2..03d88d8 100644 --- a/phpModules.pas +++ b/phpModules.pas @@ -1,767 +1,797 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpModules.pas,v 6.2 02/2006 delphi32 Exp $ } - - -unit phpModules; - -interface - uses - SyncObjs, Windows, SysUtils, Classes, Forms, Consts, - PHPCommon, - {$IFDEF VERSION6}RTLConsts, Variants,{$ENDIF} ZendAPI, phpAPI, phpFunctions, - ZendTypes, PHPTypes; - -type - TOnModuleEvent = procedure(Sender : TObject; TSRMLS_DC : pointer) of object; - - TCustomPHPExtension = class(TDataModule) - private - FAbout : TPHPAboutInfo; - FTSRMLS : pointer; - FOnModuleInfo : TOnModuleEvent; - FOnModuleInit : TOnModuleEvent; - FOnModuleShutdown : TOnModuleEvent; - FOnRequestInit : TOnModuleEvent; - FOnRequestShutdown : TOnModuleEvent; - FOnActivation : TNotifyEvent; - FOnDeactivation : TNotifyEvent; - FModuleType : TZendModuleType; - FVersion : string; - FModuleName : string; - FFunctions : TPHPFunctions; - procedure SetFunctions(const Value : TPHPFunctions); - protected - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - procedure puts(str : PChar); - procedure phpwrite(str : PChar; str_len : integer); - procedure phpwrite_h(str : PChar; str_len : integer); - procedure puts_h(str : PChar); - procedure ReportError(ErrType : integer; ErrText : PChar); - function FunctionByName(const AName : string) :TPHPFunction; - property About : TPHPAboutInfo read FAbout write FAbout stored False; - property ModuleType : TZendModuleType read FModuleType write FModuleType default mtPersistent; - property Version : string read FVersion write FVersion; - property Functions : TPHPFunctions read FFunctions write SetFunctions; - property ModuleName : string read FModuleName write FModuleName; - property TSRMLS : pointer read FTSRMLS; - property OnActivation : TNotifyEvent read FOnActivation write FOnActivation; - property OnDeactivation : TNotifyEvent read FOnDeactivation write FOnDeactivation; - property OnModuleInit : TOnModuleEvent read FOnModuleInit write FOnModuleInit; - property OnModuleShutdown : TOnModuleEvent read FOnModuleShutdown write FOnModuleShutdown; - property OnRequestInit : TOnModuleEvent read FOnRequestInit write FOnRequestInit; - property OnRequestShutdown : TOnModuleEvent read FOnRequestShutdown write FOnRequestShutdown; - property OnModuleInfo : TOnModuleEvent read FOnModuleInfo write FOnModuleInfo; - end; - - - TPHPExtension = class(TCustomPHPExtension) - public - constructor Create(AOwner : TComponent); override; - published - property About; - property ModuleType; - property Version; - property Functions; - property ModuleName; - property OnActivation; - property OnDeactivation; - property OnModuleInit; - property OnModuleShutdown; - property OnRequestInit; - property OnRequestShutdown; - property OnModuleInfo; - end; - - TClassRegister = class - CN : string; - CH : integer; - end; - - TPHPApplication = class(TComponent) - private - FClassList : TThreadList; - FActiveFunctionName : PChar; - FPHPExtensionClass: TComponentClass; - FCriticalSection: TCriticalSection; - FActivePHPModules: TList; - FInactivePHPModules: TList; - FTitle: string; - FMaxConnections: Integer; - FCacheConnections: Boolean; - FModuleNumber : integer; - FLoading : boolean; - function GetActiveCount: Integer; - function GetInactiveCount: Integer; - procedure SetCacheConnections(Value: Boolean); - protected - function ActivatePHPModule: TPHPExtension; dynamic; - procedure DeactivatePHPModule(DataModule: TPHPExtension); dynamic; - procedure DoHandleException(E: Exception); dynamic; - procedure OnExceptionHandler(Sender: TObject; E: Exception); - - {$IFDEF PHP510} - procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); - {$ELSE} - procedure HandleRequest(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); - {$ENDIF} - public - constructor Create(AOwner: TComponent); override; - destructor Destroy; override; - procedure Initialize; virtual; - procedure Run; virtual; - procedure CreateForm(InstanceClass: TComponentClass; var Reference); - function GetPHPClass(const AClassName : string) : pzend_class_entry; - function FindPHPClass(const AClassName : string) : pzend_class_entry; - procedure RegisterPHPClass(const AClassName : string; AClassEntry : pzend_class_entry); - procedure UnregisterPHPClasses; - property Title: string read FTitle write FTitle; - property ActiveCount: Integer read GetActiveCount; - property CacheConnections: Boolean read FCacheConnections write SetCacheConnections; - property InactiveCount: Integer read GetInactiveCount; - property MaxConnections: Integer read FMaxConnections write FMaxConnections; - property ModuleNumber : integer read FModuleNumber write FModuleNumber; - property Loading : boolean read FLoading; - end; - - -function get_module : Pzend_module_entry; cdecl; - - -var - Application : TPHPApplication = nil; - ModuleEntry : Tzend_module_entry; - module_entry_table : array of zend_function_entry; - app_globals_id : integer; - -implementation - - -resourcestring - SResNotFound = 'Resource %s not found'; - - -procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; -var - Extension : TPHPExtension; -begin - if Assigned(Application) then - begin - Extension := Application.ActivatePHPModule; - try - if Assigned(Extension.OnModuleInfo) then - begin - Extension.OnModuleInfo(Application, TSRMLS_DC); - end - else - begin - php_info_print_table_start(); - php_info_print_table_row(2, PChar(Extension.ModuleName + ' support'), PChar('enabled')); - php_info_print_table_end(); - end; - finally - Application.DeactivatePHPModule(Extension); - end; - end; -end; - - -{Module initialization} -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -var - Extension : TPHPExtension; -begin - if app_globals_id = 0 then - ts_allocate_id(@app_globals_id, sizeof(pointer), nil, nil); - if Assigned(Application) then - begin - Application.ModuleNumber := module_number; - Extension := Application.ActivatePHPModule; - try - if Assigned(Extension.OnModuleInit) then - Extension.OnModuleInit(Application, TSRMLS_DC); - finally - Application.DeactivatePHPModule(Extension); - end; - end; - result := SUCCESS; -end; - - -{Module shutdown} -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -var - Extension : TPHPExtension; -begin - ts_free_id(app_globals_id); - - if Assigned(Application) then - begin - Extension := Application.ActivatePHPModule; - try - if Assigned(Extension.OnModuleShutdown) then - Extension.OnModuleShutdown(Application, TSRMLS_DC); - finally - Application.DeactivatePHPModule(Extension); - end; - end; - result := SUCCESS; -end; - - -{Request initialization} -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -var - Extension : TPHPExtension; - idp : pointer; -begin - if Assigned(Application) then - begin - Extension := Application.ActivatePHPModule; - try - if Assigned(Extension.OnRequestInit) then - Extension.OnRequestInit(Application, TSRMLS_DC); - idp := ts_resource_ex(app_globals_id, nil); - integer(idp^) := integer(Extension); - finally - end; - Result := SUCCESS; - end - else - Result := FAILURE; -end; - -{Request shutdown} -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -var - Extension : TPHPExtension; - idp : pointer; - id : integer; -begin - Result := SUCCESS; - idp := ts_resource_ex(app_globals_id, nil); - id := integer(idp^); - if Assigned(Application) then - begin - Extension := pointer(id); - try - if Assigned(Extension.OnRequestShutdown) then - Extension.OnRequestShutdown(Application, TSRMLS_DC); - finally - Application.DeactivatePHPModule(Extension); - end; - end; -end; - -{$IFDEF PHP510} -procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; - this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -begin - ZVAL_NULL(return_value); - if Assigned(Application) then - try - Application.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); - except - end; -end; -{$ELSE} -procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -begin - ZVAL_NULL(return_value); - if Assigned(Application) then - try - Application.HandleRequest(ht, return_value, this_ptr, return_value_used, TSRMLS_DC); - except - end; -end; -{$ENDIF} - - -function get_module : Pzend_module_entry; cdecl; -var - cnt : integer; - Extension : TPHPExtension; -begin - if ModuleEntry.module_started = 1 then - begin - Result := @ModuleEntry; - Exit; - end; - - - try - if Assigned(Application) then - begin - Application.FLoading := true; - Extension := TPHPExtension(Application.ActivatePHPModule); - ModuleEntry.size := sizeof(Tzend_module_entry); - ModuleEntry.zend_api := ZEND_MODULE_API_NO; - ModuleEntry.zts := USING_ZTS; - {$IFDEF PHP510} - ModuleEntry.Name := estrndup(PChar(Extension.ModuleName), length(extension.ModuleName)); - ModuleEntry.version := estrndup(PChar(Extension.Version), length(Extension.Version)); - {$ELSE} - ModuleEntry.Name := StrNew(PChar(Extension.ModuleName)); - ModuleEntry.version := StrNew(PChar(Extension.Version)); - {$ENDIF} - ModuleEntry.module_startup_func := @minit; - ModuleEntry.module_shutdown_func := @mshutdown; - ModuleEntry.request_startup_func := @rinit; - ModuleEntry.request_shutdown_func := @rshutdown; - ModuleEntry.info_func := @php_info_module; - SetLength(module_entry_table, Extension.FFunctions.Count + 1); - for cnt := 0 to Extension.FFunctions.Count - 1 do - begin - {$IFDEF PHP510} - module_entry_table[cnt].fname := estrndup(PChar(Extension.FFunctions[cnt].FunctionName), length(Extension.FFunctions[cnt].FunctionName)); - {$ELSE} - module_entry_table[cnt].fname := StrNew(PChar(Extension.FFunctions[cnt].FunctionName)); - {$ENDIF} - module_entry_table[cnt].handler := @DispatchRequest; - {$IFDEF PHP4} - module_entry_table[cnt].func_arg_types := nil; - {$ENDIF} - end; - module_entry_table[Extension.FFunctions.Count].fname := nil; - module_entry_table[Extension.FFunctions.Count].handler := nil; - {$IFDEF PHP4} - module_entry_table[Extension.FFunctions.Count].func_arg_types := nil; - {$ENDIF} - - ModuleEntry.functions := @module_entry_table[0]; - ModuleEntry._type := ORD(Extension.ModuleType) + 1; - Application.DeactivatePHPModule(Extension); - Application.FLoading := false; - Result := @ModuleEntry; - end - else - Result := nil; - except - Result := nil; - end; -end; - -{ TCustomPHPExtension } -constructor TCustomPHPExtension.Create(AOwner: TComponent); -begin - inherited CreateNew(AOwner); - FFunctions := TPHPFunctions.Create(Self, TPHPFunction); - FModuleType := mtPersistent; - FVersion := '0.0'; -end; - -destructor TCustomPHPExtension.Destroy; -begin - if Assigned(OnDestroy) then - try - OnDestroy(Self); - except - end; - FFunctions.Free; - inherited; -end; - - -function TCustomPHPExtension.FunctionByName( - const AName: string): TPHPFunction; -var - cnt : integer; -begin - Result := nil; - for cnt := 0 to FFunctions.Count - 1 do - begin - if SameText(AName, FFunctions[cnt].FunctionName) then - break; - end; -end; - -procedure TCustomPHPExtension.phpwrite(str: PChar; str_len: integer); -begin - php_body_write(str, str_len, FTSRMLS); -end; - -procedure TCustomPHPExtension.phpwrite_h(str: PChar; str_len: integer); -begin - php_header_write(str, str_len, FTSRMLS); -end; - -procedure TCustomPHPExtension.puts(str: PChar); -begin - php_body_write(str, strlen(str), FTSRMLS); -end; - -procedure TCustomPHPExtension.puts_h(str: PChar); -begin - php_header_write(str, strlen(str), FTSRMLS); -end; - -procedure TCustomPHPExtension.ReportError(ErrType: integer; - ErrText: PChar); -begin - zend_error(ErrType, ErrText); -end; - -procedure TCustomPHPExtension.SetFunctions(const Value: TPHPFunctions); -begin - FFunctions.Assign(Value); -end; - -{ TPHPExtension } - -constructor TPHPExtension.Create(AOwner: TComponent); -begin - inherited Create(AOwner); - if (ClassType <> TCustomPHPExtension) and not (csDesigning in ComponentState) then - begin - if not InitInheritedComponent(Self, TCustomPHPExtension) then - raise EResNotFound.CreateFmt(SResNotFound, [ClassName]); - try - if Assigned(OnCreate) and OldCreateOrder then OnCreate(Self); - except - Forms.Application.HandleException(Self); - end; - end; -end; - -{ TPHPApplication } - - -procedure DoneVCLApplication; -begin - try - Forms.Application.OnException := nil; - if Forms.Application.Handle <> 0 then ShowOwnedPopups(Forms.Application.Handle, False); - Forms.Application.ShowHint := False; - Forms.Application.Destroying; - Forms.Application.DestroyComponents; - except - end; -end; - -procedure DLLExitProc(Reason: Integer); register; -begin - if Reason = DLL_PROCESS_DETACH then DoneVCLApplication; -end; - - -constructor TPHPApplication.Create(AOwner: TComponent); -begin - inherited; - FLoading := false; - FClassList := TThreadList.Create; - FCriticalSection := TCriticalSection.Create; - FActivePHPModules := TList.Create; - FInactivePHPModules := TList.Create; - FMaxConnections := 32; - FCacheConnections := true; - IsMultiThread := True; - DLLProc := @DLLExitProc; -end; - -destructor TPHPApplication.Destroy; -begin - try - FCriticalSection.Free; - FActivePHPModules.Free; - FInactivePHPModules.Free; - UnregisterPHPClasses; - FClassList.Free; - except - on E : Exception do - OutputDebugString(PChar(E.Message)); - end; - inherited Destroy; -end; - - -procedure TPHPApplication.CreateForm(InstanceClass: TComponentClass; - var Reference); -begin - if FPHPExtensionClass = nil then - FPHPExtensionClass := InstanceClass - else - raise Exception.Create('Only one PHP extension allowed'); -end; - -function TPHPApplication.ActivatePHPModule: TPHPExtension; -begin - FCriticalSection.Enter; - try - Result := nil; - if (FMaxConnections > 0) and (FActivePHPModules.Count >= FMaxConnections) then - raise Exception.Create('Too many active connections'); - if FInactivePHPModules.Count > 0 then - begin - Result := FInactivePHPModules[0]; - FInactivePHPModules.Delete(0); - FActivePHPModules.Add(Result); - end else if FPHPExtensionClass <> nil then - begin - TComponent(Result) := FPHPExtensionClass.Create(Self); - FActivePHPModules.Add(Result); - if Assigned(Result.FOnActivation) then - Result.FOnActivation(Self); - end else raise Exception.Create('No PHP extensions registered'); - finally - FCriticalSection.Leave; - end; -end; - -procedure TPHPApplication.DeactivatePHPModule(DataModule: TPHPExtension); -begin - FCriticalSection.Enter; - try - if FActivePHPModules.IndexOf(DataModule) > -1 then - begin - if Assigned(DataModule.FOnDeactivation) then - DataModule.FOnDeactivation(Self); - FActivePHPModules.Remove(DataModule); - if FCacheConnections then - FInactivePHPModules.Add(DataModule) - else DataModule.Free; - end; - finally - FCriticalSection.Leave; - end; -end; - -procedure TPHPApplication.DoHandleException(E: Exception); -begin - -end; - - -function TPHPApplication.GetActiveCount: Integer; -begin - FCriticalSection.Enter; - try - Result := FActivePHPModules.Count; - finally - FCriticalSection.Leave; - end; -end; - -function TPHPApplication.GetInactiveCount: Integer; -begin - FCriticalSection.Enter; - try - Result := FInactivePHPModules.Count; - finally - FCriticalSection.Leave; - end; -end; - - -procedure TPHPApplication.Initialize; -begin - // This is a place holder - if InitProc <> nil then TProcedure(InitProc); -end; - -procedure TPHPApplication.OnExceptionHandler(Sender: TObject; - E: Exception); -begin - DoHandleException(E); -end; - -procedure TPHPApplication.Run; -begin - Forms.Application.OnException := OnExceptionHandler; -end; - - -procedure TPHPApplication.SetCacheConnections(Value: Boolean); -var - I: Integer; -begin - if Value <> FCacheConnections then - begin - FCacheConnections := Value; - if not Value then - begin - FCriticalSection.Enter; - try - for I := 0 to FInactivePHPModules.Count - 1 do - TPHPExtension(FInactivePHPModules[I]).Free; - FInactivePHPModules.Clear; - finally - FCriticalSection.Leave; - end; - end; - end; -end; - - - -{$IFDEF PHP510} -procedure TPHPApplication.HandleRequest(ht: integer; return_value : pzval; return_value_ptr : ppzval; - this_ptr: pzval; return_value_used: integer; TSRMLS_DC: pointer); -{$ELSE} -procedure TPHPApplication.HandleRequest(ht: integer; return_value : pzval; - this_ptr: pzval; return_value_used: integer; TSRMLS_DC: pointer); -{$ENDIF} -var - DataModule: TPHPExtension; - cnt : integer; - Params : pppointer; - AFunction : TPHPFunction; - i : integer; - pval : pzval; - idp : pointer; - id : integer; - -begin - pval := nil; - - idp := ts_resource_ex(integer(app_globals_id), nil); - id := integer(idp^); - if id <= 0 then - Exit; - - Params := emalloc(ht * sizeOf(ppzval)); - try - if ht > 0 then - begin - if ( not (_zend_get_parameters_array_ex(ht, Params, TSRMLS_DC) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - pval := pzval(params^^); - end; - - - DataModule := TPHPExtension(id); - if DataModule <> nil then - try - DataModule.FTSRMLS := TSRMLS_DC; - FActiveFunctionName := get_active_function_name(TSRMLS_DC); - for cnt := 0 to DataModule.FFunctions.Count - 1 do - begin - if SameText(DataModule.FFunctions[cnt].FunctionName, FActiveFunctionName) then - begin - AFunction := DataModule.FFunctions[cnt]; - if Assigned(AFunction.OnExecute) then - begin - if AFunction.Parameters.Count <> ht then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - if ht > 0 then begin - for i := 0 to ht - 1 do - begin - if not IsParamTypeCorrect(AFunction.Parameters[i].ParamType, pval) then - begin - zend_error(E_WARNING, PChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); - Exit; - end; - AFunction.Parameters[i].ZendValue := pval; - inc(integer(params^), sizeof(ppzval)); - pval := pzval(params^^); - end; - end; - - AFunction.ZendVar.AsZendVariable := return_value; - AFunction.OnExecute(DataModule, AFunction.Parameters, AFunction.ReturnValue, this_ptr, TSRMLS_DC); - if AFunction.ZendVar.ISNull then - variant2zval(AFunction.ReturnValue, return_value); - end; - break; - end; - end; - finally - efree(Params); - end; - except - end; -end; - - - -function TPHPApplication.GetPHPClass( - const AClassName: string): pzend_class_entry; -var - I: Integer; -begin - with FClassList.LockList do - try - for I := 0 to Count - 1 do - begin - if SameText(TClassRegister(Items[I]).CN, AClassName) then - begin - Result := pzend_class_entry(TClassRegister(Items[I]).CH); - Exit; - end; - end; - Result := nil; - finally - FClassList.UnlockList; - end; -end; - - -procedure ClassNotFound(const ClassName: string); -begin - raise EClassNotFound.CreateFmt(SClassNotFound, [ClassName]); -end; - -function TPHPApplication.FindPHPClass( - const AClassName: string): pzend_class_entry; -begin - Result := GetPHPClass(AClassName); - if Result = nil then ClassNotFound(AClassName); -end; - -procedure TPHPApplication.RegisterPHPClass(const AClassName: string; - AClassEntry: pzend_class_entry); -var - ClassRegister : TClassRegister; -begin - With FClassList.LockList do - try - if GetPHPClass(AClassName) <> nil then - raise EFilerError.CreateResFmt(@SDuplicateClass, [AClassName]); - ClassRegister := TClassRegister.Create; - ClassRegister.CN := LowerCase(AClassName); - ClassRegister.CH := integer(AClassEntry); - Add(ClassRegister); - finally - FClassList.UnlockList; - end; -end; - -procedure TPHPApplication.UnregisterPHPClasses; -var - i : integer; -begin - with FClassList.LockList do - try - for I := 0 to Count - 1 do - TClassRegister(Items[i]).Free; - FClassList.Clear; - finally - FClassList.UnlockList; - end; -end; - - -exports - get_module; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: phpModules.pas,v 7.4 10/2009 delphi32 Exp $ } + + +unit phpModules; + +interface + uses + SyncObjs, Windows, SysUtils, Types, Classes, VCL.Forms, VCL.Consts, + PHPCommon, + {$IFDEF VERSION6}RTLConsts, Variants,{$ENDIF} ZendAPI, phpAPI, + phpFunctions, + ZendTypes, + PHPTypes; + +type + TOnModuleEvent = procedure(Sender : TObject; TSRMLS_DC : pointer) of object; + + TCustomPHPExtension = class(TDataModule) + private + FAbout : TPHPAboutInfo; + FTSRMLS : pointer; + FOnModuleInfo : TOnModuleEvent; + FOnModuleInit : TOnModuleEvent; + FOnModuleShutdown : TOnModuleEvent; + FOnRequestInit : TOnModuleEvent; + FOnRequestShutdown : TOnModuleEvent; + FOnActivation : TNotifyEvent; + FOnDeactivation : TNotifyEvent; + FModuleType : TZendModuleType; + FVersion : string; + FModuleName : string; + FFunctions : TPHPFunctions; + procedure SetFunctions(const Value : TPHPFunctions); + protected + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + procedure puts(str : PAnsiChar); + procedure phpwrite(str : PAnsiChar; str_len : integer); + procedure phpwrite_h(str : PAnsiChar; str_len : integer); + procedure puts_h(str : PAnsiChar); + procedure ReportError(ErrType : integer; ErrText : PAnsiChar); + function FunctionByName(const AName : string) :TPHPFunction; + property About : TPHPAboutInfo read FAbout write FAbout stored False; + property ModuleType : TZendModuleType read FModuleType write FModuleType default mtPersistent; + property Version : string read FVersion write FVersion; + property Functions : TPHPFunctions read FFunctions write SetFunctions; + property ModuleName : string read FModuleName write FModuleName; + property TSRMLS : pointer read FTSRMLS; + property OnActivation : TNotifyEvent read FOnActivation write FOnActivation; + property OnDeactivation : TNotifyEvent read FOnDeactivation write FOnDeactivation; + property OnModuleInit : TOnModuleEvent read FOnModuleInit write FOnModuleInit; + property OnModuleShutdown : TOnModuleEvent read FOnModuleShutdown write FOnModuleShutdown; + property OnRequestInit : TOnModuleEvent read FOnRequestInit write FOnRequestInit; + property OnRequestShutdown : TOnModuleEvent read FOnRequestShutdown write FOnRequestShutdown; + property OnModuleInfo : TOnModuleEvent read FOnModuleInfo write FOnModuleInfo; + end; + + + TPHPExtension = class(TCustomPHPExtension) + public + constructor Create(AOwner : TComponent); override; + published + property About; + property ModuleType; + property Version; + property Functions; + property ModuleName; + property OnActivation; + property OnDeactivation; + property OnModuleInit; + property OnModuleShutdown; + property OnRequestInit; + property OnRequestShutdown; + property OnModuleInfo; + end; + + TClassRegister = class + CN : string; + CH : integer; + end; + + TPHPApplication = class(TComponent) + private + FClassList : TThreadList; + FPHPExtensionClass: TComponentClass; + FCriticalSection: TCriticalSection; + FActivePHPModules: TList; + FInactivePHPModules: TList; + FTitle: string; + FMaxConnections: Integer; + FCacheConnections: Boolean; + FModuleNumber : integer; + FLoading : boolean; + function GetActiveCount: Integer; + function GetInactiveCount: Integer; + procedure SetCacheConnections(Value: Boolean); + protected + function ActivatePHPModule: TPHPExtension; dynamic; + procedure DeactivatePHPModule(DataModule: TPHPExtension); dynamic; + procedure DoHandleException(E: Exception); dynamic; + procedure OnExceptionHandler(Sender: TObject; E: Exception); + procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Initialize; virtual; + procedure Run; virtual; + procedure CreateForm(InstanceClass: TComponentClass; var Reference); + function GetPHPClass(const AClassName : string) : pzend_class_entry; + function FindPHPClass(const AClassName : string) : pzend_class_entry; + procedure RegisterPHPClass(const AClassName : string; AClassEntry : pzend_class_entry); + procedure UnregisterPHPClasses; + property Title: string read FTitle write FTitle; + property ActiveCount: Integer read GetActiveCount; + property CacheConnections: Boolean read FCacheConnections write SetCacheConnections; + property InactiveCount: Integer read GetInactiveCount; + property MaxConnections: Integer read FMaxConnections write FMaxConnections; + property ModuleNumber : integer read FModuleNumber write FModuleNumber; + property Loading : boolean read FLoading; + end; + + +function get_module : Pzend_module_entry; cdecl; + + +var + Application : TPHPApplication = nil; + ModuleEntry : Tzend_module_entry; + module_entry_table : array of zend_function_entry; + app_globals_id : integer; + +implementation + + +resourcestring + SResNotFound = 'Resource %s not found'; + + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +var + Extension : TPHPExtension; +begin + if Assigned(Application) then + begin + Extension := Application.ActivatePHPModule; + try + if Assigned(Extension.OnModuleInfo) then + begin + Extension.OnModuleInfo(Application, TSRMLS_DC); + end + else + begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar(Extension.ModuleName + ' support'), PAnsiChar('enabled')); + php_info_print_table_end(); + end; + finally + Application.DeactivatePHPModule(Extension); + end; + end; +end; + + +{Module initialization} +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +var + Extension : TPHPExtension; +begin + if app_globals_id = 0 then + ts_allocate_id(@app_globals_id, sizeof(pointer), nil, nil); + if Assigned(Application) then + begin + Application.ModuleNumber := module_number; + Extension := Application.ActivatePHPModule; + try + if Assigned(Extension.OnModuleInit) then + Extension.OnModuleInit(Application, TSRMLS_DC); + finally + Application.DeactivatePHPModule(Extension); + end; + end; + result := SUCCESS; +end; + + +{Module shutdown} +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +var + Extension : TPHPExtension; +begin + ts_free_id(app_globals_id); + + if Assigned(Application) then + begin + Extension := Application.ActivatePHPModule; + try + if Assigned(Extension.OnModuleShutdown) then + Extension.OnModuleShutdown(Application, TSRMLS_DC); + finally + Application.DeactivatePHPModule(Extension); + end; + end; + result := SUCCESS; +end; + + +{Request initialization} +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +var + Extension : TPHPExtension; + idp : pointer; +begin + if Assigned(Application) then + begin + Extension := Application.ActivatePHPModule; + try + if Assigned(Extension.OnRequestInit) then + Extension.OnRequestInit(Application, TSRMLS_DC); + idp := ts_resource_ex(app_globals_id, nil); + integer(idp^) := integer(Extension); + finally + end; + Result := SUCCESS; + end + else + Result := FAILURE; +end; + +{Request shutdown} +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +var + Extension : TPHPExtension; + idp : pointer; + id : integer; +begin + Result := SUCCESS; + idp := ts_resource_ex(app_globals_id, nil); + id := integer(idp^); + if Assigned(Application) then + begin + Extension := pointer(id); + try + if Assigned(Extension.OnRequestShutdown) then + Extension.OnRequestShutdown(Application, TSRMLS_DC); + finally + Application.DeactivatePHPModule(Extension); + end; + end; +end; + +{$IFDEF PHP510} +procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; + this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; +begin + ZVAL_NULL(return_value); + if Assigned(Application) then + try + Application.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); + except + end; +end; +{$ELSE} +procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +begin + ZVAL_NULL(return_value); + if Assigned(Application) then + try + Application.HandleRequest(ht, return_value, nil, this_ptr, return_value_used, TSRMLS_DC); + except + end; +end; +{$ENDIF} + + +function get_module : Pzend_module_entry; cdecl; +var + cnt : integer; + Extension : TPHPExtension; + ModuleName: AnsiString; + Version : AnsiString; + FunctionName : AnsiString; +begin + if ModuleEntry.module_started = 1 then + begin + Result := @ModuleEntry; + Exit; + end; + + + try + if Assigned(Application) then + begin + Application.FLoading := true; + Extension := TPHPExtension(Application.ActivatePHPModule); + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleName := AnsiString(Extension.ModuleName); + + {$IFNDEF COMPILER_VC9} + ModuleEntry.Name := strdup(PAnsiChar(ModuleName)); + {$ELSE} + ModuleEntry.Name := DupStr(PAnsiChar(ModuleName)); + {$ENDIF} + + Version := AnsiString(Extension.Version); + + {$IFNDEF COMPILER_VC9} + ModuleEntry.version := strdup(PAnsiChar(Version)); + {$ELSE} + ModuleEntry.version := DupStr(PAnsiChar(Version)); + {$ENDIF} + + + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + SetLength(module_entry_table, Extension.FFunctions.Count + 1); + for cnt := 0 to Extension.FFunctions.Count - 1 do + begin + FunctionName := AnsiString(Extension.FFunctions[cnt].FunctionName); + + {$IFNDEF COMPILER_VC9} + module_entry_table[cnt].fname := strdup(PAnsiChar(FunctionName)); + {$ELSE} + module_entry_table[cnt].fname :=DupStr(PAnsiChar(FunctionName)); + {$ENDIF} + + module_entry_table[cnt].handler := @DispatchRequest; + {$IFDEF PHP4} + module_entry_table[cnt].func_arg_types := nil; + {$ENDIF} + end; + module_entry_table[Extension.FFunctions.Count].fname := nil; + module_entry_table[Extension.FFunctions.Count].handler := nil; + {$IFDEF PHP4} + module_entry_table[Extension.FFunctions.Count].func_arg_types := nil; + {$ENDIF} + + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := ORD(Extension.ModuleType) + 1; + {$IFDEF PHP530} + + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := DupStr(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + + {$ENDIF} + Application.DeactivatePHPModule(Extension); + Application.FLoading := false; + Result := @ModuleEntry; + end + else + Result := nil; + except + Result := nil; + end; +end; + +{ TCustomPHPExtension } +constructor TCustomPHPExtension.Create(AOwner: TComponent); +begin + inherited CreateNew(AOwner); + FFunctions := TPHPFunctions.Create(Self, TPHPFunction); + FModuleType := mtPersistent; + FVersion := '0.0'; +end; + +destructor TCustomPHPExtension.Destroy; +begin + if Assigned(OnDestroy) then + try + OnDestroy(Self); + except + end; + FFunctions.Free; + inherited; +end; + + +function TCustomPHPExtension.FunctionByName( + const AName: string): TPHPFunction; +var + cnt : integer; +begin + Result := nil; + for cnt := 0 to FFunctions.Count - 1 do + begin + if SameText(AName, FFunctions[cnt].FunctionName) then + break; + end; +end; + +procedure TCustomPHPExtension.phpwrite(str: PAnsiChar; str_len: integer); +begin + php_body_write(str, str_len, FTSRMLS); +end; + +procedure TCustomPHPExtension.phpwrite_h(str: PAnsiChar; str_len: integer); +begin + php_header_write(str, str_len, FTSRMLS); +end; + +procedure TCustomPHPExtension.puts(str: PAnsiChar); +begin + php_body_write(str, strlen(str), FTSRMLS); +end; + +procedure TCustomPHPExtension.puts_h(str: PAnsiChar); +begin + php_header_write(str, strlen(str), FTSRMLS); +end; + +procedure TCustomPHPExtension.ReportError(ErrType: integer; + ErrText: PAnsiChar); +begin + zend_error(ErrType, ErrText); +end; + +procedure TCustomPHPExtension.SetFunctions(const Value: TPHPFunctions); +begin + FFunctions.Assign(Value); +end; + +{ TPHPExtension } + +constructor TPHPExtension.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + if (ClassType <> TCustomPHPExtension) and not (csDesigning in ComponentState) then + begin + if not InitInheritedComponent(Self, TCustomPHPExtension) then + raise EResNotFound.CreateFmt(SResNotFound, [ClassName]); + try + if Assigned(OnCreate) and OldCreateOrder then OnCreate(Self); + except + VCL.Forms.Application.HandleException(Self); + end; + end; +end; + +{ TPHPApplication } + + +procedure DoneVCLApplication; +begin + try + VCL.Forms.Application.OnException := nil; + if VCL.Forms.Application.Handle <> 0 then ShowOwnedPopups(VCL.Forms.Application.Handle, False); + VCL.Forms.Application.ShowHint := False; + VCL.Forms.Application.Destroying; + VCL.Forms.Application.DestroyComponents; + except + end; +end; + +procedure DLLExitProc(Reason: Integer); register; +begin + if Reason = DLL_PROCESS_DETACH then DoneVCLApplication; +end; + + +constructor TPHPApplication.Create(AOwner: TComponent); +begin + inherited; + FLoading := false; + FClassList := TThreadList.Create; + FCriticalSection := TCriticalSection.Create; + FActivePHPModules := TList.Create; + FInactivePHPModules := TList.Create; + FMaxConnections := 32; + FCacheConnections := true; + IsMultiThread := True; + DLLProc := @DLLExitProc; +end; + +destructor TPHPApplication.Destroy; +begin + try + FCriticalSection.Free; + FActivePHPModules.Free; + FInactivePHPModules.Free; + UnregisterPHPClasses; + FClassList.Free; + except + on E : Exception do + OutputDebugStringA(PAnsiChar(E.Message)); + end; + inherited Destroy; +end; + + +procedure TPHPApplication.CreateForm(InstanceClass: TComponentClass; + var Reference); +begin + if FPHPExtensionClass = nil then + FPHPExtensionClass := InstanceClass + else + raise Exception.Create('Only one PHP extension allowed'); +end; + +function TPHPApplication.ActivatePHPModule: TPHPExtension; +begin + FCriticalSection.Enter; + try + Result := nil; + if (FMaxConnections > 0) and (FActivePHPModules.Count >= FMaxConnections) then + raise Exception.Create('Too many active connections'); + if FInactivePHPModules.Count > 0 then + begin + Result := FInactivePHPModules[0]; + FInactivePHPModules.Delete(0); + FActivePHPModules.Add(Result); + end else if FPHPExtensionClass <> nil then + begin + TComponent(Result) := FPHPExtensionClass.Create(Self); + FActivePHPModules.Add(Result); + if Assigned(Result.FOnActivation) then + Result.FOnActivation(Self); + end else raise Exception.Create('No PHP extensions registered'); + finally + FCriticalSection.Leave; + end; +end; + +procedure TPHPApplication.DeactivatePHPModule(DataModule: TPHPExtension); +begin + FCriticalSection.Enter; + try + if FActivePHPModules.IndexOf(DataModule) > -1 then + begin + if Assigned(DataModule.FOnDeactivation) then + DataModule.FOnDeactivation(Self); + FActivePHPModules.Remove(DataModule); + if FCacheConnections then + FInactivePHPModules.Add(DataModule) + else DataModule.Free; + end; + finally + FCriticalSection.Leave; + end; +end; + +procedure TPHPApplication.DoHandleException(E: Exception); +begin + +end; + + +function TPHPApplication.GetActiveCount: Integer; +begin + FCriticalSection.Enter; + try + Result := FActivePHPModules.Count; + finally + FCriticalSection.Leave; + end; +end; + +function TPHPApplication.GetInactiveCount: Integer; +begin + FCriticalSection.Enter; + try + Result := FInactivePHPModules.Count; + finally + FCriticalSection.Leave; + end; +end; + + +procedure TPHPApplication.Initialize; +begin + // This is a place holder + if InitProc <> nil then TProcedure(InitProc); +end; + +procedure TPHPApplication.OnExceptionHandler(Sender: TObject; + E: Exception); +begin + DoHandleException(E); +end; + +procedure TPHPApplication.Run; +begin + VCL.Forms.Application.OnException := OnExceptionHandler; +end; + + +procedure TPHPApplication.SetCacheConnections(Value: Boolean); +var + I: Integer; +begin + if Value <> FCacheConnections then + begin + FCacheConnections := Value; + if not Value then + begin + FCriticalSection.Enter; + try + for I := 0 to FInactivePHPModules.Count - 1 do + TPHPExtension(FInactivePHPModules[I]).Free; + FInactivePHPModules.Clear; + finally + FCriticalSection.Leave; + end; + end; + end; +end; + + + +procedure TPHPApplication.HandleRequest(ht: integer; return_value : pzval; return_value_ptr : ppzval; + this_ptr: pzval; return_value_used: integer; TSRMLS_DC: pointer); +var + DataModule: TPHPExtension; + cnt : integer; + Params : pppzval; + AFunction : TPHPFunction; + i : integer; + pval : pzval; + idp : pointer; + id : integer; + ReturnValue : variant; + FZendVar : TZendVariable; + FParameters : TFunctionParams; + FActiveFunctionName : string; + +begin + pval := nil; + idp := ts_resource_ex(integer(app_globals_id), nil); + id := integer(idp^); + if id <= 0 then + Exit; + + FParameters := TFunctionParams.Create(nil, TFunctionParam); + try + + Params := emalloc(ht * sizeOf(ppzval)); + try + if ht > 0 then + begin + if ( not (_zend_get_parameters_array_ex(ht, Params, TSRMLS_DC) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + pval := pzval(params^^); + end; + + + DataModule := TPHPExtension(id); + if DataModule <> nil then + try + DataModule.FTSRMLS := TSRMLS_DC; + FActiveFunctionName := get_active_function_name(TSRMLS_DC); + for cnt := 0 to DataModule.FFunctions.Count - 1 do + begin + if SameText(DataModule.FFunctions[cnt].FunctionName, FActiveFunctionName) then + begin + AFunction := DataModule.FFunctions[cnt]; + if Assigned(AFunction.OnExecute) then + begin + if AFunction.Parameters.Count <> ht then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + FParameters.Assign(AFunction.Parameters); + if ht > 0 then begin + for i := 0 to ht - 1 do + begin + if not IsParamTypeCorrect(FParameters[i].ParamType, pval) then + begin + zend_error(E_WARNING, PAnsiChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); + Exit; + end; + FParameters[i].ZendValue := pval; + inc(integer(params^), sizeof(ppzval)); + pval := pzval(params^^); + end; + end; + + FZendVar := TZendVariable.Create; + try + FZendVar.AsZendVariable := return_value; + AFunction.OnExecute(DataModule, FParameters, ReturnValue, FZendVar, TSRMLS_DC); + if FZendVar.ISNull then + variant2zval(ReturnValue, return_value); + finally + FZendVar.Free; + end; + end; + break; + end; + end; + finally + efree(Params); + end; + except + end; + finally + FParameters.Free; + end; +end; + + + +function TPHPApplication.GetPHPClass( + const AClassName: string): pzend_class_entry; +var + I: Integer; +begin + with FClassList.LockList do + try + for I := 0 to Count - 1 do + begin + if SameText(TClassRegister(Items[I]).CN, AClassName) then + begin + Result := pzend_class_entry(TClassRegister(Items[I]).CH); + Exit; + end; + end; + Result := nil; + finally + FClassList.UnlockList; + end; +end; + + +procedure ClassNotFound(const ClassName: string); +begin + raise EClassNotFound.CreateFmt(SClassNotFound, [ClassName]); +end; + +function TPHPApplication.FindPHPClass( + const AClassName: string): pzend_class_entry; +begin + Result := GetPHPClass(AClassName); + if Result = nil then ClassNotFound(AClassName); +end; + +procedure TPHPApplication.RegisterPHPClass(const AClassName: string; + AClassEntry: pzend_class_entry); +var + ClassRegister : TClassRegister; +begin + With FClassList.LockList do + try + if GetPHPClass(AClassName) <> nil then + raise EFilerError.CreateResFmt(@SDuplicateClass, [AClassName]); + ClassRegister := TClassRegister.Create; + ClassRegister.CN := LowerCase(AClassName); + ClassRegister.CH := integer(AClassEntry); + Add(ClassRegister); + finally + FClassList.UnlockList; + end; +end; + +procedure TPHPApplication.UnregisterPHPClasses; +var + i : integer; +begin + with FClassList.LockList do + try + for I := 0 to Count - 1 do + TClassRegister(Items[i]).Free; + FClassList.Clear; + finally + FClassList.UnlockList; + end; +end; + + +exports + get_module; + +end. diff --git a/phpWeb.pas b/phpWeb.pas index 1a78d14..52ce78d 100644 --- a/phpWeb.pas +++ b/phpWeb.pas @@ -1,123 +1,123 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpWeb.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit phpWeb; - -interface - -uses - Windows, ToolsAPI, Forms, Dialogs, SysUtils, Graphics, Classes, ShellAPI; - -type - TphpWebWizard = class(TNotifierObject, IOTAWIzard, IOTAMenuWizard) - public - function GetMenuText: string; - function GetIDString: string; - function GetName: string; - function GetState: TWizardState; - procedure Execute; - end; - - - TphpForumWizard = class(TNotifierObject, IOTAWIzard, IOTAMenuWizard) - public - function GetMenuText: string; - function GetIDString: string; - function GetName: string; - function GetState: TWizardState; - procedure Execute; - end; - -procedure Register; - -implementation - -procedure Register; -begin - RegisterPackageWizard(TphpWebWizard.Create as IOTAWizard); - RegisterPackageWizard(TphpForumWizard.Create as IOTAWizard); -end; - -procedure InitExpert; -begin - { stubbed out } -end; - -procedure DoneExpert; -begin - { stubbed out } -end; - -{ TphpWebWizard } - -procedure TphpWebWizard.Execute; -begin - ShellExecute(0, 'open', 'http://www.php.net', nil, nil, SW_SHOW); -end; - -function TphpWebWizard.GetIDString: string; -begin - Result := 'Perevoznyk.TphpWebWizard'; -end; - -function TphpWebWizard.GetMenuText: string; -begin - Result := 'PHP Home Page'; -end; - -function TphpWebWizard.GetName: string; -begin - Result := 'TphpWebWizard'; -end; - -function TphpWebWizard.GetState: TWizardState; -begin - Result := [wsEnabled]; -end; - - - -{ TphpForumWizard } - -procedure TphpForumWizard.Execute; -begin - ShellExecute(0, 'open', 'http://sourceforge.net/forum/forum.php?forum_id=324242', nil, nil, SW_SHOW); -end; - -function TphpForumWizard.GetIDString: string; -begin - Result := 'Perevoznyk.TphpForumWizard'; -end; - -function TphpForumWizard.GetMenuText: string; -begin - Result := 'PHP4Delphi Forum'; -end; - -function TphpForumWizard.GetName: string; -begin - Result := 'TphpForumWizard'; -end; - -function TphpForumWizard.GetState: TWizardState; -begin - Result := [wsEnabled]; -end; - -initialization - InitExpert; - -finalization - DoneExpert; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: phpWeb.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit phpWeb; + +interface + +uses + Windows, ToolsAPI, Forms, Dialogs, SysUtils, Graphics, Classes, ShellAPI; + +type + TphpWebWizard = class(TNotifierObject, IOTAWIzard, IOTAMenuWizard) + public + function GetMenuText: string; + function GetIDString: string; + function GetName: string; + function GetState: TWizardState; + procedure Execute; + end; + + + TphpForumWizard = class(TNotifierObject, IOTAWIzard, IOTAMenuWizard) + public + function GetMenuText: string; + function GetIDString: string; + function GetName: string; + function GetState: TWizardState; + procedure Execute; + end; + +procedure Register; + +implementation + +procedure Register; +begin + RegisterPackageWizard(TphpWebWizard.Create as IOTAWizard); + RegisterPackageWizard(TphpForumWizard.Create as IOTAWizard); +end; + +procedure InitExpert; +begin + { stubbed out } +end; + +procedure DoneExpert; +begin + { stubbed out } +end; + +{ TphpWebWizard } + +procedure TphpWebWizard.Execute; +begin + ShellExecute(0, 'open', 'http://www.php.net', nil, nil, SW_SHOW); +end; + +function TphpWebWizard.GetIDString: string; +begin + Result := 'Perevoznyk.TphpWebWizard'; +end; + +function TphpWebWizard.GetMenuText: string; +begin + Result := 'PHP Home Page'; +end; + +function TphpWebWizard.GetName: string; +begin + Result := 'TphpWebWizard'; +end; + +function TphpWebWizard.GetState: TWizardState; +begin + Result := [wsEnabled]; +end; + + + +{ TphpForumWizard } + +procedure TphpForumWizard.Execute; +begin + ShellExecute(0, 'open', 'http://sourceforge.net/forum/forum.php?forum_id=324242', nil, nil, SW_SHOW); +end; + +function TphpForumWizard.GetIDString: string; +begin + Result := 'Perevoznyk.TphpForumWizard'; +end; + +function TphpForumWizard.GetMenuText: string; +begin + Result := 'PHP4Delphi Forum'; +end; + +function TphpForumWizard.GetName: string; +begin + Result := 'TphpForumWizard'; +end; + +function TphpForumWizard.GetState: TWizardState; +begin + Result := [wsEnabled]; +end; + +initialization + InitExpert; + +finalization + DoneExpert; + +end. diff --git a/readme.txt b/readme.txt index f461302..316d066 100644 --- a/readme.txt +++ b/readme.txt @@ -1,24 +1,19 @@ PHP4Delphi library PHP - Delphi interface and PHP extensions development framework -{ $Id: readme.txt,v 6.2 02/2006 delphi32 Exp $ } +{ $Id: readme.txt,v 7.4 2/2019 delphi32 Exp $ } -PHP4Delphi is a Delphi interface to PHP for Delphi 5, 6, 7, Delphi 2005 and Delphi 2006. +PHP4Delphi is a Delphi interface to PHP for Delphi 5, 6, 7, Delphi 2005 - Delphi Berlin PHP4Delphi consists of 3 big subprojects: -1. PHP scripting (using php as a scripting language in Delphi applications) +1. PHP scripting (using PHP as a scripting language in Delphi applications) PHP4Delphi allows to execute the PHP scripts within the Delphi program using -TpsvPHP component directly without a WebServer. TpsvPHP is not a component for -server-side development. It is a scripting for applications (like VBA for Office). +TpsvPHP component directly without a WebServer. It is a PHP extension that enables you to write client-side GUI applications. One of the goals behind it was to prove that PHP is a capable general-purpose scripting -language that is suited for more than just Web applications. It is intended for -creating standalone GUI applications. If you want to use PHP within your application -you can use Indy idHTTPServer component and idISAPIRunner + PHP4ISAPI or -idCGIRunner + php.exe. You will have exactly the same results as using IIS or Apache. -With php4Delphi you can use delphi forms instead of web-forms, pass parameters to -script directly, without using GET and POST methods. +language that is suited for more than just Web applications. +It is used by "Delphi for PHP" from CodeGear. 2. PHP extensions development framework (using Delphi to extend PHP functionality) Visual Development Framework gives possibility to create custom PHP @@ -34,17 +29,45 @@ More detail information available in php4Delphi manual php4Delphi.pdf This is a source-only release of php4Delphi. It includes -designtime and runtime packages for Delphi 5 through Delphi 2006. +design-time and run-time packages for Delphi 5 through Delphi Berlin -Warning: -PHP 4.3.5 gives some memory management troubles with php4delphi -This problem is fixed in PHP 4.3.6 History: +7.4 Feb 2019 +* Compatible with PHP 5.5.0 +* Compatible with PHP 5.6.0 +* Compatible with PHP 5.6 +* Compatible with Delphi 2011, XE8, Seattle, Berlin +* Deleted Sample Class +* Added Partial Unicode Support -6.2 +7.3 Jan 2019 +* Compatible with PHP 5.4.0 +7.2 Oct 2009 + +* Compatible with Delphi 2010 +* Compatible with PHP 5.2.11 +* Compatible with PHP 5.3.0 (VC6 and VC9 editions : see PHP.INC for more details) + +7.1 Oct 2008 + +* Compatible with Delphi 2009 + +7.0 Apr 2007 + +* Compatible with Delphi 2007 +* Compatible with PHP 5.2.1 +* Compatible with PHP 4.4.6 +* Thread safe TpsvPHP component +* New component TPHPEngine introduced +* RunCode method reimplemented to solve "black horror" of pipes. +* Not fully compatible with previous version due to multithreading, but migration is easy. + +6.2 Feb 2006 + +* Compatible with PHP 5.2.0 * Compatible with Delphi 2006 * Compatible with PHP 5.1.1 * Compatible with PHP 5.1.2 @@ -135,7 +158,12 @@ History: 5.0.1 * Fixed problem with number of parameters of zend_getparameters_ex function +5.0 +* First version written in Delphi + +1.0 - 4.0 +* php4Delphi was written in C as a DLL with simple Delphi wrapper Before using php4Delphi library: @@ -347,6 +375,44 @@ In "Package..." window click "Compile" button to compile the package and then click "Install" button to register php4Delphi Library components on the component palette. + +6. Delphi 2007: + +Uninstall previous installed version of php4Delphi Library from Delphi 2007 IDE. +Remove previously compiled php4Delphi packages from your hard disk. + +Select PHP version you are going to use. php4Delphi supports PHP 4.x and PHP 5.x, +but not at the same time. You have to compile php4Delphi for selected target version of PHP. + +Open PHP.INC file. +If you are using PHP5: +a) Comment (remove) PHP4 directive {$DEFINE PHP4} +b) Uncomment (remove dot) directive {$DEFINE PHP5} +c) Save PHP.INC file + +If you are using PHP4: +a) Comment (remove) PHP5 directive {$DEFINE PHP5} +b) Uncomment (remove dot) directive {$DEFINE PHP4} +c) If you are using PHP version 4.2.x...4.3.0 add {$DEFINE PHP430} and remove {$DEFINE PHP433} + If you are using PHP version 4.3.3...4.3.x add {$DEFINE PHP433} and remove {$DEFINE PHP430} +d) Save PHP.INC file + +Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime +package php4DelphiR2007.dpk. In "Package..." window click "Compile" button to +compile packages php4DelphiR2007.dpk. +Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS +"PATH" environment variable; +for example, in the Windows\System directory). + +After compiling php4Delphi run-time package you must install design-time +package into the IDE. + +Use "File\Open..." menu item to open design-time package php4DelphiD2007.dpk +In "Package..." window click "Compile" button to compile the package +and then click "Install" button to register php4Delphi Library +components on the component palette. + + Since this is a freeware you are strongly encouraged to look at the source code and improve on the components if you want to. Of course I would appreciate it if you would send me back the @@ -356,10 +422,17 @@ For more information on the PHP Group and the PHP project, please see . +PHP4Delphi forum +http://sourceforge.net/forum/forum.php?forum_id=324242 -Author: +Authors: Serhiy Perevoznyk Belgium +serge_perevoznyk@hotmail.com +http://users.telenet.be/ws36637 +http://delphi32.blogspot.com - +Andrew Zenin +Ukraine +kashaket@protonmail.com diff --git a/zend_dynamic_array.pas b/zend_dynamic_array.pas index 6fadad3..a6feffe 100644 --- a/zend_dynamic_array.pas +++ b/zend_dynamic_array.pas @@ -1,78 +1,78 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: zend_dynamic_array.pas,v 6.2 02/2006 delphi32 Exp $ } - -unit zend_dynamic_array; - -interface - uses - Windows, SysUtils; - -type - - - dynamic_array = record - _array : PChar; - element_size : UINT; - current : UINT; - allocated : UINT; - end; - - TDynamicArray = dynamic_array; - PDynamicArray = ^TDynamicArray; - -function zend_dynamic_array_init(da : PDynamicArray; element_size : UINT; size: UINT) : integer; cdecl; -function zend_dynamic_array_push(da : PDynamicArray) : pointer; cdecl; -function zend_dynamic_array_pop(da : PDynamicArray) : pointer; cdecl; -function zend_dynamic_array_get_element(da : PDynamicArray; index: UINT) : pointer; cdecl; - -implementation - -function zend_dynamic_array_init(da : PDynamicArray; element_size : UINT; size: UINT) : integer; cdecl; -begin - da^.element_size := element_size; - da^.allocated := size; - da^.current := 0; - da^._array := AllocMem(size*element_size); - if (da^._array = nil) then - Result := 1 - else - Result := 0; -end; - - -function zend_dynamic_array_push(da : PDynamicArray) : pointer; cdecl; -begin - if (da^.current = da^.allocated) then - begin - da^.allocated := da^.Allocated * 2; - da^._array := ReallocMemory (da^._array, da^.allocated*da^.element_size); - end; - Result := da^._array + (da^.current)*da^.element_size; - inc(da^.current); -end; - -function zend_dynamic_array_pop(da : PDynamicArray) : pointer; cdecl; -begin - dec(da^.current); - Result := da^._array + (da^.current)*da^.element_size; -end; - -function zend_dynamic_array_get_element(da : PDynamicArray; index: UINT) : pointer; cdecl; -begin - if (index >= da^.current) then - result := nil - else - Result := da^._array+index*da^.element_size; -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: zend_dynamic_array.pas,v 7.4 10/2009 delphi32 Exp $ } + +unit zend_dynamic_array; + +interface + uses + Windows, SysUtils; + +type + + + dynamic_array = record + _array : PAnsiChar; + element_size : UINT; + current : UINT; + allocated : UINT; + end; + + TDynamicArray = dynamic_array; + PDynamicArray = ^TDynamicArray; + +function zend_dynamic_array_init(da : PDynamicArray; element_size : UINT; size: UINT) : integer; cdecl; +function zend_dynamic_array_push(da : PDynamicArray) : pointer; cdecl; +function zend_dynamic_array_pop(da : PDynamicArray) : pointer; cdecl; +function zend_dynamic_array_get_element(da : PDynamicArray; index: UINT) : pointer; cdecl; + +implementation + +function zend_dynamic_array_init(da : PDynamicArray; element_size : UINT; size: UINT) : integer; cdecl; +begin + da^.element_size := element_size; + da^.allocated := size; + da^.current := 0; + da^._array := AllocMem(size*element_size); + if (da^._array = nil) then + Result := 1 + else + Result := 0; +end; + + +function zend_dynamic_array_push(da : PDynamicArray) : pointer; cdecl; +begin + if (da^.current = da^.allocated) then + begin + da^.allocated := da^.Allocated * 2; + da^._array := ReallocMemory (da^._array, da^.allocated*da^.element_size); + end; + Result := da^._array + (da^.current)*da^.element_size; + inc(da^.current); +end; + +function zend_dynamic_array_pop(da : PDynamicArray) : pointer; cdecl; +begin + dec(da^.current); + Result := da^._array + (da^.current)*da^.element_size; +end; + +function zend_dynamic_array_get_element(da : PDynamicArray; index: UINT) : pointer; cdecl; +begin + if (index >= da^.current) then + result := nil + else + Result := da^._array+index*da^.element_size; +end; + +end. From 3dd739f95e3ba41c6d33fb377e91509cff87a540 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 4 Mar 2019 22:05:37 +0200 Subject: [PATCH 02/54] Compatibility update --- .gitignore | 2 + DelphiFunctions.pas | 755 ++++++++++++- PHPAPI.pas | 26 +- PHPLibrary.pas | 334 +++++- ProjectGroup1.groupproj.local | 7 - ProjectGroup1_prjgroup.tvsconfig | 2 - php4DelphiD2010.dproj | 22 +- php4DelphiD7.dpk | 6 +- php4DelphiD7.dproj | 34 +- php4DelphiD7.res | Bin 1536 -> 1484 bytes php4DelphiD7.stat | 6 +- php4DelphiR2010.dpk | 1 - php4DelphiR2010.dproj | 29 +- php4DelphiR2010.stat | 6 +- php4DelphiR7.dpk | 6 +- php4DelphiR7.identcache | Bin 0 -> 856 bytes php4DelphiR7.res | Bin 1536 -> 1484 bytes php4DelphiR7.stat | 6 +- php4DelphiReg.pas | 4 +- php4DelphiSplash.res | Bin 0 -> 1724 bytes php4delphi.pas | 1003 ++++++++++------- ...oup1.groupproj => php4delphi2010.groupproj | 0 php4delphi2010.groupproj.local | 9 + phpCustomLibrary.pas | 177 --- 24 files changed, 1769 insertions(+), 666 deletions(-) create mode 100644 .gitignore delete mode 100644 ProjectGroup1.groupproj.local delete mode 100644 ProjectGroup1_prjgroup.tvsconfig create mode 100644 php4DelphiR7.identcache create mode 100644 php4DelphiSplash.res rename ProjectGroup1.groupproj => php4delphi2010.groupproj (100%) create mode 100644 php4delphi2010.groupproj.local delete mode 100644 phpCustomLibrary.pas diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b71af2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__history/ +__recovery/ diff --git a/DelphiFunctions.pas b/DelphiFunctions.pas index 3bfcaef..c8dc24b 100644 --- a/DelphiFunctions.pas +++ b/DelphiFunctions.pas @@ -1,38 +1,259 @@ {*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.telenet.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: DelphiFunctions.pas,v 7.4 10/2009 delphi32 Exp $ } - -unit DelphiFunctions; - -interface -uses - SysUtils, Classes, - ZendTypes, ZendAPI, PHPTypes, PHPAPI, VCL.Dialogs; - -{$ifdef fpc} - {$mode delphi} -{$endif} - -//proto string delphi_input_box(string caption, string prompt, string default) -{$IFDEF PHP510} -procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; - this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -implementation - +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: DelphiFunctions.pas,v 7.2 10/2009 delphi32 Exp $ } + +unit DelphiFunctions; + +interface +uses + SysUtils, Classes, + Controls, + ZendTypes, ZendAPI, PHPTypes, PHPAPI, Dialogs, typinfo, + Forms, stdctrls; + +{$ifdef fpc} + {$mode delphi} +{$endif} + +var + + author_class_entry : Tzend_class_entry; + delphi_object_entry : TZend_class_entry; + + object_functions : array[0..2] of zend_function_entry; + author_functions : array[0..2] of zend_function_entry; + + DelphiObject : pzend_class_entry; + ce : pzend_class_entry; + + {$IFDEF PHP5} + DelphiObjectHandlers : zend_object_handlers; + {$ENDIF} + + +procedure RegisterInternalClasses(p : pointer); + + +//proto string delphi_get_system_directory(void) +{$IFDEF PHP510} +procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_str_date(void) +{$IFDEF PHP510} +procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto float delphi_date(void) +{$IFDEF PHP510} +procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_extract_file_dir(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_extract_file_drive(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_extract_file_name(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_extract_file_ext(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto void delphi_show_message(string message) +{$IFDEF PHP510} +procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_input_box(string caption, string prompt, string default) +{$IFDEF PHP510} +procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; + this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +{$IFDEF PHP510} +procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +{$IFDEF PHP510} +procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +{$IFDEF PHP510} +procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +const + SimpleProps = [tkInteger, tkChar, tkEnumeration, tkFloat, + tkString, tkWChar, tkLString, tkWString, tkVariant]; + +implementation + + + +//proto string delphi_get_system_directory(void) +{$IFDEF PHP510} +procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto string delphi_str_date(void) +{$IFDEF PHP510} +procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + ZVAL_STRING(return_value, PAnsiChar(DateToStr(Date)), true); +end; + +//proto float delphi_date(void) +{$IFDEF PHP510} +procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + ZVAL_DOUBLE(return_value, Date); +end; + +//proto string delphi_extract_file_dir(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto string delphi_extract_file_drive(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto string delphi_extract_file_name(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto string delphi_extract_file_ext(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto void delphi_show_message(string message) +{$IFDEF PHP510} +procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +begin + +end; + + //proto string delphi_input_box(string caption, string prompt, string default) {$IFDEF PHP510} procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; @@ -51,6 +272,468 @@ procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; zend_get_parameters_my(ht, p, TSRMLS_DC); ZVAL_STRINGW(return_value, PWideChar(InputBox( Z_STRVAL(p[0]^), Z_STRVAL(p[1]^), Z_STRVAL(p[2]^) )), true); dispose_pzval_array(p); -end; - +end; + +//proto void delphi_send_message(void) +{$IFDEF PHP510} +procedure delphi_send_email(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_send_email(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + //ShellExecute(0, 'open', 'mailto:serge_perevoznyk@hotmail.com', nil, nil, SW_SHOWNORMAL); +end; + +//proto void delphi_visit_homepage(void) +{$IFDEF PHP510} +procedure delphi_visit_homepage(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_visit_homepage(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + //ShellExecute(0, 'open', 'http://users.chello.be/ws36637', nil, nil, SW_SHOW); +end; + + +//Delphi objects support + +{$IFDEF PHP510} +procedure delphi_object_classname(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_object_classname(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +{$IFDEF PHP510} +procedure delphi_object_classnameis(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_object_classnameis(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin +end; + + + +{$IFDEF PHP4} +function delphi_set_property_handler(property_reference : Pzend_property_reference; value : pzval) : integer; cdecl; +var + this_ptr : pzval; + OBJ : TObject; + data: ^ppzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + p : pointer; + propname : AnsiString; +// --> hupu, 2006.06.01 +// pt : TTypeKind; +{$IFDEF VERSION7} + Scripter : TPHPScriptableObject; +{$ELSE} + pt : TypInfo.TTypeKind; +{$ENDIF} +// <-- hupu, 2006.06.01 +begin + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + + this_ptr := property_reference^._object; + new(data); + zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); + Obj := TObject(data^^^.value.lval); + freemem(data); + +// --> hupu, 2006.06.01 +{$IFDEF VERSION7} + Scripter := TPHPScriptableObject(Obj); + if SameText('Parent', propname) then + begin + TWinControl(Scripter.InstanceObj).Parent := + TWinControl(value^.value.lval); + end + else + Scripter.SetPropertyByID(Scripter.NameToDispID(propname), + [zval2variant(value^)] ); +{$ELSE} +// <-- hupu, 2006.06.01 + + pt := PropType(Obj, propname); + if ( pt in SimpleProps) then + SetPropValue(OBJ, propname, zval2variant(value^)) + else + if pt = tkClass then + begin + Obj := GetObjectProp(Obj, propname); + while element <> nil do + begin + element := element^.prev; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + pt := PropType(Obj, propname); + if ( pt in SimpleProps) then + begin + SetPropValue(OBJ, propname, zval2variant(value^)); + break; + end + else + if pt = tkClass then + Obj := GetObjectProp(Obj, propname); + end; + end; + +// --> hupu, 2006.06.01 +{$ENDIF} +// <-- hupu, 2006.06.01 + Result := SUCCESS; +end; + + + +procedure delphi_get_property_handler(val : pzval; property_reference : PZend_property_reference); cdecl; +var + this_ptr : pzval; + OBJ : TObject; + data: ^ppzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + p : pointer; + propname : AnsiString; +// --> hupu, 2006.06.01 +// pt : TTypeKind; +{$IFDEF VERSION7} + Scripter : TPHPScriptableObject; +{$ELSE} + pt : TypInfo.TTypeKind; +{$ENDIF} +// <-- hupu, 2006.06.01 +begin + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + this_ptr := property_reference^._object; + new(data); + zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); + Obj := TObject(data^^^.value.lval); + freemem(data); + +// --> hupu, 2006.06.01 +{$IFDEF VERSION7} +Scripter := TPHPScriptableObject(Obj); +if SameText('Parent', propname) then +begin +TWinControl(Scripter.InstanceObj).Parent := +TWinControl(val^.value.lval); +end +else + +Scripter.SetPropertyByID(Scripter.NameToDispID(propname), +[zval2variant(val^)] ); +{$ELSE} +// <-- hupu, 2006.06.01 + pt := PropType(Obj, propname); + if ( pt in SimpleProps) then + variant2zval(GetPropValue(OBJ, propname), val) + else + if pt = tkClass then + begin + Obj := GetObjectProp(Obj, propname); + while element <> nil do + begin + element := element^.prev; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + pt := PropType(Obj, propname); + if ( pt in SimpleProps) then + begin + variant2zval(GetPropValue(OBJ, propname), val); + break; + end + else + if pt = tkClass then + Obj := GetObjectProp(Obj, propname); + end; + end; +// --> hupu, 2006.06.01 +{$ENDIF} +// <-- hupu, 2006.06.01 +end; + + + +procedure _delphi_get_property_wrapper; assembler; +asm + push ebp + mov ebp,esp + sub esp,50h + push ebx + push esi + push edi + lea edi,[ebp-50h] + mov ecx,14h + mov eax,0CCCCCCCCh + rep stosd + mov eax,dword ptr [ebp+0Ch] + push eax + lea ecx,[ebp-10h] + push ecx + call delphi_get_property_handler + add esp,8 + mov edx,dword ptr [ebp+8] + mov eax,dword ptr [ebp-10h] + mov dword ptr [edx],eax + mov ecx,dword ptr [ebp-0Ch] + mov dword ptr [edx+4],ecx + mov eax,dword ptr [ebp-8] + mov dword ptr [edx+8],eax + mov ecx,dword ptr [ebp-4] + mov dword ptr [edx+0Ch],ecx + mov eax,dword ptr [ebp+8] + + pop edi + pop esi + pop ebx + add esp,50h + cmp ebp,esp + mov esp,ebp + pop ebp + ret +end; + + +procedure delphi_call_function(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; +var + OBJ : TObject; + data: ^ppzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + p : pointer; + MethodName : AnsiString; + Params : pzval_array; + M, D : integer; +begin + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + MethodName := prop^.element.value.str.val; + this_ptr := property_reference^._object; + new(data); + zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); + Obj := TObject(data^^^.value.lval); + freemem(data); + if ( Obj.InheritsFrom(TCustomEdit) ) then + begin + if SameText(MethodName, 'Clear') then + TCustomEdit(Obj).Clear; + if SameText(MethodName, 'ClearSelection') then + TCustomEdit(Obj).ClearSelection; + if SameText(MethodName, 'CopyToClipboard') then + TCustomEdit(Obj).CopyToClipboard; + if SameText(MethodName, 'ControlCount') then + ZVAL_LONG(return_value, TCustomEdit(Obj).ControlCount); + if SameText(MethodName, 'ScaleBy') then + begin + if ht > 0 then + begin + if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + end; + M := Params[0]^.value.lval; + D := Params[1]^.value.lval; + TCustomEdit(Obj).ScaleBy(M, D); + dispose_pzval_array(Params); + end; + end; +end; +{$ENDIF} + + + +{$IFDEF PHP5} + +// Read object property value (getter) +function delphi_get_property_handler(_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; +begin + +end; + +// Write object property value (setter) +procedure delphi_set_property_handler(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; +begin + +end; + +{$IFDEF PHP510} +function delphi_call_method(method : PAnsiChar; ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; +{$ELSE} +function delphi_call_method(method : PAnsiChar; ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; +{$ENDIF} +begin + +end; + +function delphi_get_method(_object : pzval; method_name : PAnsiChar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; + +begin + +end; + + +{$ENDIF} + +{$IFDEF PHP510} +procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + properties : array[0..3] of PAnsiChar; +begin + properties[0] := 'name'; + properties[1] := 'last'; + properties[2] := 'height'; + properties[3] := 'email'; + {$IFDEF PHP4} + _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); + {$ELSE} + object_init(return_value, ce, TSRMLS_DC ); + {$ENDIF} + + {$IFDEF PHP4} + add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); + add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1); + {$ELSE} + add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); + add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1, TSRMLS_DC); + {$ENDIF} + + {$IFDEF PHP5} + add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); + {$ELSE} + add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); + {$ENDIF} + + {$IFDEF PHP4} + add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1); + {$ELSE} + add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1, TSRMLS_DC); + {$ENDIF} +end; + + + + +{$IFDEF PHP510} +procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +begin + +end; + +{$IFDEF PHP510} +procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +begin + + +end; + + + +procedure RegisterInternalClasses(p : pointer); + +begin + object_functions[0].fname := 'delphi_classname'; + object_functions[0].handler := @delphi_object_classname; + + object_functions[1].fname := 'delphi_classnameis'; + object_functions[1].handler := @delphi_object_classnameis; + + object_functions[2].fname := nil; + object_functions[2].handler := nil; + + INIT_CLASS_ENTRY(delphi_object_entry, 'delphi_class' , @object_functions); + + {$IFDEF PHP4} + Delphi_Object_Entry.handle_property_get := @_delphi_get_property_wrapper; + Delphi_Object_Entry.handle_property_set := @delphi_set_property_handler; + Delphi_Object_Entry.handle_function_call := @delphi_call_function; + {$ELSE} + Move(zend_get_std_object_handlers()^, DelphiObjectHandlers, sizeof(zend_object_handlers)); + DelphiObjectHandlers.read_property := @delphi_get_property_handler; + DelphiObjecthandlers.write_property := @delphi_set_property_handler; + DelphiObjectHandlers.call_method := @delphi_call_method; + DelphiObjectHandlers.get_method := @delphi_get_method; + {$ENDIF} + + DelphiObject := zend_register_internal_class(@delphi_object_entry, p); + + author_functions[0].fname := 'send_email'; + author_functions[0].handler := @delphi_send_email; + + author_functions[1].fname := 'visit_homepage'; + author_functions[1].handler := @delphi_visit_homepage; + + author_functions[2].fname := nil; + author_functions[2].handler := nil; + INIT_CLASS_ENTRY(author_class_entry, 'php4delphi_author', @author_functions); + ce := zend_register_internal_class(@author_class_entry, p); + +end; + +{$IFDEF VERSION7} + +{ +Delphi scripting support +The Original Code is: JvOle2Auto.PAS, released on 2002-07-04. +The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev +Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev +Copyright (c) 2001,2002 SGB Software +All Rights Reserved. +} + + +function WashVariant(const Value: Variant): OleVariant; +begin + if TVarData(Value).VType = (varString or varByRef) then + Result := PString(TVarData(VAlue).VString)^ + '' + else + Result := Value; +end; + + + +{$ENDIF} + end. diff --git a/PHPAPI.pas b/PHPAPI.pas index 836aba9..ca2662a 100644 --- a/PHPAPI.pas +++ b/PHPAPI.pas @@ -128,7 +128,8 @@ interface function GetSymbolsTable : PHashTable; function GetTrackHash(Name : AnsiString) : PHashTable; -function GetSAPIGlobals : Psapi_globals_struct; +function GetSAPIGlobals : Psapi_globals_struct; overload; +function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; //procedure phperror(Error : PAnsiChar); var @@ -401,7 +402,28 @@ function GetSAPIGlobals : Psapi_globals_struct; Result := sapi_globals; end; end; - +function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; +var + sapi_global_id : pointer; + sapi_globals_value : integer; + sapi_globals : Psapi_globals_struct; + +begin + Result := nil; + sapi_global_id := GetProcAddress(PHPLib, 'sapi_globals_id'); + if Assigned(sapi_global_id) then + begin + sapi_globals_value := integer(sapi_global_id^); + asm + mov ecx, sapi_globals_value + mov edx, dword ptr tsrmls_dc + mov eax, dword ptr [edx] + mov ecx, dword ptr [eax+ecx*4-4] + mov sapi_globals, ecx + end; + Result := sapi_globals; + end; +end; function zval2variant(value : zval) : variant; begin diff --git a/PHPLibrary.pas b/PHPLibrary.pas index bf02a6b..b2fec34 100644 --- a/PHPLibrary.pas +++ b/PHPLibrary.pas @@ -22,12 +22,13 @@ interface ZendTypes, ZendAPI, PHPTypes, PHPAPI, - phpCustomLibrary, + php4delphi, phpFunctions; type TPHPLibrary = class(TCustomPHPLibrary) published + property Executor; property LibraryName; property Functions; end; @@ -59,6 +60,52 @@ TPHPSimpleLibrary = class(TCustomPHPLibrary) destructor Destroy; override; end; + TPHPSystemLibrary = class(TPHPSimpleLibrary) + protected + {System procedures} + procedure RoundProc; + procedure TruncProc; + procedure CopyProc; + procedure PosProc; + procedure LengthProc; + {SysUtils procedures} + procedure UpperCaseProc; + procedure LowerCaseProc; + procedure CompareStrProc; + procedure CompareTextProc; + procedure AnsiUpperCaseProc; + procedure AnsiLowerCaseProc; + procedure AnsiCompareStrProc; + procedure AnsiCompareTextProc; + procedure IsValidIdentProc; + procedure IntToStrProc; + procedure IntToHexProc; + procedure StrToIntProc; + procedure StrToIntDefProc; + procedure FloatToStrProc; + procedure FormatFloatProc; + procedure StrToFloatProc; + procedure EncodeDateProc; + procedure EncodeTimeProc; + procedure DayOfWeekProc; + procedure DateProc; + procedure TimeProc; + procedure NowProc; + procedure IncMonthProc; + procedure IsLeapYearProc; + procedure DateToStrProc; + procedure TimeToStrProc; + procedure DateTimeToStrProc; + procedure StrToDateProc; + procedure StrToTimeProc; + procedure StrToDateTimeProc; + procedure BeepProc; + procedure RandomProc; + public + procedure Refresh; override; + published + property Executor; + end; implementation { TPHPSimpleLibrary } @@ -199,4 +246,289 @@ destructor TPHPSimpleLibrary.Destroy; inherited; end; + +{ TPHPSystemLibrary } +procedure TPHPSystemLibrary.Refresh; +begin + Functions.Clear; + RegisterMethod( 'sys_UpperCase', 'System.UpperCase', + UpperCaseProc, [tpString] ) ; + RegisterMethod( 'sys_LowerCase', 'System.LowerCase', + LowerCaseProc, [tpString] ); + RegisterMethod( 'sys_CompareStr', 'System.CompareStr', + CompareStrProc, [tpString, tpString] ); + RegisterMethod( 'sys_CompareText', 'System.CompareText', + CompareTextProc, [tpString, tpString] ); + RegisterMethod( 'sys_AnsiUpperCase', 'System.AnsiUpperCase', + AnsiUpperCaseProc, [tpString] ); + RegisterMethod( 'sys_AnsiLowerCase', 'System.AnsiLowerCase', + AnsiLowerCaseProc, [tpString] ); + RegisterMethod( 'sys_AnsiCompareStr', 'System.AnsiCompareStr', + AnsiCompareStrProc, [tpString, tpString] ); + RegisterMethod( 'sys_AnsiCompareText', 'System.AnsiCompareText', + AnsiCompareTextProc, [tpString, tpString] ); + RegisterMethod( 'sys_IsValidIdent', 'System.IsValidIndent', + IsValidIdentProc, [tpString] ); + RegisterMethod( 'sys_IntToStr', 'System.IntToStr', + IntToStrProc, [tpInteger] ); + RegisterMethod( 'sys_IntToHex', 'System.IntToHex', + IntToHexProc, [tpInteger, tpInteger] ); + RegisterMethod( 'sys_StrToInt', 'System.StrToInt', + StrToIntProc, [tpString] ); + RegisterMethod( 'sys_StrToIntDef','System.StrToIntDef', + StrToIntDefProc, [tpString, tpInteger] ); + RegisterMethod( 'sys_FloatToStr', 'System.FloatToStr', + FloatToStrProc, [tpFloat] ); + RegisterMethod( 'sys_FormatFloat','System.FormatFloat', + FormatFloatProc, [tpString, tpFloat] ); + RegisterMethod( 'sys_StrToFloat', 'System.StrToFloat', + StrToFloatProc, [tpString] ); + RegisterMethod( 'sys_EncodeDate', 'System.EncodeDate', + EncodeDateProc, [tpInteger, tpInteger, tpInteger] ); + RegisterMethod( 'sys_EncodeTime', 'System.EncodeTime', + EncodeTimeProc, [tpInteger, tpInteger, tpInteger, tpInteger] ); + RegisterMethod( 'sys_DayOfWeek', 'System.GetDayOfWeek', + DayOfWeekProc, [tpFloat] ); + RegisterMethod( 'sys_Date', 'System.GetDate', + DateProc, [] ); + RegisterMethod( 'sys_Time', 'System.GetTime', + TimeProc, [] ); + RegisterMethod( 'sys_Now', 'System.GetDateNow', + NowProc, [] ); + RegisterMethod( 'sys_IncMonth', 'System.IncMonth', + IncMonthProc, [tpFloat, tpInteger] ); + RegisterMethod( 'sys_IsLeapYear', 'System.IsLeapYear', + IsLeapYearProc, [tpInteger] ); + RegisterMethod( 'sys_DateToStr', 'System.DateToStr', + DateToStrProc, [tpFloat] ); + RegisterMethod( 'sys_TimeToStr', 'System.TimeToStr', + TimeToStrProc, [tpFloat] ); + RegisterMethod( 'sys_DateTimeToStr','System.DateTimeToStr', + DateTimeToStrProc, [tpFloat] ); + RegisterMethod( 'sys_StrToDate', 'System.StrToDate', + StrToDateProc, [tpString] ); + RegisterMethod( 'sys_StrToTime', 'System.StrToTime', + StrToTimeProc, [tpString] ); + RegisterMethod( 'sys_StrToDateTime','System.StrToDateTime', + StrToDateTimeProc, [tpString] ); + RegisterMethod( 'sys_Beep', 'System.MessageBeep', + BeepProc, [] ); + RegisterMethod( 'sys_Round', 'System.Round', + RoundProc, [tpFloat] ); + RegisterMethod( 'sys_Trunc', 'System.StrTruncate', + TruncProc, [tpFloat] ); + RegisterMethod( 'sys_Copy', 'System.StrCopy', + CopyProc, [tpString, tpInteger, tpInteger] ); + RegisterMethod( 'sys_Pos', 'System.StrPos', + PosProc, [tpString, tpString] ); + RegisterMethod( 'sys_Length', 'System.Length', + LengthProc, [tpString] ); + RegisterMethod( 'sys_Random', 'System.Random', + RandomProc, [] ); + + inherited; + +end; +procedure TPHPSystemLibrary.UpperCaseProc; +begin + ReturnOutputArg( UpperCase( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.LowerCaseProc; +begin + ReturnOutputArg( LowerCase( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.CompareStrProc; +begin + ReturnOutputArg( CompareStr( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); +end; + +procedure TPHPSystemLibrary.CompareTextProc; +begin + ReturnOutputArg( CompareText( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); +end; + +procedure TPHPSystemLibrary.AnsiUpperCaseProc; +begin + ReturnOutputArg( AnsiUpperCase( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.AnsiLowerCaseProc; +begin + ReturnOutputArg( AnsiLowerCase( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.AnsiCompareStrProc; +begin + ReturnOutputArg( AnsiCompareStr( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); +end; + +procedure TPHPSystemLibrary.AnsiCompareTextProc; +begin + ReturnOutputArg( AnsiCompareText( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); +end; + + +procedure TPHPSystemLibrary.IsValidIdentProc; +begin + ReturnOutputArg( IsValidIdent( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.IntToStrProc; +begin + ReturnOutputArg( IntToStr( GetInputArgAsInteger( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.IntToHexProc; +begin + ReturnOutputArg( IntToHex( GetInputArgAsInteger( 0 ),GetInputArgAsInteger( 1 ) ) ); +end; + +procedure TPHPSystemLibrary.StrToIntProc; +begin + ReturnOutputArg( StrToInt( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.StrToIntDefProc; +begin + ReturnOutputArg( StrToIntDef( GetInputArgAsString( 0 ),GetInputArgAsInteger( 1 ) ) ); +end; + +procedure TPHPSystemLibrary.FloatToStrProc; +begin + ReturnOutputArg( FloatToStr( GetInputArgAsFloat( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.FormatFloatProc; +begin + ReturnOutputArg( FormatFloat( GetInputArgAsString( 0 ),GetInputArgAsFloat( 1 ) ) ); +end; + +procedure TPHPSystemLibrary.StrToFloatProc; +begin + ReturnOutputArg( StrToFloat( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.EncodeDateProc; +begin + ReturnOutputArg( EncodeDate( + GetInputArgAsInteger( 0 ), + GetInputArgAsInteger( 1 ), + GetInputArgAsInteger( 2 ) ) ); +end; + +procedure TPHPSystemLibrary.EncodeTimeProc; +begin + ReturnOutputArg( EncodeTime( + GetInputArgAsInteger( 0 ), + GetInputArgAsInteger( 1 ), + GetInputArgAsInteger( 2 ), + GetInputArgAsInteger( 3 ) ) ); +end; + + + +procedure TPHPSystemLibrary.DayOfWeekProc; +begin + ReturnOutputArg( DayOfWeek( GetInputArgAsDateTime( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.DateProc; +begin + ReturnOutputArg( Date ); +end; + +procedure TPHPSystemLibrary.TimeProc; +begin + ReturnOutputArg( Time ); +end; + +procedure TPHPSystemLibrary.NowProc; +begin + ReturnOutputArg( Now ); +end; + +procedure TPHPSystemLibrary.IncMonthProc; +begin + ReturnOutputArg( IncMonth( GetInputArgAsDateTime( 0 ),GetInputArgAsInteger( 1 ) ) ); +end; + +procedure TPHPSystemLibrary.IsLeapYearProc; +begin + ReturnOutputArg( IsLeapYear( GetInputArgAsInteger( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.DateToStrProc; +begin + ReturnOutputArg( DateToStr( GetInputArgAsDateTime( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.TimeToStrProc; +begin + ReturnOutputArg( TimeToStr( GetInputArgAsDateTime( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.DateTimeToStrProc; +begin + ReturnOutputArg( DateTimeToStr( GetInputArgAsDateTime( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.StrToDateProc; +begin + ReturnOutputArg( StrToDate( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.StrToTimeProc; +begin + ReturnOutputArg( StrToTime( GetInputArgAsString( 0 ) ) ); +end; + +procedure TPHPSystemLibrary.StrToDateTimeProc; +begin + ReturnOutputArg( StrToDateTime( GetInputArgAsString( 0 ) ) ); +end; + + +procedure TPHPSystemLibrary.BeepProc; +begin + Beep; +end; + + +procedure TPHPSystemLibrary.RoundProc; +begin + ReturnOutputArg( Integer(Round( GetInputArgAsFloat( 0 ) )) ); +end; + +procedure TPHPSystemLibrary.TruncProc; +begin + ReturnOutputArg( Integer(Trunc( GetInputArgAsFloat( 0 ) )) ); +end; + +procedure TPHPSystemLibrary.CopyProc; +begin + ReturnOutputArg( Copy( + GetInputArgAsString( 0 ), + GetInputArgAsInteger( 1 ), + GetInputArgAsInteger( 2 ) ) ); +end; + + +procedure TPHPSystemLibrary.PosProc; +begin + ReturnOutputArg( pos(GetInputArgAsString( 0 ),GetInputArgAsString( 1 )) ); +end; + +procedure TPHPSystemLibrary.LengthProc; +begin + ReturnOutputArg( Length( GetInputArgAsString( 0 ) ) ); +end; + + +procedure TPHPSystemLibrary.RandomProc; +begin + ReturnOutputArg( Random ); +end; + end. \ No newline at end of file diff --git a/ProjectGroup1.groupproj.local b/ProjectGroup1.groupproj.local deleted file mode 100644 index eaa4e24..0000000 --- a/ProjectGroup1.groupproj.local +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/ProjectGroup1_prjgroup.tvsconfig b/ProjectGroup1_prjgroup.tvsconfig deleted file mode 100644 index d430780..0000000 --- a/ProjectGroup1_prjgroup.tvsconfig +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/php4DelphiD2010.dproj b/php4DelphiD2010.dproj index 5fcb4e2..55f8e94 100644 --- a/php4DelphiD2010.dproj +++ b/php4DelphiD2010.dproj @@ -123,16 +123,7 @@ True - - - 0 - .dll;.bpl - - - 1 - .dylib - - + Contents\Resources @@ -471,7 +462,16 @@ 1 - + + + 0 + .dll;.bpl + + + 1 + .dylib + + diff --git a/php4DelphiD7.dpk b/php4DelphiD7.dpk index 30cc098..68906e2 100644 --- a/php4DelphiD7.dpk +++ b/php4DelphiD7.dpk @@ -30,7 +30,7 @@ package php4DelphiD7; {$DESIGNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl, designide, @@ -38,11 +38,11 @@ rrequires vclx, php4DelphiR7; -ocontains +contains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpWeb in 'phpWeb.pas', phpAbout in 'phpAbout.pas' {dlgAbout}; -d. +end. diff --git a/php4DelphiD7.dproj b/php4DelphiD7.dproj index e8c52f4..107e6cb 100644 --- a/php4DelphiD7.dproj +++ b/php4DelphiD7.dproj @@ -13,6 +13,11 @@ true + + true + Base + true + true Base @@ -23,11 +28,6 @@ Base true - - true - Base - true - true Base @@ -56,6 +56,11 @@ true CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true php4DelphiD7_Icon.ico @@ -67,10 +72,6 @@ php4DelphiD7_Icon.ico - - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - RELEASE;$(DCC_Define) false @@ -87,6 +88,19 @@ MainSource + + + + + + + + + + + +
dlgAbout
+
Cfg_2 Base @@ -110,8 +124,6 @@ False - False - False True False diff --git a/php4DelphiD7.res b/php4DelphiD7.res index 622f41eab49baf28d58b8321323089fcd9dbff9c..f3638e82476ea2a42539a43161883151c2a46b56 100644 GIT binary patch delta 311 zcmZqRIm10cL6L!pfkA4k*Dm`7N`&v=xX2 zRABvXE02FayNM*3eQ9+E6bECN^GqZsJ=VX6oSqGqZ8Ek;~|9>u^Ej|p63?U3|4E_v3 X48A~?Ban7ya0Rl0!KR^x1t@d?AaOB3 delta 347 zcmX@Z-M}+JVX_007^CFoa3)b^W&r`o$@#3Zj3pBlg?WJ-76vFNndlhJdWjLpo48Qk zejSLxV8CF)V8~zzrd=6~fg(x_j6mqjkk63IP{5GLkjGHT;0L608B#$Sz(9+EapG;& z$r6kv^$_KrKxHLB1w}wQks$|7gBsXKAE10XSQcb>0npeYhD@MH22dy5SfEOTx)7j> zM1~ZgzFZ((#E{KU3{}a%0CWNn`fET9$%I<$1~f7Ur~%{*go}ZWob1miJGq6?LQx8= a5#m3P3XsEL#=3xvpUlW)%_7P2m<0eH?lhhN diff --git a/php4DelphiD7.stat b/php4DelphiD7.stat index 4babac3..40ad9b8 100644 --- a/php4DelphiD7.stat +++ b/php4DelphiD7.stat @@ -1,9 +1,9 @@ [Stats] -EditorSecs=2 +EditorSecs=57 DesignerSecs=1 InspectorSecs=1 -CompileSecs=1 -OtherSecs=55 +CompileSecs=20209 +OtherSecs=85 StartTime=21.09.2018 13:19:38 RealKeys=0 EffectiveKeys=0 diff --git a/php4DelphiR2010.dpk b/php4DelphiR2010.dpk index eb75ee8..8ffc056 100644 --- a/php4DelphiR2010.dpk +++ b/php4DelphiR2010.dpk @@ -41,7 +41,6 @@ contains PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', diff --git a/php4DelphiR2010.dproj b/php4DelphiR2010.dproj index 9d3e166..1449082 100644 --- a/php4DelphiR2010.dproj +++ b/php4DelphiR2010.dproj @@ -89,7 +89,6 @@ - @@ -125,7 +124,22 @@ True - + + + php4DelphiR2010.bpl + true + + + + + 0 + .dll;.bpl + + + 1 + .dylib + + Contents\Resources @@ -464,16 +478,7 @@ 1 - - - 0 - .dll;.bpl - - - 1 - .dylib - - + diff --git a/php4DelphiR2010.stat b/php4DelphiR2010.stat index e92f52a..b978fd4 100644 --- a/php4DelphiR2010.stat +++ b/php4DelphiR2010.stat @@ -1,9 +1,9 @@ [Stats] -EditorSecs=123 +EditorSecs=2911 DesignerSecs=1 InspectorSecs=3 -CompileSecs=26547 -OtherSecs=230 +CompileSecs=63757 +OtherSecs=325 StartTime=29.07.4016 22:02:01 RealKeys=0 EffectiveKeys=0 diff --git a/php4DelphiR7.dpk b/php4DelphiR7.dpk index c6afa2d..c9c30ff 100644 --- a/php4DelphiR7.dpk +++ b/php4DelphiR7.dpk @@ -30,11 +30,11 @@ package php4DelphiR7; {$RUNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl; -ocontains +contains ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', @@ -48,4 +48,4 @@ ocontains phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -d. +end. diff --git a/php4DelphiR7.identcache b/php4DelphiR7.identcache new file mode 100644 index 0000000000000000000000000000000000000000..5416a4118405a623d0c0f6bb70852ad19a744896 GIT binary patch literal 856 zcmb`F%L>9U5Jmd|ev2#dQ3NfmT0tcX-AFcl1R7`_WD=x*Z*-xM)Wv|apToUpW|AaH zny2&z%mB?~YuJMps&Rrz3-rKk>1wJwJ!@I7J5EVSPP{gi8K$}dzx|mN26NwCitC^m zgp>`2QoJ+moop;uGGZ+;EZ;HjD~KQ{J6};@FH{yUc~lNI%UQLqj~#EZUL05@{&99+ hELTD(8S0s1B6&(ijv-=!LA?HNgt5jje2ky3_XI254c7nw literal 0 HcmV?d00001 diff --git a/php4DelphiR7.res b/php4DelphiR7.res index 622f41eab49baf28d58b8321323089fcd9dbff9c..400a713a6e220e0aea66d0671aba40ea5de7c729 100644 GIT binary patch delta 311 zcmZqRIm10cL6L!pfkA4k*Dm`7N`&v=xX2 zRABvXE02FayNM*sn!Fl z0jXr1e2~?eg_Gq8%R~h+M$V1qqRh+&0-TfmnPnY--es@>;{X4-fVTKBI5LDVxH0$x Y-RKKsIRa^S23H^}7;GA9Sb#zY05r)lTmS$7 delta 347 zcmX@Z-M}+JVX_007^CFoa3)b^W&r`o$@#3Zj3pBlg?WJ-76vFNndlhJdWjLpo48Qk zejSLxV8CF)V8~zzrd=6~fg(x_j6mqjkk63IP{5GLkjGHT;0L608B#$Sz(9+EapG;& z$r6kv^$_KrKxHLB1w}wQks$|7gBsXKAE10XSQcb>0npeYhD@MH22dy5SfEOTx)7j> zM1~ZgzFZ((#E{KU3{}a%0CWNn`fET9$%I<$1~f7Ur~%{*go}ZWob1miJGq6?LQx8= a5#m3P3XsEL#=3xvpUlW)%_7P2m<0eH?lhhN diff --git a/php4DelphiR7.stat b/php4DelphiR7.stat index 52b7df0..d2541d1 100644 --- a/php4DelphiR7.stat +++ b/php4DelphiR7.stat @@ -1,9 +1,9 @@ [Stats] -EditorSecs=1 +EditorSecs=157 DesignerSecs=1 InspectorSecs=1 -CompileSecs=1 -OtherSecs=1 +CompileSecs=5944 +OtherSecs=23 StartTime=21.09.2018 3:08:01 RealKeys=0 EffectiveKeys=0 diff --git a/php4DelphiReg.pas b/php4DelphiReg.pas index 7909619..6b869de 100644 --- a/php4DelphiReg.pas +++ b/php4DelphiReg.pas @@ -28,8 +28,7 @@ interface ShlObj, ZendAPI, PHPAPI, PHP4Delphi, phpAbout, phpModules, phpLibrary, ShellAPI, - phpClass, - phpCustomLibrary; + phpClass; type TScriptFileProperty = class(TStringProperty) @@ -99,6 +98,7 @@ procedure Register; RegisterComponents('PHP', [TpsvPHP]); RegisterComponents('PHP', [TPHPLibrary]); RegisterComponents('PHP', [TPHPClass]); + RegisterComponents('PHP', [TPHPSystemLibrary]); RegisterPropertyEditor(TypeInfo(String), TpsvPHP, 'FileName', TScriptFileProperty); RegisterPropertyEditor(TypeInfo(TPHPAboutInfo), TPHPComponent, 'About', TPHPVersionEditor); RegisterPropertyEditor(TypeInfo(TPHPAboutInfo), TCustomPHPExtension, 'About', TphpVersionEditor); diff --git a/php4DelphiSplash.res b/php4DelphiSplash.res new file mode 100644 index 0000000000000000000000000000000000000000..b045de382750c999060c7f60748edc12ad158893 GIT binary patch literal 1724 zcmbW%yKdA#6vpubLS(n2q?`)TrQrci0TM_QJOIThz@l20ZqIwr9EnRAx@@_p<{2nv zQxXcKpiO}y^S37p;aV`>pTD_yyuOSqB2qAp4b`8@i<=_%=o!cB@Bkf`moX(1H`M<7w#E44x@ z430pew%5&{xGM~fK%%y#5QS729Dzh_%One_FgOBRkP3q%kf?3hX(1H`M<7w#lC(l9430pew&m)DR2UqAL~Tns3aKzS0*Ts|c@|P( zaD;sRI?8K~bI!+?WByGa7;0dfzcr&=d@mj4dt+aD^YYVbv*};GTJ3wLJbgN>o=^R& zZvFhnz{#_LzJ9YA7#p7M2Tqnp^lf$&V(3oV!0Fj?WMH=$hH2OBzHH}#?Z|~Np*uS6 z)|;Nja++~^Hg;vgx= za-xrC%f&(WZaD1k-02Vdb$77%vgJfe%JFJF^oJBqvpS+. } - unit php4delphi; interface - - uses - Windows, Messages, SysUtils, Classes, VCL.Graphics, WinSock, - PHPCommon, - ZendTypes, - PHPTypes, - zendAPI, - PHPAPI, - DelphiFunctions, - PHPCustomLibrary, vcl.dialogs, strUtils, varUtils, + Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, + PHPCommon, WinApi.WinSock, + ZendTypes, PHPTypes, PHPAPI, ZENDAPI, + DelphiFunctions, phpFunctions, strUtils, varUtils, System.UITypes; type + IPHPEngine = interface (IUnknown) + ['{484AE2CA-755A-437C-9B60-E3735973D0A9}'] + procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); + function GetEngineActive : boolean; + end; + TPHPMemoryStream = class(TMemoryStream) + public + constructor Create; + procedure SetInitialSize(ASize : integer); + end; + {-- PHP Events --} TPHPLogMessage = procedure (Sender : TObject; AText : AnsiString) of object; TPHPErrorEvent = procedure (Sender: TObject; AText: AnsiString; AType: integer; AFileName: AnsiString; ALineNo: integer) of object; TPHPReadPostEvent = procedure(Sender : TObject; Stream : TStream) of object; TPHPReadResultEvent = procedure(Sender : TObject; Stream : TStream) of object; - TPHPMemoryStream = class(TMemoryStream) - public - constructor Create; - procedure SetInitialSize(ASize : integer); - end; - - TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) - private - FINIPath : AnsiString; - FOnEngineStartup : TNotifyEvent; - FOnEngineShutdown : TNotifyEvent; - FEngineActive : boolean; - FHandleErrors : boolean; - {$IFNDEF PHP540} - FSafeMode : boolean; - FSafeModeGid : boolean; - {$ENDIF} - FRegisterGlobals : boolean; - FHTMLErrors : boolean; - FMaxInputTime : integer; - FConstants : TphpConstants; - FDLLFolder : AnsiString; - FReportDLLError : boolean; - FLock: TRTLCriticalSection; - FOnScriptError : TPHPErrorEvent; - FOnLogMessage : TPHPLogMessage; - FWaitForShutdown : boolean; - FHash : TStringList; - FLibraryModule : Tzend_module_entry; - FLibraryEntryTable : array of zend_function_entry; - FRequestCount : integer; - procedure SetConstants(Value : TPHPConstants); - function GetConstantCount: integer; - function GetEngineActive : boolean; - protected - MyFuncs: TStringList; - TSRMLS_D : pppointer; - procedure StartupPHP; virtual; - procedure PrepareEngine; virtual; - procedure PrepareIniEntry; virtual; - procedure RegisterConstants; virtual; - procedure RegisterInternalConstants(TSRMLS_DC : pointer); virtual; - procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); virtual; - property RequestCount : integer read FRequestCount; - procedure HandleError (Sender : TObject; AText : string; AType : Integer; AFileName : string; ALineNo : integer); - procedure HandleLogMessage(Sender : TObject; AText : string); - procedure RegisterLibrary(ALib : TCustomPHPLibrary); - procedure RefreshLibrary; - procedure UnlockLibraries; - procedure RemoveRequest; - procedure AddRequest; - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - procedure AddFunction(FN: AnsiString; Func: Pointer); - procedure StartupEngine; virtual; - procedure ShutdownEngine; virtual; - procedure LockEngine; virtual; - procedure UnlockEngine; virtual; - procedure PrepareForShutdown; virtual; - property EngineActive : boolean read GetEngineActive; - property ConstantCount : integer read GetConstantCount; - property WaitForShutdown : boolean read FWaitForShutdown; - procedure ShutdownAndWaitFor; virtual; - property LibraryEntry : Tzend_module_entry read FLibraryModule; - published - property HandleErrors : boolean read FHandleErrors write FHandleErrors default true; - property OnEngineStartup : TNotifyEvent read FOnEngineStartup write FOnEngineStartup; - property OnEngineShutdown : TNotifyEvent read FOnEngineShutdown write FOnEngineShutdown; - property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; - property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; - property IniPath : AnsiString read FIniPath write FIniPath; - {$IFNDEF PHP540} - property SafeMode : boolean read FSafeMode write FSafeMode default false; - property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; - {$ENDIF} - property RegisterGlobals : boolean read FRegisterGlobals write FRegisterGlobals default true; - property HTMLErrors : boolean read FHTMLErrors write FHTMLErrors default false; - property MaxInputTime : integer read FMaxInputTime write FMaxInputTime default 0; - property Constants : TPHPConstants read FConstants write SetConstants; - property DLLFolder : AnsiString read FDLLFolder write FDLLFolder; - property ReportDLLError : boolean read FReportDLLError write FReportDLLError; - end; - + { TpsvCustomPHP } TpsvCustomPHP = class(TPHPComponent) private FHeaders : TPHPHeaders; @@ -157,6 +76,8 @@ TpsvCustomPHP = class(TPHPComponent) FTerminated : boolean; FVariables : TPHPVariables; FBuffer : TPHPMemoryStream; + FOnLogMessage : TPHPLogMessage; + FOnScriptError : TPHPErrorEvent; FFileName : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; {$IFDEF PHP4} FWriterHandle : THandle; @@ -212,6 +133,8 @@ TpsvCustomPHP = class(TPHPComponent) property FileName : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF} read FFileName write FFileName; property Variables : TPHPVariables read FVariables write SetVariables; property VariableCount : integer read GetVariableCount; + property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; + property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; property OnRequestStartup : TNotifyEvent read FOnRequestStartup write FOnRequestStartup; property OnRequestShutdown : TNotifyEvent read FOnRequestShutdown write FOnRequestShutdown; property BeforeExecute : TNotifyEvent read FBeforeExecute write FBeforeExecute; @@ -228,12 +151,13 @@ TpsvCustomPHP = class(TPHPComponent) property ContentType : AnsiString read FContentType write FContentType; end; - - TpsvPHP = class(TpsvCustomPHP) + TpsvPHP = class(TpsvCustomPHP) published property About; property FileName; property Variables; + property OnLogMessage; + property OnScriptError; property OnRequestStartup; property OnRequestShutdown; property OnReadPost; @@ -246,24 +170,120 @@ TpsvPHP = class(TpsvCustomPHP) property ContentType; end; + TCustomPHPLibrary = class(TPHPComponent) + private + FExecutor : TpsvCustomPHP; + FLibraryName : AnsiString; + FFunctions : TPHPFunctions; + FLocked: boolean; + procedure SetFunctions(const Value : TPHPFunctions); + procedure SetExecutor(AValue : TpsvCustomPHP); + procedure SetLibraryName(AValue : AnsiString); + protected + procedure RegisterLibrary; virtual; + procedure UnregisterLibrary; virtual; + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + procedure Refresh; virtual; + property Executor : TpsvCustomPHP read FExecutor write SetExecutor; + property LibraryName : AnsiString read FLibraryName write SetLibraryName; + property Functions : TPHPFunctions read FFunctions write SetFunctions; + property Locked : boolean read FLocked write FLocked; + end; + { TPHPEngine } -var - PHPEngine : TPHPEngine = nil; - - var - delphi_sapi_module : sapi_module_struct; - fatal_handler_php: string; - log_handler_php: string; - phpmd: TpsvPHP; - -implementation - -uses - PHPFunctions; - - - + TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) + private + FINIPath : AnsiString; + FOnEngineStartup : TNotifyEvent; + FOnEngineShutdown : TNotifyEvent; + FEngineActive : boolean; + FHandleErrors : boolean; + {$IFNDEF PHP540} + FSafeMode : boolean; + FSafeModeGid : boolean; + {$ENDIF} + FRegisterGlobals : boolean; + FHTMLErrors : boolean; + FMaxInputTime : integer; + FConstants : TphpConstants; + FDLLFolder : AnsiString; + FReportDLLError : boolean; + FLock: TRTLCriticalSection; + FOnScriptError : TPHPErrorEvent; + FOnLogMessage : TPHPLogMessage; + FWaitForShutdown : boolean; + FHash : TStringList; + FLibraryModule : Tzend_module_entry; + FLibraryEntryTable : array of zend_function_entry; + FRequestCount : integer; + procedure SetConstants(Value : TPHPConstants); + function GetConstantCount: integer; + function GetEngineActive : boolean; + protected + MyFuncs: TStringList; + TSRMLS_D : pppointer; + procedure StartupPHP; virtual; + procedure PrepareEngine; virtual; + procedure PrepareIniEntry; virtual; + procedure RegisterConstants; virtual; + procedure RegisterInternalConstants(TSRMLS_DC : pointer); virtual; + procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); virtual; + property RequestCount : integer read FRequestCount; + procedure HandleError (Sender : TObject; AText : string; AType : Integer; AFileName : string; ALineNo : integer); + procedure HandleLogMessage(Sender : TObject; AText : string); + procedure RegisterLibrary(ALib : TCustomPHPLibrary); + procedure RefreshLibrary; + procedure UnlockLibraries; + procedure RemoveRequest; + procedure AddRequest; + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + procedure AddFunction(FN: AnsiString; Func: Pointer); + procedure StartupEngine; virtual; + procedure ShutdownEngine; virtual; + procedure LockEngine; virtual; + procedure UnlockEngine; virtual; + procedure PrepareForShutdown; virtual; + property EngineActive : boolean read GetEngineActive; + property ConstantCount : integer read GetConstantCount; + property WaitForShutdown : boolean read FWaitForShutdown; + procedure ShutdownAndWaitFor; virtual; + property LibraryEntry : Tzend_module_entry read FLibraryModule; + published + property HandleErrors : boolean read FHandleErrors write FHandleErrors default true; + property OnEngineStartup : TNotifyEvent read FOnEngineStartup write FOnEngineStartup; + property OnEngineShutdown : TNotifyEvent read FOnEngineShutdown write FOnEngineShutdown; + property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; + property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; + property IniPath : AnsiString read FIniPath write FIniPath; + {$IFNDEF PHP540} + property SafeMode : boolean read FSafeMode write FSafeMode default false; + property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; + {$ENDIF} + property RegisterGlobals : boolean read FRegisterGlobals write FRegisterGlobals default true; + property HTMLErrors : boolean read FHTMLErrors write FHTMLErrors default false; + property MaxInputTime : integer read FMaxInputTime write FMaxInputTime default 0; + property Constants : TPHPConstants read FConstants write SetConstants; + property DLLFolder : AnsiString read FDLLFolder write FDLLFolder; + property ReportDLLError : boolean read FReportDLLError write FReportDLLError; + end; + TPHPLibrarian = class + private + FLibraries : TList; + public + constructor Create; virtual; + destructor Destroy; override; + procedure AddLibrary(ALibrary : TCustomPHPLibrary); + procedure RemoveLibrary(ALibrary : TCustomPHPLibrary); + function Count : integer; + function GetLibrary(Index : integer) : TCustomPHPLibrary; + property Libraries : TList read FLibraries write FLibraries; + end; {$IFDEF REGISTER_COLORS} const Colors: array[0..41] of TIdentMapEntry = ( @@ -310,67 +330,262 @@ implementation (Value: clInfoBk; Name: 'clInfoBk'), (Value: clNone; Name: 'clNone')); {$ENDIF} - - -{$IFDEF PHP510} -procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} var - php : TpsvPHP; - gl : psapi_globals_struct; - Lib : IPHPEngine; -{$IFNDEF PHP510} - return_value_ptr : ppzval; -{$ENDIF} + Librarian : TPHPLibrarian = nil; + delphi_sapi_module : sapi_module_struct; + PHPEngine : TPHPEngine = nil; + {$IFDEF soulengine_build} + log_handler_php: string; + fatal_handler_php: string; + phpmd: TpsvPHP; + {$ENDIF} +implementation + +function AddSlashes(const S: ansistring): ansistring; begin - {$IFNDEF PHP510} - return_value_ptr := nil; - {$ENDIF} - ZVAL_NULL(return_value); - gl := GetSAPIGlobals; - if gl = nil then - Exit; - php := TpsvPHP(gl^.server_context); - if Assigned(php) then - begin - try - Lib := php.GetEngine; - if lib <> nil then - Lib.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); - except - ZVAL_NULL(return_value); - end; - end; + Result := StringReplace(S, chr(8), '8', [rfReplaceAll]); + Result := StringReplace(S, '\', '\\', [rfReplaceAll]); + Result := StringReplace(Result, '''', '\''', [rfReplaceAll]); + Result := StringReplace(Result, ' AValue then + begin + if Assigned(FExecutor) then + UnregisterLibrary; + FExecutor := AValue; //Peter Enz + if AValue <> nil then + begin + Avalue.FreeNotification(Self); + RegisterLibrary; + end; + end; +end; + +procedure TCustomPHPLibrary.SetFunctions(const Value: TPHPFunctions); +begin + FFunctions.Assign(Value); +end; + +procedure TCustomPHPLibrary.SetLibraryName(AValue: AnsiString); +begin + if FLibraryName <> AValue then + begin + FLibraryName := AValue; + end; +end; + +procedure TCustomPHPLibrary.UnregisterLibrary; +begin + if Assigned(Librarian) then + Librarian.RemoveLibrary(Self); +end; + + +procedure InitLibrarian; +begin + Librarian := TPHPLibrarian.Create; +end; + +procedure UninitLibrarian; +begin + if Assigned(Librarian) then + try + Librarian.Free; + finally + Librarian := nil; + end; +end; + +{ TPHPLibrarian } + +procedure TPHPLibrarian.AddLibrary(ALibrary: TCustomPHPLibrary); +begin + if FLibraries.IndexOf(ALibrary) = -1 then + FLibraries.Add(ALibrary); +end; + +function TPHPLibrarian.Count: integer; +begin + Result := FLibraries.Count; +end; + +constructor TPHPLibrarian.Create; +begin + inherited; + FLibraries := TList.Create; +end; + +destructor TPHPLibrarian.Destroy; +begin + FLibraries.Free; + inherited; +end; + +function TPHPLibrarian.GetLibrary(Index: integer): TCustomPHPLibrary; +begin + Result := TCustomPHPLibrary(FLibraries[Index]); +end; + +procedure TPHPLibrarian.RemoveLibrary(ALibrary: TCustomPHPLibrary); +begin + FLibraries.Remove(ALibrary); +end; +{ TPHPMemoryStream } + +constructor TPHPMemoryStream.Create; +begin + inherited; +end; + +procedure TPHPMemoryStream.SetInitialSize(ASize: integer); +begin + Capacity := ASize; +end; +{ Startup functions } +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +{Request initialization} +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +{Request shutdown} +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +{$IFDEF PHP5} + +{PHP 5 only} +function delphi_stream_reader (handle : pointer; buf : PAnsiChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS = nil then + result := 0 + else + try + result := MS.Read(buf^, len); + except + result := 0; + end; +end; + +{PHP 5 only} +procedure delphi_stream_closer(handle : pointer; TSRMLS_DC : pointer); cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + MS.Clear; + except + end; +end; + +{$IFDEF PHP530} +function delphi_stream_fsizer(handle : pointer; TSRMLS_DC : pointer) : size_t; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + result := MS.Size; + except + Result := 0; + end + else + Result := 0; +end; +{$ELSE} +{$IFDEF PHP510} + +{ PHP 5.10 and higher } +function delphi_stream_teller(handle : pointer; TSRMLS_DC : pointer) : longint; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + result := MS.Size; + except + Result := 0; + end + else + Result := 0; +end; +{$ENDIF} +{$ENDIF} +{$ENDIF} +{ PHP Info functions } +procedure php_info_library(zend_module : Pointer; TSRMLS_DC : pointer); cdecl; +begin +end; + +function php_delphi_startup(sapi_module : Psapi_module_struct) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function php_delphi_deactivate(p : pointer) : integer; cdecl; +begin + result := SUCCESS; +end; + +procedure php_delphi_flush(p : pointer); cdecl; +begin +end; + +function php_delphi_ub_write(str : pointer; len : uint; p : pointer) : integer; cdecl; +var + php : TpsvPHP; + gl : psapi_globals_struct; begin Result := 0; gl := GetSAPIGlobals; @@ -386,62 +601,29 @@ function php_delphi_ub_write(str : pointer; len : uint; p : pointer) : integer; end; end; end; - - -function GetLocalIP: String; -const WSVer = $101; -var - wsaData: TWSAData; - P: PHostEnt; - Buf: array [0..127] of Char; +function php_delphi_header_handler(sapi_header : psapi_header_struct; sapi_headers : psapi_headers_struct; TSRMLS_DC : pointer) : integer; cdecl; begin - Result := ''; - if WSAStartup(WSVer, wsaData) = 0 then begin - if GetHostName(@Buf, 128) = 0 then begin - P := GetHostByName(@Buf); - if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); - end; - WSACleanup; - end; + Result := SAPI_HEADER_ADD; end; - -procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; +function php_delphi_send_header(p1, TSRMLS_DC : pointer) : integer; cdecl; var php : TpsvPHP; - gl : psapi_globals_struct; - cnt : integer; - varcnt : integer; + gl : psapi_globals_struct; begin gl := GetSAPIGlobals; - if gl = nil then - Exit; - php := TpsvPHP(gl^.server_context); - - if PHP = nil then - begin - Exit; - end; - - php_register_variable('PHP_SELF', '_', nil, p); - php_register_variable('REMOTE_ADDR', PAnsiChar(GetLocalIP()), val, p); - php_register_variable('IP_ADDRESS', PAnsiChar(GetLocalIP()), val, p); - {if php.RequestType = prtPost then - php_register_variable('REQUEST_METHOD', 'POST', val, p) - else - php_register_variable('REQUEST_METHOD', 'GET', val, p);} - - varcnt := PHP.Variables.Count; - if varcnt > 0 then + if Assigned(p1) and Assigned(php) then begin - for cnt := 0 to varcnt - 1 do - begin - php_register_variable(PAnsiChar(php.Variables[cnt].Name), - PAnsiChar(php.Variables[cnt].Value), val, p); - end; + with php.Headers.Add do + Header := String(Psapi_header_struct(p1)^.header); end; + Result := SAPI_HEADER_SENT_SUCCESSFULLY; end; +function php_delphi_read_cookies(p1 : pointer) : pointer; cdecl; +begin + result := nil; +end; function php_delphi_read_post(buf : PAnsiChar; len : uint; TSRMLS_DC : pointer) : integer; cdecl; var gl : psapi_globals_struct; @@ -476,80 +658,91 @@ function php_delphi_read_post(buf : PAnsiChar; len : uint; TSRMLS_DC : pointer) Result := php.PostStream.Read(buf^, len); end; - -function AddSlashes(const S: ansistring): ansistring; +function GetLocalIP: String; +const WSVer = $101; +var + wsaData: TWSAData; + P: PHostEnt; + Buf: array [0..127] of Char; begin - Result := StringReplace(S, chr(8), '8', [rfReplaceAll]); - Result := StringReplace(S, '\', '\\', [rfReplaceAll]); - Result := StringReplace(Result, '''', '\''', [rfReplaceAll]); - Result := StringReplace(Result, ' nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); + end; + WSACleanup; + end; end; -function php_delphi_log_message(msg : PAnsiChar) : integer; cdecl; +procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; var php : TpsvPHP; gl : psapi_globals_struct; - S: ansistring; + cnt : integer; + varcnt : integer; begin - Result := 0; gl := GetSAPIGlobals; if gl = nil then Exit; php := TpsvPHP(gl^.server_context); - if Assigned(PHPEngine) then + + if PHP = nil then begin - if Assigned(PHPEngine.OnLogMessage) then - phpEngine.HandleLogMessage(php, msg) - else - if log_handler_php <> '' then - begin - S := AnsiString(fatal_handler_php + '(' + '''' + AddSlashes(msg) + '''' + - ');' + ' ?>'); - - if not phpmd.UseDelimiters then - S := ' 0 then begin - with php.Headers.Add do - Header := String(Psapi_header_struct(p1)^.header); + for cnt := 0 to varcnt - 1 do + begin + php_register_variable(PAnsiChar(php.Variables[cnt].Name), + PAnsiChar(php.Variables[cnt].Value), val, p); + end; end; - Result := SAPI_HEADER_SENT_SUCCESSFULLY; -end; - -function php_delphi_header_handler(sapi_header : psapi_header_struct; sapi_headers : psapi_headers_struct; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SAPI_HEADER_ADD; end; - -function php_delphi_read_cookies(p1 : pointer) : pointer; cdecl; +function wvsprintfA(Output: PAnsiChar; Format: PAnsiChar; arglist: PAnsiChar): Integer; stdcall; external 'user32.dll'; +{$IFDEF PHP4} +function WriterProc(Parameter : Pointer) : integer; +var + n : integer; + php : TpsvCustomPHP; + buf : PAnsiChar; + k : cardinal; begin - result := nil; + try + php := TPsvCustomPHP(Parameter); + Buf := PAnsiChar(php.FVirtualCode); + k := length(php.FVirtualCode); + repeat + n := _write(php.FVirtualWriteHandle, Buf, k); + if (n <= 0) then + break + else + begin + inc(Buf, n); + dec(K, n); + end; + until (n <= 0); + Close(php.FVirtualWriteHandle); + php.FVirtualWriteHandle := 0; + finally + Result := 0; + ExitThread(0); + end; end; - - - -function wvsprintfA(Output: PAnsiChar; Format: PAnsiChar; arglist: PAnsiChar): Integer; stdcall; external 'user32.dll'; - +{$ENDIF} + {$IFDEF soulengine_build} procedure delphi_error_cb(AType: Integer; const AFname: PAnsiChar; const ALineNo: UINT; const AFormat: PAnsiChar; args: PAnsiChar) cdecl; var @@ -605,99 +798,170 @@ procedure delphi_error_cb(AType: Integer; const AFname: PAnsiChar; const ALineNo MessageDlg(LText, mtError, [mbOk], 0) end; end; -end; - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - - -{Request initialization} -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -{Request shutdown} -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; end; - -{$IFDEF PHP5} - -{PHP 5 only} -function delphi_stream_reader (handle : pointer; buf : PAnsiChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; -var - MS : TMemoryStream; -begin - MS := TMemoryStream(handle); - if MS = nil then - result := 0 - else - try - result := MS.Read(buf^, len); - except - result := 0; - end; +{$ELSE} +procedure delphi_error_cb(_type : integer; const error_filename : PAnsiChar; + const error_lineno : uint; const _format : PAnsiChar; args : PAnsiChar); cdecl; +var + buffer : array[0..1023] of ansichar; + err_msg : PAnsiChar; + php : TpsvPHP; + gl : psapi_globals_struct; + p : pointer; + error_type_str : ansistring; + err : TPHPErrorType; +begin + wvsprintfa(buffer, _format, args); + err_msg := buffer; + p := ts_resource_ex(0, nil); + gl := GetSAPIGlobals(p); + php := TpsvPHP(gl^.server_context); + + case _type of + E_ERROR : err := etError; + E_WARNING : err := etWarning; + E_PARSE : err := etParse; + E_NOTICE : err := etNotice; + E_CORE_ERROR : err := etCoreError; + E_CORE_WARNING : err := etCoreWarning; + E_COMPILE_ERROR : err := etCompileError; + E_COMPILE_WARNING : err := etCompileWarning; + E_USER_ERROR : err := etUserError; + E_USER_WARNING : err := etUserWarning; + E_USER_NOTICE : err := etUserNotice; + else + err := etUnknown; + end; + + if assigned(php) then + begin + if Assigned(php.OnScriptError) then + begin + php.OnScriptError(php, Err_Msg, integer(err), error_filename, error_lineno); + end + else + begin + case _type of + E_ERROR, + E_CORE_ERROR, + E_COMPILE_ERROR, + E_USER_ERROR: + error_type_str := 'Fatal error'; + E_WARNING, + E_CORE_WARNING, + E_COMPILE_WARNING, + E_USER_WARNING : + error_type_str := 'Warning'; + E_PARSE: + error_type_str := 'Parse error'; + E_NOTICE, + E_USER_NOTICE: + error_type_str := 'Notice'; + else + error_type_str := 'Unknown error'; + end; + + php_log_err(PAnsiChar(Format('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); + end; + end; + + _zend_bailout(error_filename, error_lineno); end; - -{PHP 5 only} -procedure delphi_stream_closer(handle : pointer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +{$IFDEF soulengine_build} +function php_delphi_log_message(msg : PAnsiChar) : integer; cdecl; var - MS : TMemoryStream; + php : TpsvPHP; + gl : psapi_globals_struct; + S: ansistring; begin - MS := TMemoryStream(handle); - if MS <> nil then - try - MS.Clear; - except - end; -end; + Result := 0; + gl := GetSAPIGlobals; + if gl = nil then + Exit; -{$IFDEF PHP530} -function delphi_stream_fsizer(handle : pointer; TSRMLS_DC : pointer) : size_t; cdecl; -var - MS : TMemoryStream; -begin - MS := TMemoryStream(handle); - if MS <> nil then - try - result := MS.Size; - except - Result := 0; - end - else - Result := 0; + php := TpsvPHP(gl^.server_context); + if Assigned(PHPEngine) then + begin + if Assigned(PHPEngine.OnLogMessage) then + phpEngine.HandleLogMessage(php, msg) + else + if log_handler_php <> '' then + begin + S := AnsiString(fatal_handler_php + '(' + '''' + AddSlashes(msg) + '''' + + ');' + ' ?>'); + + if not phpmd.UseDelimiters then + S := ' nil then - try - result := MS.Size; - except - Result := 0; - end - else - Result := 0; + {$IFNDEF PHP510} + return_value_ptr := nil; + {$ENDIF} + ZVAL_NULL(return_value); + gl := GetSAPIGlobals; + if gl = nil then + Exit; + php := TpsvPHP(gl^.server_context); + if Assigned(php) then + begin + try + Lib := php.GetEngine; + if lib <> nil then + Lib.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); + except + ZVAL_NULL(return_value); + end; + end; end; -{$ENDIF} -{$ENDIF} -{$ENDIF} +{$ENDIF} { TpsvCustomPHP } constructor TpsvCustomPHP.Create(AOwner: TComponent); @@ -746,37 +1010,6 @@ procedure TpsvCustomPHP.ClearHeaders; end; -{$IFDEF PHP4} -function WriterProc(Parameter : Pointer) : integer; -var - n : integer; - php : TpsvCustomPHP; - buf : PAnsiChar; - k : cardinal; -begin - try - php := TPsvCustomPHP(Parameter); - Buf := PAnsiChar(php.FVirtualCode); - k := length(php.FVirtualCode); - repeat - n := _write(php.FVirtualWriteHandle, Buf, k); - if (n <= 0) then - break - else - begin - inc(Buf, n); - dec(K, n); - end; - until (n <= 0); - Close(php.FVirtualWriteHandle); - php.FVirtualWriteHandle := 0; - finally - Result := 0; - ExitThread(0); - end; -end; -{$ENDIF} - function TpsvCustomPHP.Execute : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; var file_handle : zend_file_handle; @@ -1082,7 +1315,7 @@ procedure TpsvCustomPHP.ShutdownRequest; try php_request_shutdown(nil); except - end; + end; gl := GetSAPIGlobals; gl^.server_context := nil; end; @@ -1497,7 +1730,7 @@ procedure TPHPEngine.ShutdownEngine; {Shutdown PHP thread safe resource manager} if Assigned(FOnEngineShutdown) then FOnEngineShutdown(Self); - + try tsrm_shutdown(); except @@ -1540,7 +1773,7 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); FN := AnsiLowercase(ALib.Functions[cnt].FunctionName); FHash.AddObject(FN, ALib.Functions[cnt]); end; - ALib.Locked := true; + ALib.Locked := true; end; end; @@ -1646,7 +1879,7 @@ procedure TPHPEngine.StartupEngine; if Assigned(FOnEngineStartup) then FOnEngineStartup(Self); - + FEngineActive := true; except FEngineActive := false; @@ -1724,7 +1957,7 @@ procedure TPHPEngine.ShutdownAndWaitFor; AllClear : boolean; begin PrepareForShutdown; - + AllClear := false; while not AllClear do begin @@ -1769,18 +2002,10 @@ procedure TPHPEngine.AddRequest; InterlockedIncrement(FRequestCount); end; -{ TPHPMemoryStream } - -constructor TPHPMemoryStream.Create; -begin - inherited; -end; +initialization + InitLibrarian; -procedure TPHPMemoryStream.SetInitialSize(ASize: integer); -begin - Capacity := ASize; -end; +finalization + UnInitLibrarian; end. - - diff --git a/ProjectGroup1.groupproj b/php4delphi2010.groupproj similarity index 100% rename from ProjectGroup1.groupproj rename to php4delphi2010.groupproj diff --git a/php4delphi2010.groupproj.local b/php4delphi2010.groupproj.local new file mode 100644 index 0000000..b753ba0 --- /dev/null +++ b/php4delphi2010.groupproj.local @@ -0,0 +1,9 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + + + + + diff --git a/phpCustomLibrary.pas b/phpCustomLibrary.pas deleted file mode 100644 index 26d767e..0000000 --- a/phpCustomLibrary.pas +++ /dev/null @@ -1,177 +0,0 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: phpCustomLibrary.pas,v 7.4 10/2009 delphi32 Exp $ } - -unit PHPCustomLibrary; - -interface - -uses - Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, VCL.Controls, VCL.Forms, VCL.Dialogs, - PHPCommon, - ZendTypes, PHPTypes, PHPAPI, ZENDAPI, - phpFunctions; - -type - - IPHPEngine = interface (IUnknown) - ['{484AE2CA-755A-437C-9B60-E3735973D0A9}'] - procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); - function GetEngineActive : boolean; - end; - - - TCustomPHPLibrary = class(TPHPComponent) - private - FLibraryName : AnsiString; - FFunctions : TPHPFunctions; - FLocked: boolean; - procedure SetFunctions(const Value : TPHPFunctions); - procedure SetLibraryName(AValue : AnsiString); - protected - procedure RegisterLibrary; virtual; - procedure UnregisterLibrary; virtual; - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - procedure Refresh; virtual; - property LibraryName : AnsiString read FLibraryName write SetLibraryName; - property Functions : TPHPFunctions read FFunctions write SetFunctions; - property Locked : boolean read FLocked write FLocked; - end; - - TPHPLibrarian = class - private - FLibraries : TList; - public - constructor Create; virtual; - destructor Destroy; override; - procedure AddLibrary(ALibrary : TCustomPHPLibrary); - procedure RemoveLibrary(ALibrary : TCustomPHPLibrary); - function Count : integer; - function GetLibrary(Index : integer) : TCustomPHPLibrary; - property Libraries : TList read FLibraries write FLibraries; - end; - -var - Librarian : TPHPLibrarian = nil; - -implementation - -{ TCustomPHPLibrary } - -constructor TCustomPHPLibrary.Create(AOwner: TComponent); -begin - inherited; - FFunctions := TPHPFunctions.Create(Self, TPHPFunction); - RegisterLibrary; -end; - -destructor TCustomPHPLibrary.Destroy; -begin - UnregisterLibrary; - FFunctions.Free; - FFunctions := nil; - inherited; -end; - -procedure TCustomPHPLibrary.Refresh; -begin -end; - - -procedure TCustomPHPLibrary.RegisterLibrary; -begin - if Assigned(Librarian) then - Librarian.AddLibrary(Self); -end; - - - -procedure TCustomPHPLibrary.SetFunctions(const Value: TPHPFunctions); -begin - FFunctions.Assign(Value); -end; - -procedure TCustomPHPLibrary.SetLibraryName(AValue: AnsiString); -begin - if FLibraryName <> AValue then - begin - FLibraryName := AValue; - end; -end; - -procedure TCustomPHPLibrary.UnregisterLibrary; -begin - if Assigned(Librarian) then - Librarian.RemoveLibrary(Self); -end; - - -procedure InitLibrarian; -begin - Librarian := TPHPLibrarian.Create; -end; - -procedure UninitLibrarian; -begin - if Assigned(Librarian) then - try - Librarian.Free; - finally - Librarian := nil; - end; -end; - -{ TPHPLibrarian } - -procedure TPHPLibrarian.AddLibrary(ALibrary: TCustomPHPLibrary); -begin - if FLibraries.IndexOf(ALibrary) = -1 then - FLibraries.Add(ALibrary); -end; - -function TPHPLibrarian.Count: integer; -begin - Result := FLibraries.Count; -end; - -constructor TPHPLibrarian.Create; -begin - inherited; - FLibraries := TList.Create; -end; - -destructor TPHPLibrarian.Destroy; -begin - FLibraries.Free; - inherited; -end; - -function TPHPLibrarian.GetLibrary(Index: integer): TCustomPHPLibrary; -begin - Result := TCustomPHPLibrary(FLibraries[Index]); -end; - -procedure TPHPLibrarian.RemoveLibrary(ALibrary: TCustomPHPLibrary); -begin - FLibraries.Remove(ALibrary); -end; - -initialization - InitLibrarian; - -finalization - UnInitLibrarian; - -end. From 57f4d6364e9cbfc1e58fd152626b32e2b717188a Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 4 Mar 2019 22:22:26 +0200 Subject: [PATCH 03/54] Small fixes --- php4DelphiD2010.dpk | 14 ++++++++++++++ php4DelphiD2010.dproj | 13 +++++++++++++ php4delphi.pas | 6 +++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/php4DelphiD2010.dpk b/php4DelphiD2010.dpk index 292313c..6d19017 100644 --- a/php4DelphiD2010.dpk +++ b/php4DelphiD2010.dpk @@ -38,9 +38,23 @@ requires contains PHPProjectWizard in 'PHPProjectWizard.pas', + { Components Requirements } + DelphiFunctions in 'DelphiFunctions.pas', + phpLibrary in 'phpLibrary.pas', + PHPCommon in 'phpCommon.pas', + phpFunctions in 'phpFunctions.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + php4delphi in 'php4delphi.pas', + phpModules in 'phpModules.pas', + phpAPI in 'phpAPI.pas', + ZENDAPI in 'ZENDAPI.pas', + PHPTypes in 'PHPTypes.pas', + { Components Requirements } php4DelphiReg in 'php4DelphiReg.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpWeb in 'phpWeb.pas', phpAbout in 'phpAbout.pas' { dlgAbout }; end. + diff --git a/php4DelphiD2010.dproj b/php4DelphiD2010.dproj index 55f8e94..d0ed8de 100644 --- a/php4DelphiD2010.dproj +++ b/php4DelphiD2010.dproj @@ -87,6 +87,19 @@ + + + + + + + + + + + +
Components Requirements
+
diff --git a/php4delphi.pas b/php4delphi.pas index 1572d3e..7c12600 100644 --- a/php4delphi.pas +++ b/php4delphi.pas @@ -861,11 +861,11 @@ procedure delphi_error_cb(_type : integer; const error_filename : PAnsiChar; error_type_str := 'Unknown error'; end; - php_log_err(PAnsiChar(Format('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); + php_log_err(PAnsiChar(AnsiFormat('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); end; end; - - _zend_bailout(error_filename, error_lineno); + if PHPLoaded then + _zend_bailout(error_filename, error_lineno); end; {$ENDIF} {$IFDEF soulengine_build} From d955ac1fb1d0258b7f8115086d93e5242f95f5f1 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 4 Mar 2019 22:27:25 +0200 Subject: [PATCH 04/54] Packages listing --- php4delphi Delphi 10 Seattle.groupproj | 48 +++++++++++++++++++ php4delphi Delphi 10 Seattle.groupproj.local | 11 +++++ php4delphi Delphi 10.1 Berlin.groupproj | 48 +++++++++++++++++++ php4delphi Delphi 10.1 Berlin.groupproj.local | 11 +++++ php4delphi Delphi 10.2 Tokyo.groupproj | 48 +++++++++++++++++++ php4delphi Delphi 10.2 Tokyo.groupproj.local | 12 +++++ php4delphi Delphi XE1.groupproj | 48 +++++++++++++++++++ php4delphi Delphi XE1.groupproj.local | 14 ++++++ php4delphi Delphi XE2.groupproj | 48 +++++++++++++++++++ php4delphi Delphi XE2.groupproj.local | 15 ++++++ php4delphi Delphi XE3.groupproj | 48 +++++++++++++++++++ php4delphi Delphi XE3.groupproj.local | 16 +++++++ php4delphi Delphi XE4.groupproj | 48 +++++++++++++++++++ php4delphi Delphi XE4.groupproj.local | 17 +++++++ php4delphi Delphi XE5.groupproj | 48 +++++++++++++++++++ php4delphi Delphi XE5.groupproj.local | 18 +++++++ php4delphi Delphi XE6.groupproj | 48 +++++++++++++++++++ php4delphi Delphi XE6.groupproj.local | 19 ++++++++ php4delphi Delphi XE7.groupproj | 48 +++++++++++++++++++ php4delphi Delphi XE7.groupproj.local | 20 ++++++++ php4delphi Delphi XE8.groupproj | 48 +++++++++++++++++++ php4delphi Delphi XE8.groupproj.local | 21 ++++++++ php4delphidephi2011.groupproj | 48 +++++++++++++++++++ php4delphidephi2011.groupproj.local | 13 +++++ 24 files changed, 763 insertions(+) create mode 100644 php4delphi Delphi 10 Seattle.groupproj create mode 100644 php4delphi Delphi 10 Seattle.groupproj.local create mode 100644 php4delphi Delphi 10.1 Berlin.groupproj create mode 100644 php4delphi Delphi 10.1 Berlin.groupproj.local create mode 100644 php4delphi Delphi 10.2 Tokyo.groupproj create mode 100644 php4delphi Delphi 10.2 Tokyo.groupproj.local create mode 100644 php4delphi Delphi XE1.groupproj create mode 100644 php4delphi Delphi XE1.groupproj.local create mode 100644 php4delphi Delphi XE2.groupproj create mode 100644 php4delphi Delphi XE2.groupproj.local create mode 100644 php4delphi Delphi XE3.groupproj create mode 100644 php4delphi Delphi XE3.groupproj.local create mode 100644 php4delphi Delphi XE4.groupproj create mode 100644 php4delphi Delphi XE4.groupproj.local create mode 100644 php4delphi Delphi XE5.groupproj create mode 100644 php4delphi Delphi XE5.groupproj.local create mode 100644 php4delphi Delphi XE6.groupproj create mode 100644 php4delphi Delphi XE6.groupproj.local create mode 100644 php4delphi Delphi XE7.groupproj create mode 100644 php4delphi Delphi XE7.groupproj.local create mode 100644 php4delphi Delphi XE8.groupproj create mode 100644 php4delphi Delphi XE8.groupproj.local create mode 100644 php4delphidephi2011.groupproj create mode 100644 php4delphidephi2011.groupproj.local diff --git a/php4delphi Delphi 10 Seattle.groupproj b/php4delphi Delphi 10 Seattle.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi 10 Seattle.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi 10 Seattle.groupproj.local b/php4delphi Delphi 10 Seattle.groupproj.local new file mode 100644 index 0000000..a9f6962 --- /dev/null +++ b/php4delphi Delphi 10 Seattle.groupproj.local @@ -0,0 +1,11 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + + + + + diff --git a/php4delphi Delphi 10.1 Berlin.groupproj b/php4delphi Delphi 10.1 Berlin.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi 10.1 Berlin.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi 10.1 Berlin.groupproj.local b/php4delphi Delphi 10.1 Berlin.groupproj.local new file mode 100644 index 0000000..a9f6962 --- /dev/null +++ b/php4delphi Delphi 10.1 Berlin.groupproj.local @@ -0,0 +1,11 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + + + + + diff --git a/php4delphi Delphi 10.2 Tokyo.groupproj b/php4delphi Delphi 10.2 Tokyo.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi 10.2 Tokyo.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi 10.2 Tokyo.groupproj.local b/php4delphi Delphi 10.2 Tokyo.groupproj.local new file mode 100644 index 0000000..a1bd0e9 --- /dev/null +++ b/php4delphi Delphi 10.2 Tokyo.groupproj.local @@ -0,0 +1,12 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + + + + + diff --git a/php4delphi Delphi XE1.groupproj b/php4delphi Delphi XE1.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi XE1.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi XE1.groupproj.local b/php4delphi Delphi XE1.groupproj.local new file mode 100644 index 0000000..336063d --- /dev/null +++ b/php4delphi Delphi XE1.groupproj.local @@ -0,0 +1,14 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj + + + + + diff --git a/php4delphi Delphi XE2.groupproj b/php4delphi Delphi XE2.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi XE2.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi XE2.groupproj.local b/php4delphi Delphi XE2.groupproj.local new file mode 100644 index 0000000..102150a --- /dev/null +++ b/php4delphi Delphi XE2.groupproj.local @@ -0,0 +1,15 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj + + + + + diff --git a/php4delphi Delphi XE3.groupproj b/php4delphi Delphi XE3.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi XE3.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi XE3.groupproj.local b/php4delphi Delphi XE3.groupproj.local new file mode 100644 index 0000000..a9d9507 --- /dev/null +++ b/php4delphi Delphi XE3.groupproj.local @@ -0,0 +1,16 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj + 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj + + + + + diff --git a/php4delphi Delphi XE4.groupproj b/php4delphi Delphi XE4.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi XE4.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi XE4.groupproj.local b/php4delphi Delphi XE4.groupproj.local new file mode 100644 index 0000000..4daffc0 --- /dev/null +++ b/php4delphi Delphi XE4.groupproj.local @@ -0,0 +1,17 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj + 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj + 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj + + + + + diff --git a/php4delphi Delphi XE5.groupproj b/php4delphi Delphi XE5.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi XE5.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi XE5.groupproj.local b/php4delphi Delphi XE5.groupproj.local new file mode 100644 index 0000000..c27d454 --- /dev/null +++ b/php4delphi Delphi XE5.groupproj.local @@ -0,0 +1,18 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj + 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj + 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj + 2019.03.04 22:26:26.679,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj + + + + + diff --git a/php4delphi Delphi XE6.groupproj b/php4delphi Delphi XE6.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi XE6.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi XE6.groupproj.local b/php4delphi Delphi XE6.groupproj.local new file mode 100644 index 0000000..d07f994 --- /dev/null +++ b/php4delphi Delphi XE6.groupproj.local @@ -0,0 +1,19 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj + 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj + 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj + 2019.03.04 22:26:26.679,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj + 2019.03.04 22:26:34.061,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj + + + + + diff --git a/php4delphi Delphi XE7.groupproj b/php4delphi Delphi XE7.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi XE7.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi XE7.groupproj.local b/php4delphi Delphi XE7.groupproj.local new file mode 100644 index 0000000..9a6e0dd --- /dev/null +++ b/php4delphi Delphi XE7.groupproj.local @@ -0,0 +1,20 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj + 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj + 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj + 2019.03.04 22:26:26.679,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj + 2019.03.04 22:26:34.061,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj + 2019.03.04 22:26:44.568,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj + + + + + diff --git a/php4delphi Delphi XE8.groupproj b/php4delphi Delphi XE8.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphi Delphi XE8.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphi Delphi XE8.groupproj.local b/php4delphi Delphi XE8.groupproj.local new file mode 100644 index 0000000..a3edcbb --- /dev/null +++ b/php4delphi Delphi XE8.groupproj.local @@ -0,0 +1,21 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj + 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj + 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj + 2019.03.04 22:26:26.679,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj + 2019.03.04 22:26:34.061,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj + 2019.03.04 22:26:44.568,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj + 2019.03.04 22:26:51.786,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE7.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE6.groupproj + + + + + diff --git a/php4delphidephi2011.groupproj b/php4delphidephi2011.groupproj new file mode 100644 index 0000000..767a45b --- /dev/null +++ b/php4delphidephi2011.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php4delphidephi2011.groupproj.local b/php4delphidephi2011.groupproj.local new file mode 100644 index 0000000..6b0856a --- /dev/null +++ b/php4delphidephi2011.groupproj.local @@ -0,0 +1,13 @@ + + + + 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + + + + + From c49448b4674a0e647e242e91f28c6fba547c027f Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 4 Mar 2019 22:34:28 +0200 Subject: [PATCH 05/54] Moved to 'Packages' dir --- .../php4delphi Delphi 10 Seattle.groupproj | 16 +++--- ...p4delphi Delphi 10 Seattle.groupproj.local | 12 +++++ .../php4delphi Delphi 10.1 Berlin.groupproj | 16 +++--- ...4delphi Delphi 10.1 Berlin.groupproj.local | 11 ++++ .../php4delphi Delphi 10.2 Tokyo.groupproj | 16 +++--- ...p4delphi Delphi 10.2 Tokyo.groupproj.local | 13 +++++ packages/php4delphi Delphi 2010.groupproj | 48 ++++++++++++++++++ .../php4delphi Delphi 2010.groupproj.local | 23 +++++++++ packages/php4delphi Delphi 2011.groupproj | 48 ++++++++++++++++++ .../php4delphi Delphi 2011.groupproj.local | 22 ++++++++ .../php4delphi Delphi XE1.groupproj | 16 +++--- .../php4delphi Delphi XE1.groupproj.local | 14 +++++ .../php4delphi Delphi XE2.groupproj | 16 +++--- .../php4delphi Delphi XE2.groupproj.local | 15 ++++++ .../php4delphi Delphi XE3.groupproj | 16 +++--- .../php4delphi Delphi XE3.groupproj.local | 16 ++++++ .../php4delphi Delphi XE4.groupproj | 16 +++--- .../php4delphi Delphi XE4.groupproj.local | 17 +++++++ .../php4delphi Delphi XE5.groupproj | 16 +++--- .../php4delphi Delphi XE5.groupproj.local | 18 +++++++ .../php4delphi Delphi XE6.groupproj | 16 +++--- .../php4delphi Delphi XE6.groupproj.local | 19 +++++++ .../php4delphi Delphi XE7.groupproj | 16 +++--- .../php4delphi Delphi XE7.groupproj.local | 20 ++++++++ .../php4delphi Delphi XE8.groupproj | 16 +++--- .../php4delphi Delphi XE8.groupproj.local | 21 ++++++++ .../php4delphi Delphi XE8_prjgroup.tvsconfig | 2 + php4DelphiD2010.identcache | Bin 286 -> 1140 bytes php4DelphiD2010.stat | 10 ++-- php4DelphiR2010.identcache | Bin 556 -> 779 bytes php4delphi Delphi 10 Seattle.groupproj.local | 11 ---- php4delphi Delphi 10.1 Berlin.groupproj.local | 11 ---- php4delphi Delphi 10.2 Tokyo.groupproj.local | 12 ----- php4delphi Delphi XE1.groupproj.local | 14 ----- php4delphi Delphi XE2.groupproj.local | 15 ------ php4delphi Delphi XE3.groupproj.local | 16 ------ php4delphi Delphi XE4.groupproj.local | 17 ------- php4delphi Delphi XE5.groupproj.local | 18 ------- php4delphi Delphi XE6.groupproj.local | 19 ------- php4delphi Delphi XE7.groupproj.local | 20 -------- php4delphi Delphi XE8.groupproj.local | 21 -------- php4delphi2010.groupproj | 48 ------------------ php4delphi2010.groupproj.local | 9 ---- php4delphidephi2011.groupproj | 48 ------------------ php4delphidephi2011.groupproj.local | 13 ----- 45 files changed, 412 insertions(+), 385 deletions(-) rename php4delphi Delphi 10 Seattle.groupproj => packages/php4delphi Delphi 10 Seattle.groupproj (72%) create mode 100644 packages/php4delphi Delphi 10 Seattle.groupproj.local rename php4delphi Delphi 10.1 Berlin.groupproj => packages/php4delphi Delphi 10.1 Berlin.groupproj (72%) create mode 100644 packages/php4delphi Delphi 10.1 Berlin.groupproj.local rename php4delphi Delphi 10.2 Tokyo.groupproj => packages/php4delphi Delphi 10.2 Tokyo.groupproj (72%) create mode 100644 packages/php4delphi Delphi 10.2 Tokyo.groupproj.local create mode 100644 packages/php4delphi Delphi 2010.groupproj create mode 100644 packages/php4delphi Delphi 2010.groupproj.local create mode 100644 packages/php4delphi Delphi 2011.groupproj create mode 100644 packages/php4delphi Delphi 2011.groupproj.local rename php4delphi Delphi XE1.groupproj => packages/php4delphi Delphi XE1.groupproj (72%) create mode 100644 packages/php4delphi Delphi XE1.groupproj.local rename php4delphi Delphi XE2.groupproj => packages/php4delphi Delphi XE2.groupproj (72%) create mode 100644 packages/php4delphi Delphi XE2.groupproj.local rename php4delphi Delphi XE3.groupproj => packages/php4delphi Delphi XE3.groupproj (72%) create mode 100644 packages/php4delphi Delphi XE3.groupproj.local rename php4delphi Delphi XE4.groupproj => packages/php4delphi Delphi XE4.groupproj (72%) create mode 100644 packages/php4delphi Delphi XE4.groupproj.local rename php4delphi Delphi XE5.groupproj => packages/php4delphi Delphi XE5.groupproj (72%) create mode 100644 packages/php4delphi Delphi XE5.groupproj.local rename php4delphi Delphi XE6.groupproj => packages/php4delphi Delphi XE6.groupproj (72%) create mode 100644 packages/php4delphi Delphi XE6.groupproj.local rename php4delphi Delphi XE7.groupproj => packages/php4delphi Delphi XE7.groupproj (72%) create mode 100644 packages/php4delphi Delphi XE7.groupproj.local rename php4delphi Delphi XE8.groupproj => packages/php4delphi Delphi XE8.groupproj (72%) create mode 100644 packages/php4delphi Delphi XE8.groupproj.local create mode 100644 packages/php4delphi Delphi XE8_prjgroup.tvsconfig delete mode 100644 php4delphi Delphi 10 Seattle.groupproj.local delete mode 100644 php4delphi Delphi 10.1 Berlin.groupproj.local delete mode 100644 php4delphi Delphi 10.2 Tokyo.groupproj.local delete mode 100644 php4delphi Delphi XE1.groupproj.local delete mode 100644 php4delphi Delphi XE2.groupproj.local delete mode 100644 php4delphi Delphi XE3.groupproj.local delete mode 100644 php4delphi Delphi XE4.groupproj.local delete mode 100644 php4delphi Delphi XE5.groupproj.local delete mode 100644 php4delphi Delphi XE6.groupproj.local delete mode 100644 php4delphi Delphi XE7.groupproj.local delete mode 100644 php4delphi Delphi XE8.groupproj.local delete mode 100644 php4delphi2010.groupproj delete mode 100644 php4delphi2010.groupproj.local delete mode 100644 php4delphidephi2011.groupproj delete mode 100644 php4delphidephi2011.groupproj.local diff --git a/php4delphi Delphi 10 Seattle.groupproj b/packages/php4delphi Delphi 10 Seattle.groupproj similarity index 72% rename from php4delphi Delphi 10 Seattle.groupproj rename to packages/php4delphi Delphi 10 Seattle.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi 10 Seattle.groupproj +++ b/packages/php4delphi Delphi 10 Seattle.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03}
- + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi 10 Seattle.groupproj.local b/packages/php4delphi Delphi 10 Seattle.groupproj.local new file mode 100644 index 0000000..1029ef3 --- /dev/null +++ b/packages/php4delphi Delphi 10 Seattle.groupproj.local @@ -0,0 +1,12 @@ + + + + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + + + + + diff --git a/php4delphi Delphi 10.1 Berlin.groupproj b/packages/php4delphi Delphi 10.1 Berlin.groupproj similarity index 72% rename from php4delphi Delphi 10.1 Berlin.groupproj rename to packages/php4delphi Delphi 10.1 Berlin.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi 10.1 Berlin.groupproj +++ b/packages/php4delphi Delphi 10.1 Berlin.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi 10.1 Berlin.groupproj.local b/packages/php4delphi Delphi 10.1 Berlin.groupproj.local new file mode 100644 index 0000000..9b88d43 --- /dev/null +++ b/packages/php4delphi Delphi 10.1 Berlin.groupproj.local @@ -0,0 +1,11 @@ + + + + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + + + + + diff --git a/php4delphi Delphi 10.2 Tokyo.groupproj b/packages/php4delphi Delphi 10.2 Tokyo.groupproj similarity index 72% rename from php4delphi Delphi 10.2 Tokyo.groupproj rename to packages/php4delphi Delphi 10.2 Tokyo.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi 10.2 Tokyo.groupproj +++ b/packages/php4delphi Delphi 10.2 Tokyo.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local b/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local new file mode 100644 index 0000000..35948ce --- /dev/null +++ b/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local @@ -0,0 +1,13 @@ + + + + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + + + + + diff --git a/packages/php4delphi Delphi 2010.groupproj b/packages/php4delphi Delphi 2010.groupproj new file mode 100644 index 0000000..b7db0c5 --- /dev/null +++ b/packages/php4delphi Delphi 2010.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/php4delphi Delphi 2010.groupproj.local b/packages/php4delphi Delphi 2010.groupproj.local new file mode 100644 index 0000000..ce4c03c --- /dev/null +++ b/packages/php4delphi Delphi 2010.groupproj.local @@ -0,0 +1,23 @@ + + + + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj + 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj + 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj + 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj + 2019.03.04 22:32:46.928,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj + 2019.03.04 22:32:52.359,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj + 2019.03.04 22:32:58.134,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE8.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj + 2019.03.04 22:33:22.418,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE8.groupproj + + + + + diff --git a/packages/php4delphi Delphi 2011.groupproj b/packages/php4delphi Delphi 2011.groupproj new file mode 100644 index 0000000..b7db0c5 --- /dev/null +++ b/packages/php4delphi Delphi 2011.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/php4delphi Delphi 2011.groupproj.local b/packages/php4delphi Delphi 2011.groupproj.local new file mode 100644 index 0000000..c2c593f --- /dev/null +++ b/packages/php4delphi Delphi 2011.groupproj.local @@ -0,0 +1,22 @@ + + + + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj + 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj + 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj + 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj + 2019.03.04 22:32:46.928,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj + 2019.03.04 22:32:52.359,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj + 2019.03.04 22:32:58.134,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE8.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj + + + + + diff --git a/php4delphi Delphi XE1.groupproj b/packages/php4delphi Delphi XE1.groupproj similarity index 72% rename from php4delphi Delphi XE1.groupproj rename to packages/php4delphi Delphi XE1.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi XE1.groupproj +++ b/packages/php4delphi Delphi XE1.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi XE1.groupproj.local b/packages/php4delphi Delphi XE1.groupproj.local new file mode 100644 index 0000000..730de94 --- /dev/null +++ b/packages/php4delphi Delphi XE1.groupproj.local @@ -0,0 +1,14 @@ + + + + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + + + + + diff --git a/php4delphi Delphi XE2.groupproj b/packages/php4delphi Delphi XE2.groupproj similarity index 72% rename from php4delphi Delphi XE2.groupproj rename to packages/php4delphi Delphi XE2.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi XE2.groupproj +++ b/packages/php4delphi Delphi XE2.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi XE2.groupproj.local b/packages/php4delphi Delphi XE2.groupproj.local new file mode 100644 index 0000000..c62f4a8 --- /dev/null +++ b/packages/php4delphi Delphi XE2.groupproj.local @@ -0,0 +1,15 @@ + + + + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + + + + + diff --git a/php4delphi Delphi XE3.groupproj b/packages/php4delphi Delphi XE3.groupproj similarity index 72% rename from php4delphi Delphi XE3.groupproj rename to packages/php4delphi Delphi XE3.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi XE3.groupproj +++ b/packages/php4delphi Delphi XE3.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi XE3.groupproj.local b/packages/php4delphi Delphi XE3.groupproj.local new file mode 100644 index 0000000..5380455 --- /dev/null +++ b/packages/php4delphi Delphi XE3.groupproj.local @@ -0,0 +1,16 @@ + + + + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj + + + + + diff --git a/php4delphi Delphi XE4.groupproj b/packages/php4delphi Delphi XE4.groupproj similarity index 72% rename from php4delphi Delphi XE4.groupproj rename to packages/php4delphi Delphi XE4.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi XE4.groupproj +++ b/packages/php4delphi Delphi XE4.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi XE4.groupproj.local b/packages/php4delphi Delphi XE4.groupproj.local new file mode 100644 index 0000000..a7c375a --- /dev/null +++ b/packages/php4delphi Delphi XE4.groupproj.local @@ -0,0 +1,17 @@ + + + + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj + 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj + + + + + diff --git a/php4delphi Delphi XE5.groupproj b/packages/php4delphi Delphi XE5.groupproj similarity index 72% rename from php4delphi Delphi XE5.groupproj rename to packages/php4delphi Delphi XE5.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi XE5.groupproj +++ b/packages/php4delphi Delphi XE5.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi XE5.groupproj.local b/packages/php4delphi Delphi XE5.groupproj.local new file mode 100644 index 0000000..47e6273 --- /dev/null +++ b/packages/php4delphi Delphi XE5.groupproj.local @@ -0,0 +1,18 @@ + + + + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj + 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj + 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj + + + + + diff --git a/php4delphi Delphi XE6.groupproj b/packages/php4delphi Delphi XE6.groupproj similarity index 72% rename from php4delphi Delphi XE6.groupproj rename to packages/php4delphi Delphi XE6.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi XE6.groupproj +++ b/packages/php4delphi Delphi XE6.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi XE6.groupproj.local b/packages/php4delphi Delphi XE6.groupproj.local new file mode 100644 index 0000000..2c6ab26 --- /dev/null +++ b/packages/php4delphi Delphi XE6.groupproj.local @@ -0,0 +1,19 @@ + + + + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj + 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj + 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj + 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj + + + + + diff --git a/php4delphi Delphi XE7.groupproj b/packages/php4delphi Delphi XE7.groupproj similarity index 72% rename from php4delphi Delphi XE7.groupproj rename to packages/php4delphi Delphi XE7.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi XE7.groupproj +++ b/packages/php4delphi Delphi XE7.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi XE7.groupproj.local b/packages/php4delphi Delphi XE7.groupproj.local new file mode 100644 index 0000000..9691c31 --- /dev/null +++ b/packages/php4delphi Delphi XE7.groupproj.local @@ -0,0 +1,20 @@ + + + + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj + 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj + 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj + 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj + 2019.03.04 22:32:46.928,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj + + + + + diff --git a/php4delphi Delphi XE8.groupproj b/packages/php4delphi Delphi XE8.groupproj similarity index 72% rename from php4delphi Delphi XE8.groupproj rename to packages/php4delphi Delphi XE8.groupproj index 767a45b..b7db0c5 100644 --- a/php4delphi Delphi XE8.groupproj +++ b/packages/php4delphi Delphi XE8.groupproj @@ -3,10 +3,10 @@ {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - + - + @@ -18,22 +18,22 @@
- + - + - + - + - + - + diff --git a/packages/php4delphi Delphi XE8.groupproj.local b/packages/php4delphi Delphi XE8.groupproj.local new file mode 100644 index 0000000..fded362 --- /dev/null +++ b/packages/php4delphi Delphi XE8.groupproj.local @@ -0,0 +1,21 @@ + + + + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj + 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj + 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj + 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj + 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj + 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj + 2019.03.04 22:32:46.928,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj + 2019.03.04 22:32:52.359,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj + + + + + diff --git a/packages/php4delphi Delphi XE8_prjgroup.tvsconfig b/packages/php4delphi Delphi XE8_prjgroup.tvsconfig new file mode 100644 index 0000000..d430780 --- /dev/null +++ b/packages/php4delphi Delphi XE8_prjgroup.tvsconfig @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/php4DelphiD2010.identcache b/php4DelphiD2010.identcache index 10669bf14451f14ef017b5cba3d9ab3359d767c1..40fde7545675fbf69f488ffd62e84beaf1ffeea3 100644 GIT binary patch literal 1140 zcmbu8%L>9U5Jme5eu=B%3q^}nE2tDv1j(jtf=1dT4KwFO!I?|xL9$rNiKH%K20_G897}#9nLg1+BC!h_Kw#BWd7^5onE)Yv_)@kf z7dH-cJwd#75zx|n`qLJ(<=Eu)*8I7e2JIkIR(oTKK@h7uNV(DOYNim~Z`Dh~GEF(F URi_VORe!U=_!z>lL;Vc%1QPjaC;$Ke literal 286 zcmZQ$U|>*pwu(t9E>4Xp$S5#LNzEz9$czc_2nZ<3&q_@$3D2xbEK1QUNGt{_g##5V vdO+G;z}kaS)6q4^V%HF!nuM-W5xYvL%g|NhcL)~a<*^&@n3P{yf^IkfN?J}< diff --git a/php4DelphiD2010.stat b/php4DelphiD2010.stat index 8ce893a..8f85970 100644 --- a/php4DelphiD2010.stat +++ b/php4DelphiD2010.stat @@ -1,10 +1,10 @@ [Stats] -EditorSecs=186 +EditorSecs=287 DesignerSecs=1 -InspectorSecs=7 -CompileSecs=56046 -OtherSecs=326 -StartTime=29.07.4016 22:02:21 +InspectorSecs=1 +CompileSecs=15416 +OtherSecs=174 +StartTime=04.03.2019 21:55:53 RealKeys=0 EffectiveKeys=0 DebugSecs=1 diff --git a/php4DelphiR2010.identcache b/php4DelphiR2010.identcache index 4ed1d71399a83a7724eb4e6ba4f54bf631e3386a..b7e3702e8d499a5c5dcf5fc0ea7f5bde67a82a5d 100644 GIT binary patch literal 779 zcmb`_%L>9U5Czcg{TEl_qX<$`wSr0(x{=xR5ojPUk_PGD8(kHvpbx^3zvL}?f^^&Qsb#;s5vL80crl%m%}R zJVZ;WRjjO$%55|(nFtl-vA>p+$`To+pr?466^3{RnJ{)3qx{tUx2i9?^CI0Z>S99G UXWrP_j`4O-U5CRXqIOBwFVbK1egFUf literal 556 zcmd;KU|>*mwu(t9E>4Xp$S5#LNzEz9$V6i56(kk|6~Tc57S#bB0nYikx%qj-D2{UV za|x*|NG(QJjLjWDlYKIiiV}+|iBS#ofNy?EX%42@>R4P2RP9_^T#}!Q!v-}hdR)N4 z<5rrNT#}iehv5ZfELwnGz^Psyi+Yf=auSO%%$CKX7HGC(fG2v;$YD_l3Uw?>u{i)} IDAxD^0N~}900000 diff --git a/php4delphi Delphi 10 Seattle.groupproj.local b/php4delphi Delphi 10 Seattle.groupproj.local deleted file mode 100644 index a9f6962..0000000 --- a/php4delphi Delphi 10 Seattle.groupproj.local +++ /dev/null @@ -1,11 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - - - - - diff --git a/php4delphi Delphi 10.1 Berlin.groupproj.local b/php4delphi Delphi 10.1 Berlin.groupproj.local deleted file mode 100644 index a9f6962..0000000 --- a/php4delphi Delphi 10.1 Berlin.groupproj.local +++ /dev/null @@ -1,11 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - - - - - diff --git a/php4delphi Delphi 10.2 Tokyo.groupproj.local b/php4delphi Delphi 10.2 Tokyo.groupproj.local deleted file mode 100644 index a1bd0e9..0000000 --- a/php4delphi Delphi 10.2 Tokyo.groupproj.local +++ /dev/null @@ -1,12 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - - - - - diff --git a/php4delphi Delphi XE1.groupproj.local b/php4delphi Delphi XE1.groupproj.local deleted file mode 100644 index 336063d..0000000 --- a/php4delphi Delphi XE1.groupproj.local +++ /dev/null @@ -1,14 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj - - - - - diff --git a/php4delphi Delphi XE2.groupproj.local b/php4delphi Delphi XE2.groupproj.local deleted file mode 100644 index 102150a..0000000 --- a/php4delphi Delphi XE2.groupproj.local +++ /dev/null @@ -1,15 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj - - - - - diff --git a/php4delphi Delphi XE3.groupproj.local b/php4delphi Delphi XE3.groupproj.local deleted file mode 100644 index a9d9507..0000000 --- a/php4delphi Delphi XE3.groupproj.local +++ /dev/null @@ -1,16 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj - 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj - - - - - diff --git a/php4delphi Delphi XE4.groupproj.local b/php4delphi Delphi XE4.groupproj.local deleted file mode 100644 index 4daffc0..0000000 --- a/php4delphi Delphi XE4.groupproj.local +++ /dev/null @@ -1,17 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj - 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj - 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj - - - - - diff --git a/php4delphi Delphi XE5.groupproj.local b/php4delphi Delphi XE5.groupproj.local deleted file mode 100644 index c27d454..0000000 --- a/php4delphi Delphi XE5.groupproj.local +++ /dev/null @@ -1,18 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj - 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj - 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj - 2019.03.04 22:26:26.679,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj - - - - - diff --git a/php4delphi Delphi XE6.groupproj.local b/php4delphi Delphi XE6.groupproj.local deleted file mode 100644 index d07f994..0000000 --- a/php4delphi Delphi XE6.groupproj.local +++ /dev/null @@ -1,19 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj - 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj - 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj - 2019.03.04 22:26:26.679,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj - 2019.03.04 22:26:34.061,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj - - - - - diff --git a/php4delphi Delphi XE7.groupproj.local b/php4delphi Delphi XE7.groupproj.local deleted file mode 100644 index 9a6e0dd..0000000 --- a/php4delphi Delphi XE7.groupproj.local +++ /dev/null @@ -1,20 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj - 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj - 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj - 2019.03.04 22:26:26.679,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj - 2019.03.04 22:26:34.061,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj - 2019.03.04 22:26:44.568,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj - - - - - diff --git a/php4delphi Delphi XE8.groupproj.local b/php4delphi Delphi XE8.groupproj.local deleted file mode 100644 index a3edcbb..0000000 --- a/php4delphi Delphi XE8.groupproj.local +++ /dev/null @@ -1,21 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:25:46.923,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:26:04.705,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphidephi2011.groupproj - 2019.03.04 22:26:12.557,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE1.groupproj - 2019.03.04 22:26:19.208,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE2.groupproj - 2019.03.04 22:26:26.679,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE3.groupproj - 2019.03.04 22:26:34.061,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE4.groupproj - 2019.03.04 22:26:44.568,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE5.groupproj - 2019.03.04 22:26:51.786,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE7.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi XE6.groupproj - - - - - diff --git a/php4delphi2010.groupproj b/php4delphi2010.groupproj deleted file mode 100644 index 767a45b..0000000 --- a/php4delphi2010.groupproj +++ /dev/null @@ -1,48 +0,0 @@ - - - {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - - - - - - - - - - - Default.Personality.12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/php4delphi2010.groupproj.local b/php4delphi2010.groupproj.local deleted file mode 100644 index b753ba0..0000000 --- a/php4delphi2010.groupproj.local +++ /dev/null @@ -1,9 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - - - - - diff --git a/php4delphidephi2011.groupproj b/php4delphidephi2011.groupproj deleted file mode 100644 index 767a45b..0000000 --- a/php4delphidephi2011.groupproj +++ /dev/null @@ -1,48 +0,0 @@ - - - {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} - - - - - - - - - - - Default.Personality.12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/php4delphidephi2011.groupproj.local b/php4delphidephi2011.groupproj.local deleted file mode 100644 index 6b0856a..0000000 --- a/php4delphidephi2011.groupproj.local +++ /dev/null @@ -1,13 +0,0 @@ - - - - 2019.03.04 22:04:14.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 2019.03.04 22:24:32.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:25:06.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:25:19.110,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:25:29.886,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - - - - - From d3d38b953d4b5451019e707ad2b9222e520b784a Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 4 Mar 2019 22:39:23 +0200 Subject: [PATCH 06/54] Moved source to separated folder --- .gitignore | 2 + Demos/Tutorial/Step.05/Project1.dpr | 16 - Demos/psvPHP/sample1/Thumbs.db | Bin 18944 -> 0 bytes Clear.bat => Source/Clear.bat | 0 .../DelphiFunctions.pas | 1442 ++++++++--------- .../Extensions/Borland Demo/Unit1.ddp | Bin .../Extensions/Borland Demo/Unit1.dfm | 0 .../Extensions/Borland Demo/Unit1.dti | 0 .../Extensions/Borland Demo/Unit1.pas | 0 .../Extensions/Borland Demo/borland_demo.dpr | 0 .../Borland Demo/borland_demo.dproj | 0 .../Extensions/Borland Demo/borland_demo.php | 0 .../Extensions/Borland Demo/borland_demo.res | Bin .../Extensions/Class demo/class_demo.dpr | 0 .../Extensions/Class demo/class_demo.dproj | 0 .../Extensions/Class demo/class_demo.res | Bin .../Extensions/Class demo/dm_Class.ddp | Bin .../Extensions/Class demo/dm_Class.dfm | 0 .../Extensions/Class demo/dm_Class.dti | 0 .../Extensions/Class demo/dm_Class.pas | 0 .../Extensions/Class demo/test_class.php | 0 .../Delphi Class 1/delphi_class.dpr | 0 .../Delphi Class 1/delphi_class.dproj | 0 .../Delphi Class 1/delphi_class.php | 0 .../Delphi Class 1/delphi_class.res | Bin .../Delphi Class 1/delphi_class_module.ddp | Bin .../Delphi Class 1/delphi_class_module.dfm | 0 .../Delphi Class 1/delphi_class_module.dti | 0 .../Delphi Class 1/delphi_class_module.pas | 0 .../Extensions/Delphi Class 1/readme.txt | 0 .../Delphi Class 2/delphi_class.php | 0 .../Delphi Class 2/delphi_class2.dpr | 0 .../Delphi Class 2/delphi_class2.dproj | 0 .../Delphi Class 2/delphi_class2.php | 0 .../Extensions/Delphi Class 2/readme.txt | 0 .../Extensions/Math/delphi_math.dpr | 0 .../Extensions/Math/delphi_math.dproj | 0 .../Extensions/Math/delphi_math.res | Bin .../Extensions/Math/extmain.ddp | Bin .../Extensions/Math/extmain.dfm | 0 .../Extensions/Math/extmain.dti | 0 .../Extensions/Math/extmain.pas | 0 .../Extensions/Math/test_math.php | 0 .../Read array parameters/Unit1.ddp | Bin .../Read array parameters/Unit1.dfm | 0 .../Read array parameters/Unit1.pas | 0 .../Extensions/Read array parameters/rarp.dpr | 0 .../Read array parameters/rarp.dproj | 0 .../Extensions/Read array parameters/rarp.res | Bin .../Read array parameters/rarptest.php | 0 .../Extensions/Resources/Unit1.ddp | Bin .../Extensions/Resources/Unit1.dfm | 0 .../Extensions/Resources/Unit1.dti | 0 .../Extensions/Resources/Unit1.pas | 0 .../Extensions/Resources/res_ext.dpr | 0 .../Extensions/Resources/res_ext.dproj | 0 .../Extensions/Resources/res_ext.res | Bin .../Extensions/Resources/test_resource.php | 0 .../Extensions/array result/Unit1.ddp | Bin .../Extensions/array result/Unit1.dfm | 0 .../Extensions/array result/Unit1.pas | 0 .../Extensions/array result/rarray.dpr | 0 .../Extensions/array result/rarray.dproj | 0 .../Extensions/array result/rarray.php | 0 .../Extensions/array result/rarray.res | Bin .../Extensions/css/CREDITS | 0 .../Extensions/css/EXPERIMENTAL | 0 .../Extensions/css/css.dpr | 0 .../Extensions/css/css.dproj | 0 .../Extensions/php class/php_class.dpr | 0 .../Extensions/php class/php_class.dproj | 0 .../Extensions/php class/test_class.php | 0 .../Extensions/phpDLL/Unit1.ddp | Bin .../Extensions/phpDLL/Unit1.dfm | 0 .../Extensions/phpDLL/Unit1.dti | 0 .../Extensions/phpDLL/Unit1.pas | 0 .../Extensions/phpDLL/phpDLL.dpr | 0 .../Extensions/phpDLL/phpDLL.dproj | 0 .../Extensions/phpDLL/phpDLL.res | Bin .../Extensions/phpDLL/testdll.php | 0 .../Extensions/reference/Unit1.ddp | Bin .../Extensions/reference/Unit1.dfm | 0 .../Extensions/reference/Unit1.pas | 0 .../Extensions/reference/php_ref.dpr | 0 .../Extensions/reference/php_ref.dproj | 0 .../Extensions/reference/php_ref.res | Bin .../Extensions/reference/testref.php | 0 .../Extensions/skeleton/CREDITS | 0 .../Extensions/skeleton/EXPERIMENTAL | 0 .../Extensions/skeleton/skeleton.bdsproj | 0 .../Extensions/skeleton/skeleton.dpr | 0 .../Extensions/skeleton/skeleton.dproj | 0 .../Extensions/skeleton/tests/skeleton.php | 0 .../skeleton/tests/test_skeleton.php | 0 .../Tutorial/Step.01/Project1.dpr | 0 .../Tutorial/Step.01/Project1.dproj | 0 .../Tutorial/Step.01/Project1.res | Bin .../Tutorial/Step.01/Unit1.ddp | Bin .../Tutorial/Step.01/Unit1.dfm | 0 .../Tutorial/Step.01/Unit1.dti | 0 .../Tutorial/Step.01/Unit1.pas | 0 .../Tutorial/Step.02/Project1.dpr | 0 .../Tutorial/Step.02/Project1.dproj | 0 .../Tutorial/Step.02/Project1.res | Bin .../Tutorial/Step.02/Unit1.ddp | Bin .../Tutorial/Step.02/Unit1.dfm | 0 .../Tutorial/Step.02/Unit1.dti | 0 .../Tutorial/Step.02/Unit1.pas | 0 .../Tutorial/Step.03/Project1.dpr | 0 .../Tutorial/Step.03/Project1.dproj | 0 .../Tutorial/Step.03/Project1.res | Bin .../Tutorial/Step.03/Unit1.ddp | Bin .../Tutorial/Step.03/Unit1.dfm | 0 .../Tutorial/Step.03/Unit1.dti | 0 .../Tutorial/Step.03/Unit1.pas | 0 .../Tutorial/Step.04/Project1.dpr | 0 .../Tutorial/Step.04/Project1.dproj | 0 .../Tutorial/Step.04/Project1.res | Bin .../Tutorial/Step.04/Unit1.ddp | Bin .../Tutorial/Step.04/Unit1.dfm | 0 .../Tutorial/Step.04/Unit1.dti | 0 .../Tutorial/Step.04/Unit1.pas | 0 .../Tutorial/Step.05/Project1.dpr | 0 .../Tutorial/Step.05/Project1.dproj | 0 .../Tutorial/Step.05/Project1.res | Bin .../Tutorial/Step.05/Unit1.ddp | Bin .../Tutorial/Step.05/Unit1.dfm | 0 .../Tutorial/Step.05/Unit1.dti | 0 .../Tutorial/Step.05/Unit1.pas | 0 .../Tutorial/Step.06/test_script.php | 0 .../C#/PHP4DelphiDemo/App.ico | Bin .../C#/PHP4DelphiDemo/AssemblyInfo.cs | 0 .../C#/PHP4DelphiDemo/Form1.cs | 0 .../C#/PHP4DelphiDemo/Form1.resx | 0 .../C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj | 0 .../PHP4DelphiDemo/PHP4DelphiDemo.csproj.user | 0 .../C#/PHP4DelphiDemo/PHP4DelphiDemo.sln | 0 .../C#/PHP4DelphiDemo/app.config | 0 .../C#/PHP4DelphiDemo/test.php | 0 .../php4Applications/C++ VS 2005/StdAfx.cpp | 0 .../php4Applications/C++ VS 2005/StdAfx.h | 0 .../php4Applications/C++ VS 2005/cdemo.cpp | 0 .../php4Applications/C++ VS 2005/cdemo.dsp | 0 .../php4Applications/C++ VS 2005/cdemo.dsw | 0 .../php4Applications/C++ VS 2005/cdemo.sln | 0 .../php4Applications/C++ VS 2005/cdemo.vcproj | 0 .../php4Applications/C++ VS 2005/test.php | 0 .../php4Applications/C++ VS 6.0/StdAfx.cpp | 0 .../php4Applications/C++ VS 6.0/StdAfx.h | 0 .../php4Applications/C++ VS 6.0/cdemo.cpp | 0 .../php4Applications/C++ VS 6.0/cdemo.dsp | 0 .../php4Applications/C++ VS 6.0/cdemo.dsw | 0 .../php4Applications/C++ VS 6.0/test.php | 0 .../Delphi .NET/php4Delphi.MainForm.pas | 0 .../Delphi .NET/php4Delphi.MainForm.resx | 0 .../Delphi .NET/php4Delphi.Standard.pas | 0 .../Delphi .NET/php4Delphi.TWinForm.resources | Bin .../Delphi .NET/php4DelphiDemo.bdsproj | 0 .../Delphi .NET/php4DelphiDemo.dpr | 0 .../Delphi .NET/php4DelphiDemo.res | Bin .../php4Applications/Delphi/Project1.dpr | 0 .../php4Applications/Delphi/Project1.dproj | 0 .../php4Applications/Delphi/Project1.res | Bin .../php4Applications/Delphi/Unit1.ddp | Bin .../php4Applications/Delphi/Unit1.dfm | 0 .../php4Applications/Delphi/Unit1.pas | 0 .../php4Applications/Delphi/result.txt | 0 .../php4Applications/Delphi/test.php | 0 .../php4Applications/MS Word/Doc1.doc | Bin .../php4Applications/MS Word/test.php | 0 .../VB .NET/php4delphi/php4delphi.sln | 0 .../php4delphi/ApplicationEvents.vb | 0 .../php4delphi/php4delphi/Form1.Designer.vb | 0 .../VB .NET/php4delphi/php4delphi/Form1.resx | 0 .../VB .NET/php4delphi/php4delphi/Form1.vb | 0 .../My Project/Application.Designer.vb | 0 .../php4delphi/My Project/Application.myapp | 0 .../php4delphi/php4delphi/php4delphi.vbproj | 0 .../php4delphi/php4delphi.vbproj.user | 0 .../php4Applications/Visual Basic/Form1.frm | 0 .../Visual Basic/MSSCCPRJ.SCC | 0 .../php4Applications/Visual Basic/php_VB.vbp | 0 .../php4Applications/Visual Basic/php_VB.vbw | 0 .../Visual Basic/php_module.bas | 0 .../php4Applications/Visual Basic/test.php | 0 .../psvPHP/Components/ComponentsDemo.dpr | 0 .../psvPHP/Components/ComponentsDemo.dproj | 0 .../psvPHP/Components/ComponentsDemo.res | Bin .../psvPHP/Components/Unit1.ddp | Bin .../psvPHP/Components/Unit1.dfm | 0 .../psvPHP/Components/Unit1.pas | 0 .../psvPHP/Components/WindowsXP.res | Bin .../psvPHP/Custom Library/DemoMain.dfm | 0 .../psvPHP/Custom Library/DemoMain.pas | 0 .../psvPHP/Custom Library/ExtDemo.dpr | 0 .../psvPHP/Custom Library/ExtDemo.dproj | 0 .../psvPHP/Custom Library/ExtDemo.res | Bin .../psvPHP/Custom Library/WindowsXP.res | Bin .../psvPHP/Custom Library/phpShellLibrary.pas | 0 .../psvPHP/Dynamic Array/dynamic_array.dpr | 0 .../psvPHP/Dynamic Array/dynamic_array.dproj | 0 .../psvPHP/Encryption/EncDemo.dpr | 0 .../psvPHP/Encryption/EncDemo.dproj | 0 .../psvPHP/Encryption/EncDemo.res | Bin .../psvPHP/Encryption/WindowsXP.res | Bin .../Encryption/std.encryption.class.inc | 0 .../psvPHP/Encryption/uMain.ddp | Bin .../psvPHP/Encryption/uMain.dfm | 0 .../psvPHP/Encryption/uMain.pas | 0 .../psvPHP/Graph/Project1.dpr | 0 .../psvPHP/Graph/Project1.dproj | 0 .../psvPHP/Graph/Project1.res | Bin .../psvPHP/Graph/Unit1.ddp | Bin .../psvPHP/Graph/Unit1.dfm | 0 .../psvPHP/Graph/Unit1.pas | 0 .../psvPHP/Graph/WindowsXP.res | Bin .../psvPHP/ISAPI Module/dmEngine.ddp | Bin .../psvPHP/ISAPI Module/dmEngine.dfm | 0 .../psvPHP/ISAPI Module/dmEngine.pas | 0 .../psvPHP/ISAPI Module/dmMain.ddp | Bin .../psvPHP/ISAPI Module/dmMain.dfm | 0 .../psvPHP/ISAPI Module/dmMain.pas | 0 .../psvPHP/ISAPI Module/phpISAPITest.dpr | 0 .../psvPHP/ISAPI Module/phpisapitest.bdsproj | 0 .../psvPHP/ISAPI Module/phpisapitest.dproj | 0 .../psvPHP/ISAPI Module/phpisapitest.res | Bin .../psvPHP/Library demo/LibraryDemo.dpr | 0 .../psvPHP/Library demo/LibraryDemo.dproj | 0 .../psvPHP/Library demo/LibraryDemo.res | Bin .../psvPHP/Library demo/Unit1.ddp | Bin .../psvPHP/Library demo/Unit1.dfm | 0 .../psvPHP/Library demo/Unit1.pas | 0 .../psvPHP/Library demo/WindowsXP.res | Bin .../psvPHP/Library demo/dm_Main.dfm | 0 .../psvPHP/Library demo/dm_Main.dti | 0 .../psvPHP/Library demo/dm_Main.pas | 0 .../psvPHP/Library demo/frm_dialog.dfm | 0 .../psvPHP/Library demo/frm_dialog.pas | 0 .../psvPHP/Logo/LogoDemo.dpr | 0 .../psvPHP/Logo/LogoDemo.dproj | 0 .../psvPHP/Logo/LogoDemo.res | Bin .../psvPHP/Logo/WindowsXP.res | Bin .../psvPHP/Logo/egg.gif | Bin .../psvPHP/Logo/uMain.dfm | 0 .../psvPHP/Logo/uMain.pas | 0 .../Multithread simple/MultithreadSample.dpr | 0 .../MultithreadSample.dproj | 0 .../Multithread simple/MultithreadSample.res | Bin .../psvPHP/Multithread simple/WindowsXP.res | Bin .../psvPHP/Multithread simple/frm_main.ddp | Bin .../psvPHP/Multithread simple/frm_main.dfm | 0 .../psvPHP/Multithread simple/frm_main.pas | 0 .../psvPHP/Multithread simple/php_thread.pas | 0 .../psvPHP/array demo/Project1.dpr | 0 .../psvPHP/array demo/Project1.dproj | 0 .../psvPHP/array demo/Project1.res | Bin .../psvPHP/array demo/Unit1.ddp | Bin .../psvPHP/array demo/Unit1.dfm | 0 .../psvPHP/array demo/Unit1.pas | 0 .../psvPHP/array demo/WindowsXP.res | Bin .../psvPHP/console/phpcon.dpr | 0 .../psvPHP/console/phpcon.dproj | 0 .../psvPHP/console/test.php | 0 .../psvPHP/sample1/Sample1.dpr | 0 .../psvPHP/sample1/Sample1.dproj | 0 .../psvPHP/sample1/Sample1.res | Bin .../psvPHP/sample1/frm_phpDemo.ddp | Bin .../psvPHP/sample1/frm_phpDemo.dfm | 0 .../psvPHP/sample1/frm_phpDemo.pas | 0 .../psvPHP/sample1/internal.RES | Bin .../psvPHP/sample1/internal.rc | 0 .../psvPHP/sample1/php.gif | Bin .../psvPHP/sample1/test.php | 0 .../psvPHP/sample1/zend1.gif | Bin .../psvPHP/sample1/zend2.gif | Bin .../psvPHP/sample2/Sample2.dpr | 0 .../psvPHP/sample2/Sample2.dproj | 0 .../psvPHP/sample2/Sample2.res | Bin .../psvPHP/sample2/Unit1.ddp | Bin .../psvPHP/sample2/Unit1.dfm | 0 .../psvPHP/sample2/Unit1.pas | 0 .../psvPHP/sample2/WindowsXP.res | Bin .../psvPHP/sample3/Sample3.dpr | 0 .../psvPHP/sample3/Sample3.dproj | 0 .../psvPHP/sample3/Sample3.res | Bin .../psvPHP/sample3/Unit1.ddp | Bin .../psvPHP/sample3/Unit1.dfm | 0 .../psvPHP/sample3/Unit1.pas | 0 .../psvPHP/sample3/WindowsXP.res | Bin .../psvPHP/sample4/WindowsXP.res | Bin .../psvPHP/sample4/frm_PHPTest.ddp | Bin .../psvPHP/sample4/frm_PHPTest.dfm | 0 .../psvPHP/sample4/frm_PHPTest.pas | 0 .../psvPHP/sample4/psvPHP_test.dpr | 0 .../psvPHP/sample4/psvPHP_test.dproj | 0 .../psvPHP/sample4/psvPHP_test.res | Bin .../Bonus/JpegConverter/php_jpeg.bdsproj | 0 .../Demos}/Bonus/JpegConverter/php_jpeg.dpr | 584 +++---- .../Demos}/Bonus/JpegConverter/php_jpeg.php | 32 +- .../Bonus/PHPEncoder/phpencoder.bdsproj | 0 .../Demos}/Bonus/PHPEncoder/phpencoder.dpr | 220 +-- .../Demos}/Bonus/PHPEncoder/test.php | 8 +- .../Bonus/phpRegistry/Bin/php_registry.dll | Bin .../Demos}/Bonus/phpRegistry/php_registry.dpr | 1292 +++++++-------- .../Bonus/phpRegistry/php_registry.dproj | 0 .../phpRegistry/php_registry.dproj.local | 0 .../Bonus/phpRegistry/php_registry.identcache | Bin .../Bonus/phpRegistry/php_registry.stat | 0 .../Demos}/Bonus/wincon/Bin/php_wincon.dll | Bin .../Demos/Bonus/wincon/Bin}/test_wincon.php | 0 .../Demos}/Bonus/wincon/php_wincon.h | 118 +- .../Demos}/Bonus/wincon/resource.h | 28 +- .../Demos/Bonus/wincon}/test_wincon.php | 26 +- {Demos => Source/Demos}/Bonus/wincon/wincon.c | 1332 +++++++-------- .../Demos}/Bonus/wincon/wincon.dsp | 226 +-- .../Demos}/Bonus/wincon/wincon.dsw | 58 +- .../Demos}/Bonus/wincon/wincon.rc | 230 +-- .../Demos}/Bonus/wincon/wincon.sln | 40 +- .../Demos}/Bonus/wincon/wincon.vcproj | 534 +++--- .../Demos}/Delphi4PHP/DesignIDE/d4pide.dpr | 0 .../Demos}/Delphi4PHP/DesignIDE/readme.txt | 0 .../Demos}/Extensions/Borland Demo/Unit1.ddp | Bin .../Demos}/Extensions/Borland Demo/Unit1.dfm | 278 ++-- .../Demos}/Extensions/Borland Demo/Unit1.dti | 82 +- .../Demos}/Extensions/Borland Demo/Unit1.pas | 474 +++--- .../Extensions/Borland Demo/borland_demo.dpr | 30 +- .../Borland Demo/borland_demo.dproj | 0 .../Borland Demo/borland_demo.dproj.local | 0 .../Borland Demo/borland_demo.identcache | Bin .../Extensions/Borland Demo/borland_demo.php | 36 +- .../Extensions/Borland Demo/borland_demo.res | Bin .../Extensions/Borland Demo/borland_demo.stat | 0 .../Borland Demo/borland_demo_Icon.ico | Bin .../Extensions/Class demo/class_demo.bdsproj | 0 .../Extensions/Class demo/class_demo.dpr | 30 +- .../Extensions/Class demo/class_demo.res | Bin .../Demos}/Extensions/Class demo/dm_Class.ddp | Bin .../Demos}/Extensions/Class demo/dm_Class.dfm | 126 +- .../Demos}/Extensions/Class demo/dm_Class.dti | 82 +- .../Demos}/Extensions/Class demo/dm_Class.pas | 202 +-- .../Extensions/Class demo/test_class.php | 30 +- .../Delphi Class 1/delphi_class.bdsproj | 0 .../Delphi Class 1/delphi_class.dpr | 30 +- .../Delphi Class 1/delphi_class.php | 30 +- .../Delphi Class 1/delphi_class.res | Bin .../Delphi Class 1/delphi_class_module.ddp | Bin .../Delphi Class 1/delphi_class_module.dfm | 182 +-- .../Delphi Class 1/delphi_class_module.dti | 82 +- .../Delphi Class 1/delphi_class_module.pas | 682 ++++---- .../Extensions/Delphi Class 1/readme.txt | 0 .../Delphi Class 2/delphi_class.php | 84 +- .../Delphi Class 2/delphi_class2.bdsproj | 0 .../Delphi Class 2/delphi_class2.dpr | 292 ++-- .../Delphi Class 2/delphi_class2.php | 52 +- .../Extensions/Delphi Class 2/readme.txt | 0 .../Extensions/Math/delphi_math.bdsproj | 0 .../Demos}/Extensions/Math/delphi_math.dpr | 30 +- .../Demos}/Extensions/Math/delphi_math.res | Bin .../Demos}/Extensions/Math/extmain.ddp | Bin .../Demos}/Extensions/Math/extmain.dfm | 100 +- .../Demos}/Extensions/Math/extmain.dti | 82 +- .../Demos}/Extensions/Math/extmain.pas | 170 +- .../Demos}/Extensions/Math/test_math.php | 60 +- .../Read array parameters/Unit1.ddp | Bin .../Read array parameters/Unit1.dfm | 0 .../Read array parameters/Unit1.pas | 0 .../Read array parameters/rarp.bdsproj | 0 .../Extensions/Read array parameters/rarp.dpr | 0 .../Extensions/Read array parameters/rarp.res | Bin .../Read array parameters/rarptest.php | 0 .../Demos}/Extensions/Resources/Unit1.ddp | Bin .../Demos}/Extensions/Resources/Unit1.dfm | 54 +- .../Demos/Extensions/Resources}/Unit1.dti | 82 +- .../Demos}/Extensions/Resources/Unit1.pas | 188 +-- .../Extensions/Resources/res_ext.bdsproj | 0 .../Demos}/Extensions/Resources/res_ext.dpr | 30 +- .../Demos}/Extensions/Resources/res_ext.res | Bin .../Extensions/Resources/test_resource.php | 42 +- .../Demos}/Extensions/array result/Unit1.ddp | Bin .../Demos}/Extensions/array result/Unit1.dfm | 44 +- .../Demos}/Extensions/array result/Unit1.pas | 222 +-- .../Extensions/array result/rarray.bdsproj | 0 .../Demos}/Extensions/array result/rarray.dpr | 30 +- .../Extensions/array result/rarray.dproj | 0 .../array result/rarray.dproj.local | 0 .../Extensions/array result/rarray.identcache | Bin .../Demos}/Extensions/array result/rarray.php | 62 +- .../Demos}/Extensions/array result/rarray.res | Bin .../Extensions/array result/rarray.stat | 0 .../Extensions/array result/rarray_Icon.ico | Bin .../Demos}/Extensions/css/CREDITS | 0 .../Demos}/Extensions/css/EXPERIMENTAL | 0 .../Demos}/Extensions/css/css.bdsproj | 0 .../Demos}/Extensions/css/css.dpr | 258 +-- .../Demos}/Extensions/css/css.dproj | 0 .../Demos}/Extensions/css/css.dproj.local | 0 .../Demos}/Extensions/css/css.identcache | Bin .../Demos}/Extensions/css/css.res | Bin .../Demos}/Extensions/css/css.stat | 0 .../Demos}/Extensions/killer/CREDITS | 0 .../Extensions/killer/ProcessViewer.pas | 468 +++--- .../Demos}/Extensions/killer/Unit1.dfm | 40 +- .../Demos}/Extensions/killer/Unit1.dti | 82 +- .../Demos}/Extensions/killer/Unit1.pas | 106 +- .../Demos}/Extensions/killer/killer.dpr | 32 +- .../Demos}/Extensions/killer/killer.res | Bin .../Extensions/killer/tests/test_killer.php | 46 +- .../Extensions/php class/php_class.bdsproj | 0 .../Demos}/Extensions/php class/php_class.dpr | 334 ++-- .../Extensions/php class/test_class.php | 30 +- .../Demos}/Extensions/phpDLL/Unit1.ddp | Bin .../Demos}/Extensions/phpDLL/Unit1.dfm | 40 +- .../Demos/Extensions/phpDLL}/Unit1.dti | 82 +- .../Demos}/Extensions/phpDLL/Unit1.pas | 110 +- .../Demos}/Extensions/phpDLL/phpDLL.bdsproj | 0 .../Demos}/Extensions/phpDLL/phpDLL.dpr | 30 +- .../Demos}/Extensions/phpDLL/phpDLL.res | Bin .../Demos}/Extensions/phpDLL/testdll.php | 48 +- .../Demos}/Extensions/reference/Unit1.ddp | Bin .../Demos}/Extensions/reference/Unit1.dfm | 48 +- .../Demos}/Extensions/reference/Unit1.pas | 88 +- .../Extensions/reference/php_ref.bdsproj | 0 .../Demos}/Extensions/reference/php_ref.dpr | 30 +- .../Demos}/Extensions/reference/php_ref.res | Bin .../Demos}/Extensions/reference/testref.php | 56 +- .../Demos}/Extensions/skeleton/CREDITS | 0 .../Demos}/Extensions/skeleton/EXPERIMENTAL | 0 .../Extensions/skeleton/skeleton.bdsproj | 0 .../Demos}/Extensions/skeleton/skeleton.dpr | 254 +-- .../Demos}/Extensions/skeleton/skeleton.dproj | 0 .../Extensions/skeleton/tests/skeleton.php | 38 +- .../skeleton/tests/test_skeleton.php | 50 +- .../Demos/Tutorial/Step.01}/Project1.dpr | 30 +- .../Demos}/Tutorial/Step.01/Project1.res | Bin .../Demos}/Tutorial/Step.01/Unit1.ddp | Bin .../Demos}/Tutorial/Step.01/Unit1.dfm | 18 +- .../Demos}/Tutorial/Step.01/Unit1.dti | 82 +- .../Demos}/Tutorial/Step.01/Unit1.pas | 88 +- .../Demos/Tutorial/Step.02}/Project1.dpr | 30 +- .../Demos}/Tutorial/Step.02/Project1.res | Bin .../Demos}/Tutorial/Step.02/Unit1.ddp | Bin .../Demos}/Tutorial/Step.02/Unit1.dfm | 20 +- .../Demos}/Tutorial/Step.02/Unit1.dti | 82 +- .../Demos/Tutorial/Step.02}/Unit1.pas | 88 +- .../Demos/Tutorial/Step.03}/Project1.dpr | 30 +- .../Demos}/Tutorial/Step.03/Project1.res | Bin .../Demos}/Tutorial/Step.03/Unit1.ddp | Bin .../Demos}/Tutorial/Step.03/Unit1.dfm | 30 +- .../Demos}/Tutorial/Step.03/Unit1.dti | 82 +- .../Demos}/Tutorial/Step.03/Unit1.pas | 88 +- .../Demos/Tutorial/Step.04}/Project1.dpr | 30 +- .../Demos}/Tutorial/Step.04/Project1.res | Bin .../Demos}/Tutorial/Step.04/Unit1.ddp | Bin .../Demos}/Tutorial/Step.04/Unit1.dfm | 38 +- .../Demos/Tutorial/Step.04}/Unit1.dti | 82 +- .../Demos/Tutorial/Step.04}/Unit1.pas | 88 +- Source/Demos/Tutorial/Step.05/Project1.dpr | 16 + .../Demos}/Tutorial/Step.05/Project1.dproj | 0 .../Demos}/Tutorial/Step.05/Project1.res | Bin .../Demos}/Tutorial/Step.05/Unit1.ddp | Bin .../Demos}/Tutorial/Step.05/Unit1.dfm | 40 +- .../Demos/Tutorial/Step.05}/Unit1.dti | 82 +- .../Demos}/Tutorial/Step.05/Unit1.pas | 112 +- .../Demos}/Tutorial/Step.06/test_script.php | 44 +- .../C#/PHP4DelphiDemo/App.ico | Bin .../C#/PHP4DelphiDemo/AssemblyInfo.cs | 116 +- .../C#/PHP4DelphiDemo/Form1.cs | 446 ++--- .../C#/PHP4DelphiDemo/Form1.resx | 244 +-- .../C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj | 222 +-- .../PHP4DelphiDemo/PHP4DelphiDemo.csproj.user | 114 +- .../C#/PHP4DelphiDemo/PHP4DelphiDemo.sln | 38 +- .../C#/PHP4DelphiDemo/app.config | 8 +- .../C#/PHP4DelphiDemo}/test.php | 8 +- .../php4Applications/C++ VS 2005/StdAfx.cpp | 16 +- .../php4Applications/C++ VS 2005/StdAfx.h | 38 +- .../php4Applications/C++ VS 2005/cdemo.cpp | 202 +-- .../php4Applications/C++ VS 2005}/cdemo.dsp | 226 +-- .../php4Applications/C++ VS 2005}/cdemo.dsw | 58 +- .../php4Applications/C++ VS 2005/cdemo.sln | 40 +- .../php4Applications/C++ VS 2005/cdemo.vcproj | 536 +++--- .../php4Applications/C++ VS 2005}/test.php | 10 +- .../php4Applications/C++ VS 6.0/StdAfx.cpp | 16 +- .../php4Applications/C++ VS 6.0/StdAfx.h | 38 +- .../php4Applications/C++ VS 6.0/cdemo.cpp | 202 +-- .../php4Applications/C++ VS 6.0}/cdemo.dsp | 226 +-- .../php4Applications/C++ VS 6.0}/cdemo.dsw | 58 +- .../php4Applications/C++ VS 6.0}/test.php | 10 +- .../Delphi .NET/php4Delphi.MainForm.pas | 284 ++-- .../Delphi .NET/php4Delphi.MainForm.resx | 284 ++-- .../Delphi .NET/php4Delphi.Standard.pas | 104 +- .../Delphi .NET/php4Delphi.TWinForm.resources | Bin .../Delphi .NET/php4DelphiDemo.bdsproj | 470 +++--- .../Delphi .NET/php4DelphiDemo.dpr | 200 +-- .../Delphi .NET/php4DelphiDemo.res | Bin .../php4Applications/Delphi/Project1.bdsproj | 0 .../php4Applications/Delphi/Project1.dpr | 26 +- .../php4Applications/Delphi/Project1.res | Bin .../Demos}/php4Applications/Delphi/Unit1.ddp | Bin .../Demos}/php4Applications/Delphi/Unit1.dfm | 124 +- .../Demos}/php4Applications/Delphi/Unit1.pas | 254 +-- .../Demos}/php4Applications/Delphi/result.txt | 0 .../Demos/php4Applications/Delphi}/test.php | 10 +- .../Demos}/php4Applications/MS Word/Doc1.doc | Bin .../Demos/php4Applications/MS Word}/test.php | 8 +- .../VB .NET/php4delphi/php4delphi.sln | 40 +- .../php4delphi/ApplicationEvents.vb | 30 +- .../php4delphi/php4delphi/Form1.Designer.vb | 142 +- .../VB .NET/php4delphi/php4delphi/Form1.resx | 244 +-- .../VB .NET/php4delphi/php4delphi/Form1.vb | 64 +- .../My Project/Application.Designer.vb | 76 +- .../php4delphi/My Project/Application.myapp | 18 +- .../php4delphi/php4delphi/php4delphi.vbproj | 174 +- .../php4delphi/php4delphi.vbproj.user | 30 +- .../php4Applications/Visual Basic/Form1.frm | 100 +- .../Visual Basic/MSSCCPRJ.SCC | 10 +- .../php4Applications/Visual Basic/php_VB.vbp | 64 +- .../php4Applications/Visual Basic/php_VB.vbw | 4 +- .../Visual Basic/php_module.bas | 28 +- .../php4Applications/Visual Basic/test.php | 8 +- .../psvPHP/Components/ComponentsDemo.bdsproj | 0 .../psvPHP/Components/ComponentsDemo.dpr | 28 +- .../psvPHP/Components/ComponentsDemo.res | Bin .../Demos}/psvPHP/Components/Unit1.ddp | Bin .../Demos}/psvPHP/Components/Unit1.dfm | 120 +- .../Demos}/psvPHP/Components/Unit1.pas | 268 +-- .../Demos}/psvPHP/Components/WindowsXP.res | Bin .../Demos}/psvPHP/Custom Library/DemoMain.dfm | 0 .../Demos}/psvPHP/Custom Library/DemoMain.pas | 0 .../psvPHP/Custom Library/ExtDemo.bdsproj | 0 .../Demos}/psvPHP/Custom Library/ExtDemo.dpr | 0 .../Demos}/psvPHP/Custom Library/ExtDemo.res | Bin .../psvPHP/Custom Library/WindowsXP.res | Bin .../psvPHP/Custom Library/phpShellLibrary.pas | 206 +-- .../psvPHP/Dynamic Array/dynamic_array.dpr | 48 +- .../Demos}/psvPHP/Encryption/EncDemo.dpr | 28 +- .../Demos}/psvPHP/Encryption/EncDemo.res | Bin .../Demos}/psvPHP/Encryption/WindowsXP.res | Bin .../Encryption/std.encryption.class.inc | 504 +++--- .../Demos}/psvPHP/Encryption/uMain.ddp | Bin .../Demos}/psvPHP/Encryption/uMain.dfm | 470 +++--- .../Demos}/psvPHP/Encryption/uMain.pas | 286 ++-- .../Demos}/psvPHP/Graph/Project1.dpr | 26 +- .../Demos}/psvPHP/Graph/Project1.res | Bin .../Demos}/psvPHP/Graph/Unit1.ddp | Bin .../Demos}/psvPHP/Graph/Unit1.dfm | 240 +-- .../Demos}/psvPHP/Graph/Unit1.pas | 418 ++--- .../Demos}/psvPHP/Graph/WindowsXP.res | Bin .../Demos}/psvPHP/ISAPI Module/dmEngine.ddp | Bin .../Demos}/psvPHP/ISAPI Module/dmEngine.dfm | 0 .../Demos}/psvPHP/ISAPI Module/dmEngine.pas | 0 .../Demos}/psvPHP/ISAPI Module/dmMain.ddp | Bin .../Demos}/psvPHP/ISAPI Module/dmMain.dfm | 0 .../Demos}/psvPHP/ISAPI Module/dmMain.pas | 0 .../psvPHP/ISAPI Module/phpisapitest.bdsproj | 0 .../psvPHP/ISAPI Module/phpisapitest.dpr | 0 .../psvPHP/ISAPI Module/phpisapitest.res | Bin .../psvPHP/Library demo/LibraryDemo.dpr | 0 .../psvPHP/Library demo/LibraryDemo.res | Bin .../Demos}/psvPHP/Library demo/Project1.dpr | 26 +- .../Demos}/psvPHP/Library demo/Project1.res | Bin .../Demos}/psvPHP/Library demo/Unit1.ddp | Bin .../Demos}/psvPHP/Library demo/Unit1.dfm | 160 +- .../Demos}/psvPHP/Library demo/Unit1.pas | 154 +- .../Demos}/psvPHP/Library demo/WindowsXP.res | Bin .../Demos}/psvPHP/Library demo/dm_Main.dfm | 0 .../Demos}/psvPHP/Library demo/dm_Main.dti | 0 .../Demos}/psvPHP/Library demo/dm_Main.pas | 0 .../Demos}/psvPHP/Library demo/frm_dialog.dfm | 0 .../Demos}/psvPHP/Library demo/frm_dialog.pas | 0 .../Demos}/psvPHP/Logo/LogoDemo.dpr | 26 +- .../Demos}/psvPHP/Logo/LogoDemo.res | Bin .../Demos}/psvPHP/Logo/WindowsXP.res | Bin {Demos => Source/Demos}/psvPHP/Logo/egg.gif | Bin {Demos => Source/Demos}/psvPHP/Logo/uMain.dfm | 72 +- {Demos => Source/Demos}/psvPHP/Logo/uMain.pas | 92 +- .../Multithread simple/MultithreadSample.dpr | 0 .../Multithread simple/MultithreadSample.res | Bin .../psvPHP/Multithread simple/WindowsXP.res | Bin .../psvPHP/Multithread simple/frm_main.ddp | Bin .../psvPHP/Multithread simple/frm_main.dfm | 0 .../psvPHP/Multithread simple/frm_main.pas | 0 .../psvPHP/Multithread simple/php_thread.pas | 0 .../Thread Management/ManageThreads.dpr | 0 .../Thread Management/ManageThreads.res | Bin .../psvPHP/Thread Management/frm_main.dfm | 0 .../psvPHP/Thread Management/frm_main.pas | 0 .../psvPHP/Thread Management/php_thread.pas | 0 .../psvPHP/Threads Library/ManageThreads.dpr | 0 .../psvPHP/Threads Library/ManageThreads.res | Bin .../psvPHP/Threads Library/frm_main.ddp | Bin .../psvPHP/Threads Library/frm_main.dfm | 0 .../psvPHP/Threads Library/frm_main.pas | 0 .../psvPHP/Threads Library/php_thread.pas | 0 .../Demos}/psvPHP/array demo/Project1.bdsproj | 0 .../Demos}/psvPHP/array demo/Project1.dpr | 26 +- .../Demos}/psvPHP/array demo/Project1.res | Bin .../Demos}/psvPHP/array demo/Unit1.ddp | Bin .../Demos}/psvPHP/array demo/Unit1.dfm | 120 +- .../Demos}/psvPHP/array demo/Unit1.pas | 214 +-- .../Demos}/psvPHP/array demo/WindowsXP.res | Bin .../Demos}/psvPHP/console/phpcon.dpr | 70 +- .../Demos/psvPHP/console}/test.php | 8 +- .../Demos}/psvPHP/sample1/Project1.dpr | 36 +- .../Demos}/psvPHP/sample1/Project1.res | Bin .../Demos}/psvPHP/sample1/Sample1.bdsproj | 0 .../Demos}/psvPHP/sample1/Sample1.dpr | 0 .../Demos}/psvPHP/sample1/Sample1.dproj | 0 .../Demos}/psvPHP/sample1/Sample1.res | Bin Source/Demos/psvPHP/sample1/Thumbs.db | Bin 0 -> 18944 bytes .../Demos}/psvPHP/sample1/Unit1.ddp | Bin .../Demos}/psvPHP/sample1/Unit1.dfm | 362 ++--- .../Demos}/psvPHP/sample1/Unit1.pas | 316 ++-- .../Demos}/psvPHP/sample1/WindowsXP.res | Bin .../Demos}/psvPHP/sample1/frm_phpDemo.ddp | Bin .../Demos}/psvPHP/sample1/frm_phpDemo.dfm | 0 .../Demos}/psvPHP/sample1/frm_phpDemo.pas | 0 .../Demos}/psvPHP/sample1/internal.RES | Bin .../Demos}/psvPHP/sample1/internal.rc | 6 +- .../Demos}/psvPHP/sample1/php.gif | Bin .../Demos/psvPHP/sample1}/test.php | 8 +- .../Demos}/psvPHP/sample1/zend1.gif | Bin .../Demos}/psvPHP/sample1/zend2.gif | Bin .../Demos}/psvPHP/sample2/Project1.dpr | 28 +- .../Demos}/psvPHP/sample2/Project1.res | Bin .../Demos}/psvPHP/sample2/Sample2.bdsproj | 0 .../Demos}/psvPHP/sample2/Sample2.dpr | 0 .../Demos}/psvPHP/sample2/Sample2.res | Bin .../Demos}/psvPHP/sample2/Unit1.ddp | Bin .../Demos}/psvPHP/sample2/Unit1.dfm | 174 +- .../Demos}/psvPHP/sample2/Unit1.pas | 106 +- .../Demos}/psvPHP/sample3/Project1.dpr | 26 +- .../Demos}/psvPHP/sample3/Project1.res | Bin .../Demos}/psvPHP/sample3/Sample3.dpr | 0 .../Demos}/psvPHP/sample3/Sample3.res | Bin .../Demos}/psvPHP/sample3/Unit1.ddp | Bin .../Demos}/psvPHP/sample3/Unit1.dfm | 182 +-- .../Demos}/psvPHP/sample3/Unit1.pas | 154 +- .../Demos}/psvPHP/sample3/WindowsXP.res | Bin .../Demos}/psvPHP/sample4/WindowsXP.res | Bin .../Demos}/psvPHP/sample4/frm_PHPTest.ddp | Bin .../Demos}/psvPHP/sample4/frm_PHPTest.dfm | 206 +-- .../Demos}/psvPHP/sample4/frm_PHPTest.pas | 106 +- .../Demos}/psvPHP/sample4/psvPHP_test.dpr | 26 +- .../Demos}/psvPHP/sample4/psvPHP_test.res | Bin .../ExtensionBuilder}/Builder.Inc | 134 +- .../ExtensionBuilder}/PHPEXT.RES | Bin .../ExtensionBuilder}/frm_Functions.dfm | 108 +- .../ExtensionBuilder}/frm_Functions.pas | 56 +- .../ExtensionBuilder}/phpExtBuilderD5.dpk | 74 +- .../ExtensionBuilder}/phpExtBuilderD5.res | Bin .../ExtensionBuilder}/phpExtBuilderD6.dpk | 74 +- .../ExtensionBuilder}/phpExtBuilderD6.res | Bin .../ExtensionBuilder}/phpExtBuilderD7.dpk | 74 +- .../ExtensionBuilder}/phpExtBuilderD7.res | Bin .../ExtensionBuilder}/phpExtensionBuilder.pas | 760 ++++----- PHP.INC => Source/PHP.INC | 426 ++--- .../PHP4DelphiD2006.bdsproj | 0 .../PHP4DelphiD2006.dpk | 84 +- .../PHP4DelphiD2006.dproj | 0 .../PHP4DelphiD2006.dproj.local | 0 .../PHP4DelphiD2006.res | Bin .../PHP4DelphiD2006.stat | 0 .../PHP4DelphiD2006_Icon.ico | Bin PHPAPI.pas => Source/PHPAPI.pas | 628 +++---- PHPCommon.pas => Source/PHPCommon.pas | 0 PHPFunctions.pas => Source/PHPFunctions.pas | 0 PHPLibrary.pas => Source/PHPLibrary.pas | 0 .../PHPProjectWizard.pas | 0 .../PHPProjectWizard.res | Bin PHPTypes.pas => Source/PHPTypes.pas | 0 .../Php4DelphiGroup5.bpg | 46 +- .../Php4DelphiGroup7.bpg | 46 +- ZENDAPI.pas => Source/ZENDAPI.pas | 1364 ++++++++-------- ZendTypes.pas => Source/ZendTypes.pas | 66 +- logos.pas => Source/logos.pas | 0 .../php4delphi Delphi 10 Seattle.groupproj | 0 ...p4delphi Delphi 10 Seattle.groupproj.local | 0 .../php4delphi Delphi 10.1 Berlin.groupproj | 0 ...4delphi Delphi 10.1 Berlin.groupproj.local | 0 .../php4delphi Delphi 10.2 Tokyo.groupproj | 0 ...p4delphi Delphi 10.2 Tokyo.groupproj.local | 0 .../php4delphi Delphi 2010.groupproj | 0 .../php4delphi Delphi 2010.groupproj.local | 0 .../php4delphi Delphi 2011.groupproj | 0 .../php4delphi Delphi 2011.groupproj.local | 0 .../packages}/php4delphi Delphi XE1.groupproj | 0 .../php4delphi Delphi XE1.groupproj.local | 0 .../packages}/php4delphi Delphi XE2.groupproj | 0 .../php4delphi Delphi XE2.groupproj.local | 0 .../packages}/php4delphi Delphi XE3.groupproj | 0 .../php4delphi Delphi XE3.groupproj.local | 0 .../packages}/php4delphi Delphi XE4.groupproj | 0 .../php4delphi Delphi XE4.groupproj.local | 0 .../packages}/php4delphi Delphi XE5.groupproj | 0 .../php4delphi Delphi XE5.groupproj.local | 0 .../packages}/php4delphi Delphi XE6.groupproj | 0 .../php4delphi Delphi XE6.groupproj.local | 0 .../packages}/php4delphi Delphi XE7.groupproj | 0 .../php4delphi Delphi XE7.groupproj.local | 0 .../packages}/php4delphi Delphi XE8.groupproj | 0 .../php4delphi Delphi XE8.groupproj.local | 0 .../php4delphi Delphi XE8_prjgroup.tvsconfig | 0 php4App.dll => Source/php4App.dll | Bin php4App.dpr => Source/php4App.dpr | 0 php4App.dproj => Source/php4App.dproj | 0 .../php4App.dproj.local | 0 .../php4App.identcache | Bin php4App.res => Source/php4App.res | Bin php4App.stat => Source/php4App.stat | 0 php4AppIntf.pas => Source/php4AppIntf.pas | 0 php4AppUnit.pas => Source/php4AppUnit.pas | 0 php4App_Icon.ico => Source/php4App_Icon.ico | Bin .../php4Applications}/PHP 4.4.6/php4App.dll | Bin .../php4Applications}/PHP 5.2.11/php4App.dll | Bin .../php4Applications}/PHP 5.3.0/php4App.dll | Bin .../php4Applications}/PHP4/php4App.dll | Bin .../php4Applications}/PHP511/php4App.dll | Bin .../php4Applications}/PHP512/php4App.dll | Bin .../php4Delphi2005.bdsgroup | 40 +- .../php4Delphi2006.bdsgroup | 40 +- .../php4DelphiD2005.bdsproj | 330 ++-- .../php4DelphiD2005.dpk | 84 +- .../php4DelphiD2005.dproj | 0 .../php4DelphiD2005.dproj.local | 0 .../php4DelphiD2005.res | Bin .../php4DelphiD2005.stat | 0 .../php4DelphiD2005_Icon.ico | Bin .../php4DelphiD2007.dpk | 0 .../php4DelphiD2007.dproj | 0 .../php4DelphiD2007.dproj.local | 0 .../php4DelphiD2007.res | Bin .../php4DelphiD2007.stat | 0 .../php4DelphiD2007_Icon.ico | Bin .../php4DelphiD2009.dpk | 0 .../php4DelphiD2009.dproj | 0 .../php4DelphiD2009.dproj.local | 0 .../php4DelphiD2009.res | Bin .../php4DelphiD2009.stat | 0 .../php4DelphiD2009_Icon.ico | Bin .../php4DelphiD2010.dpk | 0 .../php4DelphiD2010.dproj | 0 .../php4DelphiD2010.dproj.local | 0 .../php4DelphiD2010.identcache | Bin .../php4DelphiD2010.res | Bin .../php4DelphiD2010.stat | 2 +- .../php4DelphiD2010_Icon.ico | Bin php4DelphiD5.dpk => Source/php4DelphiD5.dpk | 78 +- .../php4DelphiD5.dproj | 0 .../php4DelphiD5.dproj.local | 0 php4DelphiD5.res => Source/php4DelphiD5.res | Bin php4DelphiD5.stat => Source/php4DelphiD5.stat | 0 .../php4DelphiD5_Icon.ico | Bin php4DelphiD6.dpk => Source/php4DelphiD6.dpk | 78 +- .../php4DelphiD6.dproj | 0 .../php4DelphiD6.dproj.local | 0 php4DelphiD6.res => Source/php4DelphiD6.res | Bin php4DelphiD6.stat => Source/php4DelphiD6.stat | 0 .../php4DelphiD6_Icon.ico | Bin php4DelphiD7.dpk => Source/php4DelphiD7.dpk | 84 +- .../php4DelphiD7.dproj | 0 .../php4DelphiD7.dproj.local | 0 php4DelphiD7.res => Source/php4DelphiD7.res | Bin php4DelphiD7.stat => Source/php4DelphiD7.stat | 0 .../php4DelphiD7_Icon.ico | Bin .../php4DelphiR2005.bdsproj | 330 ++-- .../php4DelphiR2005.dpk | 90 +- .../php4DelphiR2005.dproj | 0 .../php4DelphiR2005.dproj.local | 0 .../php4DelphiR2005.res | Bin .../php4DelphiR2005.stat | 0 .../php4DelphiR2005_Icon.ico | Bin .../php4DelphiR2006.bdsproj | 0 .../php4DelphiR2006.dpk | 90 +- .../php4DelphiR2006.dproj | 0 .../php4DelphiR2006.dproj.local | 0 .../php4DelphiR2006.res | Bin .../php4DelphiR2006.stat | 0 .../php4DelphiR2006_Icon.ico | Bin .../php4DelphiR2007.bpl | Bin .../php4DelphiR2007.dpk | 0 .../php4DelphiR2007.dproj | 0 .../php4DelphiR2007.dproj.local | 0 .../php4DelphiR2007.res | Bin .../php4DelphiR2007.stat | 0 .../php4DelphiR2007_Icon.ico | Bin .../php4DelphiR2009.dpk | 0 .../php4DelphiR2009.dproj | 0 .../php4DelphiR2009.dproj.local | 0 .../php4DelphiR2009.res | Bin .../php4DelphiR2009.stat | 0 .../php4DelphiR2009_Icon.ico | Bin .../php4DelphiR2010.dpk | 0 .../php4DelphiR2010.dproj | 0 .../php4DelphiR2010.dproj.local | 0 .../php4DelphiR2010.identcache | Bin .../php4DelphiR2010.stat | 0 .../php4DelphiR2010_Icon.ico | Bin php4DelphiR5.dpk => Source/php4DelphiR5.dpk | 88 +- .../php4DelphiR5.dproj | 0 .../php4DelphiR5.dproj.local | 0 .../php4DelphiR5.identcache | Bin php4DelphiR5.res => Source/php4DelphiR5.res | Bin php4DelphiR5.stat => Source/php4DelphiR5.stat | 0 .../php4DelphiR5_Icon.ico | Bin php4DelphiR6.dpk => Source/php4DelphiR6.dpk | 90 +- .../php4DelphiR6.dproj | 0 .../php4DelphiR6.dproj.local | 0 php4DelphiR6.res => Source/php4DelphiR6.res | Bin php4DelphiR6.stat => Source/php4DelphiR6.stat | 0 .../php4DelphiR6_Icon.ico | Bin php4DelphiR7.dpk => Source/php4DelphiR7.dpk | 90 +- .../php4DelphiR7.dproj | 0 .../php4DelphiR7.dproj.local | 0 .../php4DelphiR7.identcache | Bin php4DelphiR7.res => Source/php4DelphiR7.res | Bin php4DelphiR7.stat => Source/php4DelphiR7.stat | 0 .../php4DelphiR7_Icon.ico | Bin php4DelphiReg.pas => Source/php4DelphiReg.pas | 0 .../php4DelphiSplash.res | Bin php4DelphiWeb.pas => Source/php4DelphiWeb.pas | 0 php4delphi.cnt => Source/php4delphi.cnt | 38 +- php4delphi.dcr => Source/php4delphi.dcr | Bin php4delphi.pas => Source/php4delphi.pas | 0 phpAbout.dfm => Source/phpAbout.dfm | 0 phpAbout.pas => Source/phpAbout.pas | 0 phpApp.pas => Source/phpApp.pas | 0 phpClass.pas => Source/phpClass.pas | 0 phpModules.pas => Source/phpModules.pas | 0 phpWeb.pas => Source/phpWeb.pas | 0 .../zend_dynamic_array.pas | 0 830 files changed, 15083 insertions(+), 15081 deletions(-) delete mode 100644 Demos/Tutorial/Step.05/Project1.dpr delete mode 100644 Demos/psvPHP/sample1/Thumbs.db rename Clear.bat => Source/Clear.bat (100%) rename DelphiFunctions.pas => Source/DelphiFunctions.pas (97%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Borland Demo/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Borland Demo/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Borland Demo/Unit1.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Borland Demo/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Borland Demo/borland_demo.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Borland Demo/borland_demo.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Borland Demo/borland_demo.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Borland Demo/borland_demo.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Class demo/class_demo.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Class demo/class_demo.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Class demo/class_demo.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Class demo/dm_Class.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Class demo/dm_Class.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Class demo/dm_Class.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Class demo/dm_Class.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Class demo/test_class.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/delphi_class.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/delphi_class.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/delphi_class.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/delphi_class.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/delphi_class_module.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/delphi_class_module.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/delphi_class_module.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/delphi_class_module.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 1/readme.txt (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 2/delphi_class.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 2/delphi_class2.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 2/delphi_class2.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 2/delphi_class2.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Delphi Class 2/readme.txt (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Math/delphi_math.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Math/delphi_math.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Math/delphi_math.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Math/extmain.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Math/extmain.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Math/extmain.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Math/extmain.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Math/test_math.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Read array parameters/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Read array parameters/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Read array parameters/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Read array parameters/rarp.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Read array parameters/rarp.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Read array parameters/rarp.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Read array parameters/rarptest.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Resources/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Resources/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Resources/Unit1.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Resources/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Resources/res_ext.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Resources/res_ext.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Resources/res_ext.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/Resources/test_resource.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/array result/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/array result/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/array result/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/array result/rarray.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/array result/rarray.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/array result/rarray.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/array result/rarray.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/css/CREDITS (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/css/EXPERIMENTAL (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/css/css.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/css/css.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/php class/php_class.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/php class/php_class.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/php class/test_class.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/phpDLL/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/phpDLL/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/phpDLL/Unit1.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/phpDLL/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/phpDLL/phpDLL.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/phpDLL/phpDLL.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/phpDLL/phpDLL.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/phpDLL/testdll.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/reference/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/reference/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/reference/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/reference/php_ref.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/reference/php_ref.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/reference/php_ref.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/reference/testref.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/skeleton/CREDITS (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/skeleton/EXPERIMENTAL (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/skeleton/skeleton.bdsproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/skeleton/skeleton.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/skeleton/skeleton.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/skeleton/tests/skeleton.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Extensions/skeleton/tests/test_skeleton.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.01/Project1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.01/Project1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.01/Project1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.01/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.01/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.01/Unit1.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.01/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.02/Project1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.02/Project1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.02/Project1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.02/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.02/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.02/Unit1.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.02/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.03/Project1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.03/Project1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.03/Project1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.03/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.03/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.03/Unit1.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.03/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.04/Project1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.04/Project1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.04/Project1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.04/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.04/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.04/Unit1.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.04/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.05/Project1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.05/Project1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.05/Project1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.05/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.05/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.05/Unit1.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.05/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/Tutorial/Step.06/test_script.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/App.ico (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/Form1.cs (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/Form1.resx (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/app.config (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C#/PHP4DelphiDemo/test.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 2005/StdAfx.cpp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 2005/StdAfx.h (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 2005/cdemo.cpp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 2005/cdemo.dsp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 2005/cdemo.dsw (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 2005/cdemo.sln (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 2005/cdemo.vcproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 2005/test.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 6.0/StdAfx.cpp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 6.0/StdAfx.h (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 6.0/cdemo.cpp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 6.0/cdemo.dsp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 6.0/cdemo.dsw (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/C++ VS 6.0/test.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi .NET/php4Delphi.MainForm.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi .NET/php4Delphi.MainForm.resx (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi .NET/php4Delphi.Standard.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi .NET/php4DelphiDemo.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi .NET/php4DelphiDemo.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi/Project1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi/Project1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi/Project1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi/result.txt (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Delphi/test.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/MS Word/Doc1.doc (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/MS Word/test.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi.sln (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Visual Basic/Form1.frm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Visual Basic/MSSCCPRJ.SCC (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Visual Basic/php_VB.vbp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Visual Basic/php_VB.vbw (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Visual Basic/php_module.bas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/php4Applications/Visual Basic/test.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Components/ComponentsDemo.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Components/ComponentsDemo.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Components/ComponentsDemo.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Components/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Components/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Components/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Components/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Custom Library/DemoMain.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Custom Library/DemoMain.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Custom Library/ExtDemo.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Custom Library/ExtDemo.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Custom Library/ExtDemo.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Custom Library/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Custom Library/phpShellLibrary.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Dynamic Array/dynamic_array.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Dynamic Array/dynamic_array.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Encryption/EncDemo.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Encryption/EncDemo.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Encryption/EncDemo.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Encryption/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Encryption/std.encryption.class.inc (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Encryption/uMain.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Encryption/uMain.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Encryption/uMain.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Graph/Project1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Graph/Project1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Graph/Project1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Graph/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Graph/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Graph/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Graph/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/dmEngine.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/dmEngine.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/dmEngine.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/dmMain.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/dmMain.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/dmMain.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/phpISAPITest.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/phpisapitest.bdsproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/phpisapitest.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/ISAPI Module/phpisapitest.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/LibraryDemo.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/LibraryDemo.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/LibraryDemo.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/dm_Main.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/dm_Main.dti (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/dm_Main.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/frm_dialog.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Library demo/frm_dialog.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Logo/LogoDemo.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Logo/LogoDemo.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Logo/LogoDemo.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Logo/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Logo/egg.gif (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Logo/uMain.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Logo/uMain.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Multithread simple/MultithreadSample.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Multithread simple/MultithreadSample.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Multithread simple/MultithreadSample.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Multithread simple/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Multithread simple/frm_main.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Multithread simple/frm_main.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Multithread simple/frm_main.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/Multithread simple/php_thread.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/array demo/Project1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/array demo/Project1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/array demo/Project1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/array demo/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/array demo/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/array demo/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/array demo/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/console/phpcon.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/console/phpcon.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/console/test.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/Sample1.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/Sample1.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/Sample1.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/frm_phpDemo.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/frm_phpDemo.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/frm_phpDemo.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/internal.RES (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/internal.rc (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/php.gif (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/test.php (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/zend1.gif (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample1/zend2.gif (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample2/Sample2.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample2/Sample2.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample2/Sample2.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample2/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample2/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample2/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample2/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample3/Sample3.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample3/Sample3.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample3/Sample3.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample3/Unit1.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample3/Unit1.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample3/Unit1.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample3/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample4/WindowsXP.res (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample4/frm_PHPTest.ddp (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample4/frm_PHPTest.dfm (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample4/frm_PHPTest.pas (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample4/psvPHP_test.dpr (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample4/psvPHP_test.dproj (100%) rename {Demos Delphi 2009 (WideString support) => Source/Demos Delphi 2009 (WideString support)}/psvPHP/sample4/psvPHP_test.res (100%) rename {Demos => Source/Demos}/Bonus/JpegConverter/php_jpeg.bdsproj (100%) rename {Demos => Source/Demos}/Bonus/JpegConverter/php_jpeg.dpr (96%) rename {Demos => Source/Demos}/Bonus/JpegConverter/php_jpeg.php (95%) rename {Demos => Source/Demos}/Bonus/PHPEncoder/phpencoder.bdsproj (100%) rename {Demos => Source/Demos}/Bonus/PHPEncoder/phpencoder.dpr (96%) rename {Demos => Source/Demos}/Bonus/PHPEncoder/test.php (92%) rename {Demos => Source/Demos}/Bonus/phpRegistry/Bin/php_registry.dll (100%) rename {Demos => Source/Demos}/Bonus/phpRegistry/php_registry.dpr (96%) rename {Demos => Source/Demos}/Bonus/phpRegistry/php_registry.dproj (100%) rename {Demos => Source/Demos}/Bonus/phpRegistry/php_registry.dproj.local (100%) rename {Demos => Source/Demos}/Bonus/phpRegistry/php_registry.identcache (100%) rename {Demos => Source/Demos}/Bonus/phpRegistry/php_registry.stat (100%) rename {Demos => Source/Demos}/Bonus/wincon/Bin/php_wincon.dll (100%) rename {Demos/Bonus/wincon => Source/Demos/Bonus/wincon/Bin}/test_wincon.php (100%) rename {Demos => Source/Demos}/Bonus/wincon/php_wincon.h (96%) rename {Demos => Source/Demos}/Bonus/wincon/resource.h (96%) rename {Demos/Bonus/wincon/Bin => Source/Demos/Bonus/wincon}/test_wincon.php (97%) rename {Demos => Source/Demos}/Bonus/wincon/wincon.c (96%) rename {Demos => Source/Demos}/Bonus/wincon/wincon.dsp (97%) rename {Demos => Source/Demos}/Bonus/wincon/wincon.dsw (94%) rename {Demos => Source/Demos}/Bonus/wincon/wincon.rc (95%) rename {Demos => Source/Demos}/Bonus/wincon/wincon.sln (97%) rename {Demos => Source/Demos}/Bonus/wincon/wincon.vcproj (95%) rename {Demos => Source/Demos}/Delphi4PHP/DesignIDE/d4pide.dpr (100%) rename {Demos => Source/Demos}/Delphi4PHP/DesignIDE/readme.txt (100%) rename {Demos => Source/Demos}/Extensions/Borland Demo/Unit1.ddp (100%) rename {Demos => Source/Demos}/Extensions/Borland Demo/Unit1.dfm (96%) rename {Demos => Source/Demos}/Extensions/Borland Demo/Unit1.dti (92%) rename {Demos => Source/Demos}/Extensions/Borland Demo/Unit1.pas (96%) rename {Demos => Source/Demos}/Extensions/Borland Demo/borland_demo.dpr (94%) rename {Demos => Source/Demos}/Extensions/Borland Demo/borland_demo.dproj (100%) rename {Demos => Source/Demos}/Extensions/Borland Demo/borland_demo.dproj.local (100%) rename {Demos => Source/Demos}/Extensions/Borland Demo/borland_demo.identcache (100%) rename {Demos => Source/Demos}/Extensions/Borland Demo/borland_demo.php (92%) rename {Demos => Source/Demos}/Extensions/Borland Demo/borland_demo.res (100%) rename {Demos => Source/Demos}/Extensions/Borland Demo/borland_demo.stat (100%) rename {Demos => Source/Demos}/Extensions/Borland Demo/borland_demo_Icon.ico (100%) rename {Demos => Source/Demos}/Extensions/Class demo/class_demo.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/Class demo/class_demo.dpr (94%) rename {Demos => Source/Demos}/Extensions/Class demo/class_demo.res (100%) rename {Demos => Source/Demos}/Extensions/Class demo/dm_Class.ddp (100%) rename {Demos => Source/Demos}/Extensions/Class demo/dm_Class.dfm (95%) rename {Demos => Source/Demos}/Extensions/Class demo/dm_Class.dti (92%) rename {Demos => Source/Demos}/Extensions/Class demo/dm_Class.pas (96%) rename {Demos => Source/Demos}/Extensions/Class demo/test_class.php (91%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/delphi_class.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/delphi_class.dpr (95%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/delphi_class.php (93%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/delphi_class.res (100%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/delphi_class_module.ddp (100%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/delphi_class_module.dfm (95%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/delphi_class_module.dti (92%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/delphi_class_module.pas (96%) rename {Demos => Source/Demos}/Extensions/Delphi Class 1/readme.txt (100%) rename {Demos => Source/Demos}/Extensions/Delphi Class 2/delphi_class.php (94%) rename {Demos => Source/Demos}/Extensions/Delphi Class 2/delphi_class2.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/Delphi Class 2/delphi_class2.dpr (96%) rename {Demos => Source/Demos}/Extensions/Delphi Class 2/delphi_class2.php (93%) rename {Demos => Source/Demos}/Extensions/Delphi Class 2/readme.txt (100%) rename {Demos => Source/Demos}/Extensions/Math/delphi_math.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/Math/delphi_math.dpr (94%) rename {Demos => Source/Demos}/Extensions/Math/delphi_math.res (100%) rename {Demos => Source/Demos}/Extensions/Math/extmain.ddp (100%) rename {Demos => Source/Demos}/Extensions/Math/extmain.dfm (95%) rename {Demos => Source/Demos}/Extensions/Math/extmain.dti (92%) rename {Demos => Source/Demos}/Extensions/Math/extmain.pas (96%) rename {Demos => Source/Demos}/Extensions/Math/test_math.php (94%) rename {Demos => Source/Demos}/Extensions/Read array parameters/Unit1.ddp (100%) rename {Demos => Source/Demos}/Extensions/Read array parameters/Unit1.dfm (100%) rename {Demos => Source/Demos}/Extensions/Read array parameters/Unit1.pas (100%) rename {Demos => Source/Demos}/Extensions/Read array parameters/rarp.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/Read array parameters/rarp.dpr (100%) rename {Demos => Source/Demos}/Extensions/Read array parameters/rarp.res (100%) rename {Demos => Source/Demos}/Extensions/Read array parameters/rarptest.php (100%) rename {Demos => Source/Demos}/Extensions/Resources/Unit1.ddp (100%) rename {Demos => Source/Demos}/Extensions/Resources/Unit1.dfm (95%) rename {Demos/Extensions/phpDLL => Source/Demos/Extensions/Resources}/Unit1.dti (91%) rename {Demos => Source/Demos}/Extensions/Resources/Unit1.pas (96%) rename {Demos => Source/Demos}/Extensions/Resources/res_ext.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/Resources/res_ext.dpr (94%) rename {Demos => Source/Demos}/Extensions/Resources/res_ext.res (100%) rename {Demos => Source/Demos}/Extensions/Resources/test_resource.php (92%) rename {Demos => Source/Demos}/Extensions/array result/Unit1.ddp (100%) rename {Demos => Source/Demos}/Extensions/array result/Unit1.dfm (95%) rename {Demos => Source/Demos}/Extensions/array result/Unit1.pas (96%) rename {Demos => Source/Demos}/Extensions/array result/rarray.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/array result/rarray.dpr (94%) rename {Demos => Source/Demos}/Extensions/array result/rarray.dproj (100%) rename {Demos => Source/Demos}/Extensions/array result/rarray.dproj.local (100%) rename {Demos => Source/Demos}/Extensions/array result/rarray.identcache (100%) rename {Demos => Source/Demos}/Extensions/array result/rarray.php (93%) rename {Demos => Source/Demos}/Extensions/array result/rarray.res (100%) rename {Demos => Source/Demos}/Extensions/array result/rarray.stat (100%) rename {Demos => Source/Demos}/Extensions/array result/rarray_Icon.ico (100%) rename {Demos => Source/Demos}/Extensions/css/CREDITS (100%) rename {Demos => Source/Demos}/Extensions/css/EXPERIMENTAL (100%) rename {Demos => Source/Demos}/Extensions/css/css.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/css/css.dpr (97%) rename {Demos => Source/Demos}/Extensions/css/css.dproj (100%) rename {Demos => Source/Demos}/Extensions/css/css.dproj.local (100%) rename {Demos => Source/Demos}/Extensions/css/css.identcache (100%) rename {Demos => Source/Demos}/Extensions/css/css.res (100%) rename {Demos => Source/Demos}/Extensions/css/css.stat (100%) rename {Demos => Source/Demos}/Extensions/killer/CREDITS (100%) rename {Demos => Source/Demos}/Extensions/killer/ProcessViewer.pas (96%) rename {Demos => Source/Demos}/Extensions/killer/Unit1.dfm (95%) rename {Demos => Source/Demos}/Extensions/killer/Unit1.dti (91%) rename {Demos => Source/Demos}/Extensions/killer/Unit1.pas (95%) rename {Demos => Source/Demos}/Extensions/killer/killer.dpr (94%) rename {Demos => Source/Demos}/Extensions/killer/killer.res (100%) rename {Demos => Source/Demos}/Extensions/killer/tests/test_killer.php (94%) rename {Demos => Source/Demos}/Extensions/php class/php_class.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/php class/php_class.dpr (96%) rename {Demos => Source/Demos}/Extensions/php class/test_class.php (91%) rename {Demos => Source/Demos}/Extensions/phpDLL/Unit1.ddp (100%) rename {Demos => Source/Demos}/Extensions/phpDLL/Unit1.dfm (95%) rename {Demos/Extensions/Resources => Source/Demos/Extensions/phpDLL}/Unit1.dti (91%) rename {Demos => Source/Demos}/Extensions/phpDLL/Unit1.pas (95%) rename {Demos => Source/Demos}/Extensions/phpDLL/phpDLL.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/phpDLL/phpDLL.dpr (94%) rename {Demos => Source/Demos}/Extensions/phpDLL/phpDLL.res (100%) rename {Demos => Source/Demos}/Extensions/phpDLL/testdll.php (95%) rename {Demos => Source/Demos}/Extensions/reference/Unit1.ddp (100%) rename {Demos => Source/Demos}/Extensions/reference/Unit1.dfm (95%) rename {Demos => Source/Demos}/Extensions/reference/Unit1.pas (95%) rename {Demos => Source/Demos}/Extensions/reference/php_ref.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/reference/php_ref.dpr (94%) rename {Demos => Source/Demos}/Extensions/reference/php_ref.res (100%) rename {Demos => Source/Demos}/Extensions/reference/testref.php (94%) rename {Demos => Source/Demos}/Extensions/skeleton/CREDITS (100%) rename {Demos => Source/Demos}/Extensions/skeleton/EXPERIMENTAL (100%) rename {Demos => Source/Demos}/Extensions/skeleton/skeleton.bdsproj (100%) rename {Demos => Source/Demos}/Extensions/skeleton/skeleton.dpr (96%) rename {Demos => Source/Demos}/Extensions/skeleton/skeleton.dproj (100%) rename {Demos => Source/Demos}/Extensions/skeleton/tests/skeleton.php (95%) rename {Demos => Source/Demos}/Extensions/skeleton/tests/test_skeleton.php (94%) rename {Demos/Tutorial/Step.02 => Source/Demos/Tutorial/Step.01}/Project1.dpr (94%) rename {Demos => Source/Demos}/Tutorial/Step.01/Project1.res (100%) rename {Demos => Source/Demos}/Tutorial/Step.01/Unit1.ddp (100%) rename {Demos => Source/Demos}/Tutorial/Step.01/Unit1.dfm (94%) rename {Demos => Source/Demos}/Tutorial/Step.01/Unit1.dti (91%) rename {Demos => Source/Demos}/Tutorial/Step.01/Unit1.pas (95%) rename {Demos/Tutorial/Step.03 => Source/Demos/Tutorial/Step.02}/Project1.dpr (94%) rename {Demos => Source/Demos}/Tutorial/Step.02/Project1.res (100%) rename {Demos => Source/Demos}/Tutorial/Step.02/Unit1.ddp (100%) rename {Demos => Source/Demos}/Tutorial/Step.02/Unit1.dfm (94%) rename {Demos => Source/Demos}/Tutorial/Step.02/Unit1.dti (91%) rename {Demos/Tutorial/Step.04 => Source/Demos/Tutorial/Step.02}/Unit1.pas (95%) rename {Demos/Tutorial/Step.04 => Source/Demos/Tutorial/Step.03}/Project1.dpr (94%) rename {Demos => Source/Demos}/Tutorial/Step.03/Project1.res (100%) rename {Demos => Source/Demos}/Tutorial/Step.03/Unit1.ddp (100%) rename {Demos => Source/Demos}/Tutorial/Step.03/Unit1.dfm (94%) rename {Demos => Source/Demos}/Tutorial/Step.03/Unit1.dti (92%) rename {Demos => Source/Demos}/Tutorial/Step.03/Unit1.pas (95%) rename {Demos/Tutorial/Step.01 => Source/Demos/Tutorial/Step.04}/Project1.dpr (94%) rename {Demos => Source/Demos}/Tutorial/Step.04/Project1.res (100%) rename {Demos => Source/Demos}/Tutorial/Step.04/Unit1.ddp (100%) rename {Demos => Source/Demos}/Tutorial/Step.04/Unit1.dfm (94%) rename {Demos/Tutorial/Step.05 => Source/Demos/Tutorial/Step.04}/Unit1.dti (92%) rename {Demos/Tutorial/Step.02 => Source/Demos/Tutorial/Step.04}/Unit1.pas (95%) create mode 100644 Source/Demos/Tutorial/Step.05/Project1.dpr rename {Demos => Source/Demos}/Tutorial/Step.05/Project1.dproj (100%) rename {Demos => Source/Demos}/Tutorial/Step.05/Project1.res (100%) rename {Demos => Source/Demos}/Tutorial/Step.05/Unit1.ddp (100%) rename {Demos => Source/Demos}/Tutorial/Step.05/Unit1.dfm (95%) rename {Demos/Tutorial/Step.04 => Source/Demos/Tutorial/Step.05}/Unit1.dti (92%) rename {Demos => Source/Demos}/Tutorial/Step.05/Unit1.pas (95%) rename {Demos => Source/Demos}/Tutorial/Step.06/test_script.php (94%) rename {Demos => Source/Demos}/php4Applications/C#/PHP4DelphiDemo/App.ico (100%) rename {Demos => Source/Demos}/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs (97%) rename {Demos => Source/Demos}/php4Applications/C#/PHP4DelphiDemo/Form1.cs (97%) rename {Demos => Source/Demos}/php4Applications/C#/PHP4DelphiDemo/Form1.resx (97%) rename {Demos => Source/Demos}/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj (97%) rename {Demos => Source/Demos}/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user (97%) rename {Demos => Source/Demos}/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln (97%) rename {Demos => Source/Demos}/php4Applications/C#/PHP4DelphiDemo/app.config (95%) rename {Demos/php4Applications/MS Word => Source/Demos/php4Applications/C#/PHP4DelphiDemo}/test.php (89%) rename {Demos => Source/Demos}/php4Applications/C++ VS 2005/StdAfx.cpp (97%) rename {Demos => Source/Demos}/php4Applications/C++ VS 2005/StdAfx.h (96%) rename {Demos => Source/Demos}/php4Applications/C++ VS 2005/cdemo.cpp (97%) rename {Demos/php4Applications/C++ VS 6.0 => Source/Demos/php4Applications/C++ VS 2005}/cdemo.dsp (97%) rename {Demos/php4Applications/C++ VS 6.0 => Source/Demos/php4Applications/C++ VS 2005}/cdemo.dsw (94%) rename {Demos => Source/Demos}/php4Applications/C++ VS 2005/cdemo.sln (97%) rename {Demos => Source/Demos}/php4Applications/C++ VS 2005/cdemo.vcproj (95%) rename {Demos/php4Applications/Delphi => Source/Demos/php4Applications/C++ VS 2005}/test.php (90%) rename {Demos => Source/Demos}/php4Applications/C++ VS 6.0/StdAfx.cpp (97%) rename {Demos => Source/Demos}/php4Applications/C++ VS 6.0/StdAfx.h (96%) rename {Demos => Source/Demos}/php4Applications/C++ VS 6.0/cdemo.cpp (97%) rename {Demos/php4Applications/C++ VS 2005 => Source/Demos/php4Applications/C++ VS 6.0}/cdemo.dsp (97%) rename {Demos/php4Applications/C++ VS 2005 => Source/Demos/php4Applications/C++ VS 6.0}/cdemo.dsw (94%) rename {Demos/php4Applications/C++ VS 2005 => Source/Demos/php4Applications/C++ VS 6.0}/test.php (90%) rename {Demos => Source/Demos}/php4Applications/Delphi .NET/php4Delphi.MainForm.pas (96%) rename {Demos => Source/Demos}/php4Applications/Delphi .NET/php4Delphi.MainForm.resx (98%) rename {Demos => Source/Demos}/php4Applications/Delphi .NET/php4Delphi.Standard.pas (97%) rename {Demos => Source/Demos}/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources (100%) rename {Demos => Source/Demos}/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj (97%) rename {Demos => Source/Demos}/php4Applications/Delphi .NET/php4DelphiDemo.dpr (97%) rename {Demos => Source/Demos}/php4Applications/Delphi .NET/php4DelphiDemo.res (100%) rename {Demos => Source/Demos}/php4Applications/Delphi/Project1.bdsproj (100%) rename {Demos => Source/Demos}/php4Applications/Delphi/Project1.dpr (93%) rename {Demos => Source/Demos}/php4Applications/Delphi/Project1.res (100%) rename {Demos => Source/Demos}/php4Applications/Delphi/Unit1.ddp (100%) rename {Demos => Source/Demos}/php4Applications/Delphi/Unit1.dfm (95%) rename {Demos => Source/Demos}/php4Applications/Delphi/Unit1.pas (96%) rename {Demos => Source/Demos}/php4Applications/Delphi/result.txt (100%) rename {Demos/php4Applications/C++ VS 6.0 => Source/Demos/php4Applications/Delphi}/test.php (90%) rename {Demos => Source/Demos}/php4Applications/MS Word/Doc1.doc (100%) rename {Demos/php4Applications/C#/PHP4DelphiDemo => Source/Demos/php4Applications/MS Word}/test.php (89%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi.sln (97%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb (97%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb (97%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx (97%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb (98%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb (97%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp (98%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj (97%) rename {Demos => Source/Demos}/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user (97%) rename {Demos => Source/Demos}/php4Applications/Visual Basic/Form1.frm (96%) rename {Demos => Source/Demos}/php4Applications/Visual Basic/MSSCCPRJ.SCC (97%) rename {Demos => Source/Demos}/php4Applications/Visual Basic/php_VB.vbp (95%) rename {Demos => Source/Demos}/php4Applications/Visual Basic/php_VB.vbw (97%) rename {Demos => Source/Demos}/php4Applications/Visual Basic/php_module.bas (98%) rename {Demos => Source/Demos}/php4Applications/Visual Basic/test.php (89%) rename {Demos => Source/Demos}/psvPHP/Components/ComponentsDemo.bdsproj (100%) rename {Demos => Source/Demos}/psvPHP/Components/ComponentsDemo.dpr (94%) rename {Demos => Source/Demos}/psvPHP/Components/ComponentsDemo.res (100%) rename {Demos => Source/Demos}/psvPHP/Components/Unit1.ddp (100%) rename {Demos => Source/Demos}/psvPHP/Components/Unit1.dfm (95%) rename {Demos => Source/Demos}/psvPHP/Components/Unit1.pas (96%) rename {Demos => Source/Demos}/psvPHP/Components/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/Custom Library/DemoMain.dfm (100%) rename {Demos => Source/Demos}/psvPHP/Custom Library/DemoMain.pas (100%) rename {Demos => Source/Demos}/psvPHP/Custom Library/ExtDemo.bdsproj (100%) rename {Demos => Source/Demos}/psvPHP/Custom Library/ExtDemo.dpr (100%) rename {Demos => Source/Demos}/psvPHP/Custom Library/ExtDemo.res (100%) rename {Demos => Source/Demos}/psvPHP/Custom Library/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/Custom Library/phpShellLibrary.pas (96%) rename {Demos => Source/Demos}/psvPHP/Dynamic Array/dynamic_array.dpr (95%) rename {Demos => Source/Demos}/psvPHP/Encryption/EncDemo.dpr (94%) rename {Demos => Source/Demos}/psvPHP/Encryption/EncDemo.res (100%) rename {Demos => Source/Demos}/psvPHP/Encryption/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/Encryption/std.encryption.class.inc (97%) rename {Demos => Source/Demos}/psvPHP/Encryption/uMain.ddp (100%) rename {Demos => Source/Demos}/psvPHP/Encryption/uMain.dfm (94%) rename {Demos => Source/Demos}/psvPHP/Encryption/uMain.pas (96%) rename {Demos => Source/Demos}/psvPHP/Graph/Project1.dpr (93%) rename {Demos => Source/Demos}/psvPHP/Graph/Project1.res (100%) rename {Demos => Source/Demos}/psvPHP/Graph/Unit1.ddp (100%) rename {Demos => Source/Demos}/psvPHP/Graph/Unit1.dfm (95%) rename {Demos => Source/Demos}/psvPHP/Graph/Unit1.pas (96%) rename {Demos => Source/Demos}/psvPHP/Graph/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/dmEngine.ddp (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/dmEngine.dfm (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/dmEngine.pas (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/dmMain.ddp (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/dmMain.dfm (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/dmMain.pas (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/phpisapitest.bdsproj (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/phpisapitest.dpr (100%) rename {Demos => Source/Demos}/psvPHP/ISAPI Module/phpisapitest.res (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/LibraryDemo.dpr (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/LibraryDemo.res (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/Project1.dpr (93%) rename {Demos => Source/Demos}/psvPHP/Library demo/Project1.res (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/Unit1.ddp (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/Unit1.dfm (95%) rename {Demos => Source/Demos}/psvPHP/Library demo/Unit1.pas (96%) rename {Demos => Source/Demos}/psvPHP/Library demo/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/dm_Main.dfm (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/dm_Main.dti (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/dm_Main.pas (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/frm_dialog.dfm (100%) rename {Demos => Source/Demos}/psvPHP/Library demo/frm_dialog.pas (100%) rename {Demos => Source/Demos}/psvPHP/Logo/LogoDemo.dpr (93%) rename {Demos => Source/Demos}/psvPHP/Logo/LogoDemo.res (100%) rename {Demos => Source/Demos}/psvPHP/Logo/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/Logo/egg.gif (100%) rename {Demos => Source/Demos}/psvPHP/Logo/uMain.dfm (95%) rename {Demos => Source/Demos}/psvPHP/Logo/uMain.pas (94%) rename {Demos => Source/Demos}/psvPHP/Multithread simple/MultithreadSample.dpr (100%) rename {Demos => Source/Demos}/psvPHP/Multithread simple/MultithreadSample.res (100%) rename {Demos => Source/Demos}/psvPHP/Multithread simple/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/Multithread simple/frm_main.ddp (100%) rename {Demos => Source/Demos}/psvPHP/Multithread simple/frm_main.dfm (100%) rename {Demos => Source/Demos}/psvPHP/Multithread simple/frm_main.pas (100%) rename {Demos => Source/Demos}/psvPHP/Multithread simple/php_thread.pas (100%) rename {Demos => Source/Demos}/psvPHP/Thread Management/ManageThreads.dpr (100%) rename {Demos => Source/Demos}/psvPHP/Thread Management/ManageThreads.res (100%) rename {Demos => Source/Demos}/psvPHP/Thread Management/frm_main.dfm (100%) rename {Demos => Source/Demos}/psvPHP/Thread Management/frm_main.pas (100%) rename {Demos => Source/Demos}/psvPHP/Thread Management/php_thread.pas (100%) rename {Demos => Source/Demos}/psvPHP/Threads Library/ManageThreads.dpr (100%) rename {Demos => Source/Demos}/psvPHP/Threads Library/ManageThreads.res (100%) rename {Demos => Source/Demos}/psvPHP/Threads Library/frm_main.ddp (100%) rename {Demos => Source/Demos}/psvPHP/Threads Library/frm_main.dfm (100%) rename {Demos => Source/Demos}/psvPHP/Threads Library/frm_main.pas (100%) rename {Demos => Source/Demos}/psvPHP/Threads Library/php_thread.pas (100%) rename {Demos => Source/Demos}/psvPHP/array demo/Project1.bdsproj (100%) rename {Demos => Source/Demos}/psvPHP/array demo/Project1.dpr (93%) rename {Demos => Source/Demos}/psvPHP/array demo/Project1.res (100%) rename {Demos => Source/Demos}/psvPHP/array demo/Unit1.ddp (100%) rename {Demos => Source/Demos}/psvPHP/array demo/Unit1.dfm (95%) rename {Demos => Source/Demos}/psvPHP/array demo/Unit1.pas (96%) rename {Demos => Source/Demos}/psvPHP/array demo/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/console/phpcon.dpr (96%) rename {Demos/psvPHP/sample1 => Source/Demos/psvPHP/console}/test.php (85%) rename {Demos => Source/Demos}/psvPHP/sample1/Project1.dpr (93%) rename {Demos => Source/Demos}/psvPHP/sample1/Project1.res (100%) rename {Demos => Source/Demos}/psvPHP/sample1/Sample1.bdsproj (100%) rename {Demos => Source/Demos}/psvPHP/sample1/Sample1.dpr (100%) rename {Demos => Source/Demos}/psvPHP/sample1/Sample1.dproj (100%) rename {Demos => Source/Demos}/psvPHP/sample1/Sample1.res (100%) create mode 100644 Source/Demos/psvPHP/sample1/Thumbs.db rename {Demos => Source/Demos}/psvPHP/sample1/Unit1.ddp (100%) rename {Demos => Source/Demos}/psvPHP/sample1/Unit1.dfm (96%) rename {Demos => Source/Demos}/psvPHP/sample1/Unit1.pas (96%) rename {Demos => Source/Demos}/psvPHP/sample1/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/sample1/frm_phpDemo.ddp (100%) rename {Demos => Source/Demos}/psvPHP/sample1/frm_phpDemo.dfm (100%) rename {Demos => Source/Demos}/psvPHP/sample1/frm_phpDemo.pas (100%) rename {Demos => Source/Demos}/psvPHP/sample1/internal.RES (100%) rename {Demos => Source/Demos}/psvPHP/sample1/internal.rc (96%) rename {Demos => Source/Demos}/psvPHP/sample1/php.gif (100%) rename {Demos/psvPHP/console => Source/Demos/psvPHP/sample1}/test.php (85%) rename {Demos => Source/Demos}/psvPHP/sample1/zend1.gif (100%) rename {Demos => Source/Demos}/psvPHP/sample1/zend2.gif (100%) rename {Demos => Source/Demos}/psvPHP/sample2/Project1.dpr (93%) rename {Demos => Source/Demos}/psvPHP/sample2/Project1.res (100%) rename {Demos => Source/Demos}/psvPHP/sample2/Sample2.bdsproj (100%) rename {Demos => Source/Demos}/psvPHP/sample2/Sample2.dpr (100%) rename {Demos => Source/Demos}/psvPHP/sample2/Sample2.res (100%) rename {Demos => Source/Demos}/psvPHP/sample2/Unit1.ddp (100%) rename {Demos => Source/Demos}/psvPHP/sample2/Unit1.dfm (94%) rename {Demos => Source/Demos}/psvPHP/sample2/Unit1.pas (96%) rename {Demos => Source/Demos}/psvPHP/sample3/Project1.dpr (93%) rename {Demos => Source/Demos}/psvPHP/sample3/Project1.res (100%) rename {Demos => Source/Demos}/psvPHP/sample3/Sample3.dpr (100%) rename {Demos => Source/Demos}/psvPHP/sample3/Sample3.res (100%) rename {Demos => Source/Demos}/psvPHP/sample3/Unit1.ddp (100%) rename {Demos => Source/Demos}/psvPHP/sample3/Unit1.dfm (95%) rename {Demos => Source/Demos}/psvPHP/sample3/Unit1.pas (95%) rename {Demos => Source/Demos}/psvPHP/sample3/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/sample4/WindowsXP.res (100%) rename {Demos => Source/Demos}/psvPHP/sample4/frm_PHPTest.ddp (100%) rename {Demos => Source/Demos}/psvPHP/sample4/frm_PHPTest.dfm (94%) rename {Demos => Source/Demos}/psvPHP/sample4/frm_PHPTest.pas (95%) rename {Demos => Source/Demos}/psvPHP/sample4/psvPHP_test.dpr (94%) rename {Demos => Source/Demos}/psvPHP/sample4/psvPHP_test.res (100%) rename {ExtensionBuilder => Source/ExtensionBuilder}/Builder.Inc (96%) rename {ExtensionBuilder => Source/ExtensionBuilder}/PHPEXT.RES (100%) rename {ExtensionBuilder => Source/ExtensionBuilder}/frm_Functions.dfm (95%) rename {ExtensionBuilder => Source/ExtensionBuilder}/frm_Functions.pas (93%) rename {ExtensionBuilder => Source/ExtensionBuilder}/phpExtBuilderD5.dpk (94%) rename {ExtensionBuilder => Source/ExtensionBuilder}/phpExtBuilderD5.res (100%) rename {ExtensionBuilder => Source/ExtensionBuilder}/phpExtBuilderD6.dpk (94%) rename {ExtensionBuilder => Source/ExtensionBuilder}/phpExtBuilderD6.res (100%) rename {ExtensionBuilder => Source/ExtensionBuilder}/phpExtBuilderD7.dpk (94%) rename {ExtensionBuilder => Source/ExtensionBuilder}/phpExtBuilderD7.res (100%) rename {ExtensionBuilder => Source/ExtensionBuilder}/phpExtensionBuilder.pas (96%) rename PHP.INC => Source/PHP.INC (96%) rename PHP4DelphiD2006.bdsproj => Source/PHP4DelphiD2006.bdsproj (100%) rename PHP4DelphiD2006.dpk => Source/PHP4DelphiD2006.dpk (95%) rename PHP4DelphiD2006.dproj => Source/PHP4DelphiD2006.dproj (100%) rename PHP4DelphiD2006.dproj.local => Source/PHP4DelphiD2006.dproj.local (100%) rename PHP4DelphiD2006.res => Source/PHP4DelphiD2006.res (100%) rename PHP4DelphiD2006.stat => Source/PHP4DelphiD2006.stat (100%) rename PHP4DelphiD2006_Icon.ico => Source/PHP4DelphiD2006_Icon.ico (100%) rename PHPAPI.pas => Source/PHPAPI.pas (99%) rename PHPCommon.pas => Source/PHPCommon.pas (100%) rename PHPFunctions.pas => Source/PHPFunctions.pas (100%) rename PHPLibrary.pas => Source/PHPLibrary.pas (100%) rename PHPProjectWizard.pas => Source/PHPProjectWizard.pas (100%) rename PHPProjectWizard.res => Source/PHPProjectWizard.res (100%) rename PHPTypes.pas => Source/PHPTypes.pas (100%) rename Php4DelphiGroup5.bpg => Source/Php4DelphiGroup5.bpg (97%) rename Php4DelphiGroup7.bpg => Source/Php4DelphiGroup7.bpg (97%) rename ZENDAPI.pas => Source/ZENDAPI.pas (99%) rename ZendTypes.pas => Source/ZendTypes.pas (99%) rename logos.pas => Source/logos.pas (100%) rename {packages => Source/packages}/php4delphi Delphi 10 Seattle.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi 10 Seattle.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi 10.1 Berlin.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi 10.1 Berlin.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi 10.2 Tokyo.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi 10.2 Tokyo.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi 2010.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi 2010.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi 2011.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi 2011.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE1.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi XE1.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE2.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi XE2.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE3.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi XE3.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE4.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi XE4.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE5.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi XE5.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE6.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi XE6.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE7.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi XE7.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE8.groupproj (100%) rename {packages => Source/packages}/php4delphi Delphi XE8.groupproj.local (100%) rename {packages => Source/packages}/php4delphi Delphi XE8_prjgroup.tvsconfig (100%) rename php4App.dll => Source/php4App.dll (100%) rename php4App.dpr => Source/php4App.dpr (100%) rename php4App.dproj => Source/php4App.dproj (100%) rename php4App.dproj.local => Source/php4App.dproj.local (100%) rename php4App.identcache => Source/php4App.identcache (100%) rename php4App.res => Source/php4App.res (100%) rename php4App.stat => Source/php4App.stat (100%) rename php4AppIntf.pas => Source/php4AppIntf.pas (100%) rename php4AppUnit.pas => Source/php4AppUnit.pas (100%) rename php4App_Icon.ico => Source/php4App_Icon.ico (100%) rename {php4Applications => Source/php4Applications}/PHP 4.4.6/php4App.dll (100%) rename {php4Applications => Source/php4Applications}/PHP 5.2.11/php4App.dll (100%) rename {php4Applications => Source/php4Applications}/PHP 5.3.0/php4App.dll (100%) rename {php4Applications => Source/php4Applications}/PHP4/php4App.dll (100%) rename {php4Applications => Source/php4Applications}/PHP511/php4App.dll (100%) rename {php4Applications => Source/php4Applications}/PHP512/php4App.dll (100%) rename php4Delphi2005.bdsgroup => Source/php4Delphi2005.bdsgroup (97%) rename php4Delphi2006.bdsgroup => Source/php4Delphi2006.bdsgroup (97%) rename php4DelphiD2005.bdsproj => Source/php4DelphiD2005.bdsproj (97%) rename php4DelphiD2005.dpk => Source/php4DelphiD2005.dpk (95%) rename php4DelphiD2005.dproj => Source/php4DelphiD2005.dproj (100%) rename php4DelphiD2005.dproj.local => Source/php4DelphiD2005.dproj.local (100%) rename php4DelphiD2005.res => Source/php4DelphiD2005.res (100%) rename php4DelphiD2005.stat => Source/php4DelphiD2005.stat (100%) rename php4DelphiD2005_Icon.ico => Source/php4DelphiD2005_Icon.ico (100%) rename php4DelphiD2007.dpk => Source/php4DelphiD2007.dpk (100%) rename php4DelphiD2007.dproj => Source/php4DelphiD2007.dproj (100%) rename php4DelphiD2007.dproj.local => Source/php4DelphiD2007.dproj.local (100%) rename php4DelphiD2007.res => Source/php4DelphiD2007.res (100%) rename php4DelphiD2007.stat => Source/php4DelphiD2007.stat (100%) rename php4DelphiD2007_Icon.ico => Source/php4DelphiD2007_Icon.ico (100%) rename php4DelphiD2009.dpk => Source/php4DelphiD2009.dpk (100%) rename php4DelphiD2009.dproj => Source/php4DelphiD2009.dproj (100%) rename php4DelphiD2009.dproj.local => Source/php4DelphiD2009.dproj.local (100%) rename php4DelphiD2009.res => Source/php4DelphiD2009.res (100%) rename php4DelphiD2009.stat => Source/php4DelphiD2009.stat (100%) rename php4DelphiD2009_Icon.ico => Source/php4DelphiD2009_Icon.ico (100%) rename php4DelphiD2010.dpk => Source/php4DelphiD2010.dpk (100%) rename php4DelphiD2010.dproj => Source/php4DelphiD2010.dproj (100%) rename php4DelphiD2010.dproj.local => Source/php4DelphiD2010.dproj.local (100%) rename php4DelphiD2010.identcache => Source/php4DelphiD2010.identcache (100%) rename php4DelphiD2010.res => Source/php4DelphiD2010.res (100%) rename php4DelphiD2010.stat => Source/php4DelphiD2010.stat (90%) rename php4DelphiD2010_Icon.ico => Source/php4DelphiD2010_Icon.ico (100%) rename php4DelphiD5.dpk => Source/php4DelphiD5.dpk (95%) rename php4DelphiD5.dproj => Source/php4DelphiD5.dproj (100%) rename php4DelphiD5.dproj.local => Source/php4DelphiD5.dproj.local (100%) rename php4DelphiD5.res => Source/php4DelphiD5.res (100%) rename php4DelphiD5.stat => Source/php4DelphiD5.stat (100%) rename php4DelphiD5_Icon.ico => Source/php4DelphiD5_Icon.ico (100%) rename php4DelphiD6.dpk => Source/php4DelphiD6.dpk (95%) rename php4DelphiD6.dproj => Source/php4DelphiD6.dproj (100%) rename php4DelphiD6.dproj.local => Source/php4DelphiD6.dproj.local (100%) rename php4DelphiD6.res => Source/php4DelphiD6.res (100%) rename php4DelphiD6.stat => Source/php4DelphiD6.stat (100%) rename php4DelphiD6_Icon.ico => Source/php4DelphiD6_Icon.ico (100%) rename php4DelphiD7.dpk => Source/php4DelphiD7.dpk (95%) rename php4DelphiD7.dproj => Source/php4DelphiD7.dproj (100%) rename php4DelphiD7.dproj.local => Source/php4DelphiD7.dproj.local (100%) rename php4DelphiD7.res => Source/php4DelphiD7.res (100%) rename php4DelphiD7.stat => Source/php4DelphiD7.stat (100%) rename php4DelphiD7_Icon.ico => Source/php4DelphiD7_Icon.ico (100%) rename php4DelphiR2005.bdsproj => Source/php4DelphiR2005.bdsproj (97%) rename php4DelphiR2005.dpk => Source/php4DelphiR2005.dpk (95%) rename php4DelphiR2005.dproj => Source/php4DelphiR2005.dproj (100%) rename php4DelphiR2005.dproj.local => Source/php4DelphiR2005.dproj.local (100%) rename php4DelphiR2005.res => Source/php4DelphiR2005.res (100%) rename php4DelphiR2005.stat => Source/php4DelphiR2005.stat (100%) rename php4DelphiR2005_Icon.ico => Source/php4DelphiR2005_Icon.ico (100%) rename php4DelphiR2006.bdsproj => Source/php4DelphiR2006.bdsproj (100%) rename php4DelphiR2006.dpk => Source/php4DelphiR2006.dpk (95%) rename php4DelphiR2006.dproj => Source/php4DelphiR2006.dproj (100%) rename php4DelphiR2006.dproj.local => Source/php4DelphiR2006.dproj.local (100%) rename php4DelphiR2006.res => Source/php4DelphiR2006.res (100%) rename php4DelphiR2006.stat => Source/php4DelphiR2006.stat (100%) rename php4DelphiR2006_Icon.ico => Source/php4DelphiR2006_Icon.ico (100%) rename php4DelphiR2007.bpl => Source/php4DelphiR2007.bpl (100%) rename php4DelphiR2007.dpk => Source/php4DelphiR2007.dpk (100%) rename php4DelphiR2007.dproj => Source/php4DelphiR2007.dproj (100%) rename php4DelphiR2007.dproj.local => Source/php4DelphiR2007.dproj.local (100%) rename php4DelphiR2007.res => Source/php4DelphiR2007.res (100%) rename php4DelphiR2007.stat => Source/php4DelphiR2007.stat (100%) rename php4DelphiR2007_Icon.ico => Source/php4DelphiR2007_Icon.ico (100%) rename php4DelphiR2009.dpk => Source/php4DelphiR2009.dpk (100%) rename php4DelphiR2009.dproj => Source/php4DelphiR2009.dproj (100%) rename php4DelphiR2009.dproj.local => Source/php4DelphiR2009.dproj.local (100%) rename php4DelphiR2009.res => Source/php4DelphiR2009.res (100%) rename php4DelphiR2009.stat => Source/php4DelphiR2009.stat (100%) rename php4DelphiR2009_Icon.ico => Source/php4DelphiR2009_Icon.ico (100%) rename php4DelphiR2010.dpk => Source/php4DelphiR2010.dpk (100%) rename php4DelphiR2010.dproj => Source/php4DelphiR2010.dproj (100%) rename php4DelphiR2010.dproj.local => Source/php4DelphiR2010.dproj.local (100%) rename php4DelphiR2010.identcache => Source/php4DelphiR2010.identcache (100%) rename php4DelphiR2010.stat => Source/php4DelphiR2010.stat (100%) rename php4DelphiR2010_Icon.ico => Source/php4DelphiR2010_Icon.ico (100%) rename php4DelphiR5.dpk => Source/php4DelphiR5.dpk (96%) rename php4DelphiR5.dproj => Source/php4DelphiR5.dproj (100%) rename php4DelphiR5.dproj.local => Source/php4DelphiR5.dproj.local (100%) rename php4DelphiR5.identcache => Source/php4DelphiR5.identcache (100%) rename php4DelphiR5.res => Source/php4DelphiR5.res (100%) rename php4DelphiR5.stat => Source/php4DelphiR5.stat (100%) rename php4DelphiR5_Icon.ico => Source/php4DelphiR5_Icon.ico (100%) rename php4DelphiR6.dpk => Source/php4DelphiR6.dpk (95%) rename php4DelphiR6.dproj => Source/php4DelphiR6.dproj (100%) rename php4DelphiR6.dproj.local => Source/php4DelphiR6.dproj.local (100%) rename php4DelphiR6.res => Source/php4DelphiR6.res (100%) rename php4DelphiR6.stat => Source/php4DelphiR6.stat (100%) rename php4DelphiR6_Icon.ico => Source/php4DelphiR6_Icon.ico (100%) rename php4DelphiR7.dpk => Source/php4DelphiR7.dpk (95%) rename php4DelphiR7.dproj => Source/php4DelphiR7.dproj (100%) rename php4DelphiR7.dproj.local => Source/php4DelphiR7.dproj.local (100%) rename php4DelphiR7.identcache => Source/php4DelphiR7.identcache (100%) rename php4DelphiR7.res => Source/php4DelphiR7.res (100%) rename php4DelphiR7.stat => Source/php4DelphiR7.stat (100%) rename php4DelphiR7_Icon.ico => Source/php4DelphiR7_Icon.ico (100%) rename php4DelphiReg.pas => Source/php4DelphiReg.pas (100%) rename php4DelphiSplash.res => Source/php4DelphiSplash.res (100%) rename php4DelphiWeb.pas => Source/php4DelphiWeb.pas (100%) rename php4delphi.cnt => Source/php4delphi.cnt (97%) rename php4delphi.dcr => Source/php4delphi.dcr (100%) rename php4delphi.pas => Source/php4delphi.pas (100%) rename phpAbout.dfm => Source/phpAbout.dfm (100%) rename phpAbout.pas => Source/phpAbout.pas (100%) rename phpApp.pas => Source/phpApp.pas (100%) rename phpClass.pas => Source/phpClass.pas (100%) rename phpModules.pas => Source/phpModules.pas (100%) rename phpWeb.pas => Source/phpWeb.pas (100%) rename zend_dynamic_array.pas => Source/zend_dynamic_array.pas (100%) diff --git a/.gitignore b/.gitignore index 0b71af2..06ae224 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ __history/ + __recovery/ +*.dcu \ No newline at end of file diff --git a/Demos/Tutorial/Step.05/Project1.dpr b/Demos/Tutorial/Step.05/Project1.dpr deleted file mode 100644 index 0c8b444..0000000 --- a/Demos/Tutorial/Step.05/Project1.dpr +++ /dev/null @@ -1,16 +0,0 @@ -library Project1; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; -end. \ No newline at end of file diff --git a/Demos/psvPHP/sample1/Thumbs.db b/Demos/psvPHP/sample1/Thumbs.db deleted file mode 100644 index 9fda9ba16bacae14263d6467c7e185d770857eab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18944 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
h-fuZ$`n> zSJPbfpZB$pPd0MhH(SNKm4E0RP>*P(7!O&ClHwZ+$E;_|v`EEKKAFPQ){EE?FF#pS z_~Jdu*IKUSrtRV7hK>DmFbUADRi$wKGFXBzR8enN-=t z3qBC$xRps-#W!^~K;KUIEslsv9rzBDBA&Gww~?0r>0xWrl?H82(B+ErEQ*}oI6h2N zy9v(AuN7VC9~)t9O!kQH4DfNyskL+0wQKLcG%v`CT~KL!tiHNf>#i;Ng)BPg--cG)0yJ7IKoy9NrVuEt=d&Pxf*0I@)_}E@g+BL@V;0FNrO(%SBh^J`D zdnlEj{~^Q4ifq*GK&QE>p`{?7{(Fm7h%K%|*9KP>2dgsQHvhOg^si(bCoIsa?DNTc$zlYN0K;ms%P_ zs%Dz*ugU78tlupsM?L7CgA%hn_)jJZy*W!S^P?P@%|qtYcoWTG%=it5YBeYe@$}Lu zw<0Jy26#92krsPIk={8&#dggT{O$z&Z{@HVR|lJ)LgBRe`ln4{D&NfHy|0QvW6$}_ zrZbwivQs0cC<*&#X);0slXE{unClkO)tY>#ejiB`kMF7rLQ5;_+H|LRORkL<;I()+ zvA{WGpGq56G)@x-aDZ@~a=J9jQEaE$+(EJQD)4gtXcL(uqtnUmhud4BXrI$bxO+Xb z_basY$;V<>5N+)g*LBGOe?Ybyf#mKABH`jO@=j*f_GVmhK!T|?2x8Vj1?4Y_d7VFEjGK^8u{VH=7Q9=RIWY}g-7t@ zpDr8sFD`SSg)T(U(?Wj-M#pOR7Ngdl5^;LV+rGUB6A5c8@#WcuJ^P_W^O@Oiy}EIi zO4W_17=3Z5rDikJ%kkvH?)fa4X&Q|OX9Rw}fsQ!x0rc|MTbHDgqvW|1`^D!hy`@Ga zMRiKNhqcwN`QKg=30XB{F)(R(5#WFwqOS3F8bnzp@Xy%<4xxm&^KW1{H_#EVc|%x$ z%Mjn0Pc0r^p>>!Re9}p#;=E3GTzti&Lk>uTIEfTiS|%`wbtcnXTNs{a&Vye^6u`#j zYPy_m2wkAV>0>xHDy5j4ow>Jp1HrJ##f>*@OnrJa=Bq%%*V58cz4rl#Nwzwl z8dxQ)NTiXbMRa5)ZR@8IvWsZnsoQJsh48g{`dYKy+#Q$qr`8rfPzFYi!MXEDPAIl1 z(1U?Bi1)bo+Tvoj`1FeLO_h0p5q4`fNQ@+&(upfcwUd%gSql}H)nL)g#HK{3r9~Nt zdBRjbl8+(zUA>Peu(rE@w^ZDq=ukt^{Sv$OdYE3|@z5@QhPkc6EvI}wma00btK`M! zE_wONz^+@t;Wc1b@HhAeVC+ZlK-4)^t=w%;yCC5k_fLPamEzQ9Jcr2EK_?VgKKhMO z3RtBbJ2&D=q%K%MP?XgQCmSExE&);Bnw$$3MB^H=-T|LjoX+pWFfjn#<0JY!~c_ zF%ONS$3u}h-T>O0>yEptVNgQK$>JD`niwiIN#5={jOPnS#bKfR#?4pv0n7R4-*ybh z{$vwmlwLpN#{rEX&wi;KqzX~S&_%WLVmHVQOZld0pr&ZBosDO8>F1>xsy9AoE)?TN z&1o7g&A8q2WA$x+cFlu3VLENqSX#yk#nzWI7BTk%Lro=j9v_!8(&dVvv!E$xKQ~LSg9}0P31R;TVd`sp++x4D`N8&#=F!^}UD|{LnWXd+%8ovT zlVgj3Ph60P6?#A)?8+)=T}8`VvtSUx{iaH(OzJ0~;yVCv0{X`tUNCVCa-@PND$xE4 LD)9gL&FX&xjA>+g diff --git a/Clear.bat b/Source/Clear.bat similarity index 100% rename from Clear.bat rename to Source/Clear.bat diff --git a/DelphiFunctions.pas b/Source/DelphiFunctions.pas similarity index 97% rename from DelphiFunctions.pas rename to Source/DelphiFunctions.pas index c8dc24b..873315f 100644 --- a/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -1,259 +1,259 @@ {*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.telenet.be/ws36637 } -{*******************************************************} -{$I PHP.INC} - -{ $Id: DelphiFunctions.pas,v 7.2 10/2009 delphi32 Exp $ } - -unit DelphiFunctions; - -interface -uses - SysUtils, Classes, - Controls, - ZendTypes, ZendAPI, PHPTypes, PHPAPI, Dialogs, typinfo, - Forms, stdctrls; - -{$ifdef fpc} - {$mode delphi} -{$endif} - -var - - author_class_entry : Tzend_class_entry; - delphi_object_entry : TZend_class_entry; - - object_functions : array[0..2] of zend_function_entry; - author_functions : array[0..2] of zend_function_entry; - - DelphiObject : pzend_class_entry; - ce : pzend_class_entry; - - {$IFDEF PHP5} - DelphiObjectHandlers : zend_object_handlers; - {$ENDIF} - - -procedure RegisterInternalClasses(p : pointer); - - -//proto string delphi_get_system_directory(void) -{$IFDEF PHP510} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_str_date(void) -{$IFDEF PHP510} -procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto float delphi_date(void) -{$IFDEF PHP510} -procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_extract_file_dir(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_extract_file_drive(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_extract_file_name(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_extract_file_ext(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto void delphi_show_message(string message) -{$IFDEF PHP510} -procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_input_box(string caption, string prompt, string default) -{$IFDEF PHP510} -procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; - this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -{$IFDEF PHP510} -procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -{$IFDEF PHP510} -procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -{$IFDEF PHP510} -procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -const - SimpleProps = [tkInteger, tkChar, tkEnumeration, tkFloat, - tkString, tkWChar, tkLString, tkWString, tkVariant]; - -implementation - - - -//proto string delphi_get_system_directory(void) -{$IFDEF PHP510} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto string delphi_str_date(void) -{$IFDEF PHP510} -procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - ZVAL_STRING(return_value, PAnsiChar(DateToStr(Date)), true); -end; - -//proto float delphi_date(void) -{$IFDEF PHP510} -procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - ZVAL_DOUBLE(return_value, Date); -end; - -//proto string delphi_extract_file_dir(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto string delphi_extract_file_drive(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto string delphi_extract_file_name(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto string delphi_extract_file_ext(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto void delphi_show_message(string message) -{$IFDEF PHP510} -procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -begin - -end; - - +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} +{$I PHP.INC} + +{ $Id: DelphiFunctions.pas,v 7.2 10/2009 delphi32 Exp $ } + +unit DelphiFunctions; + +interface +uses + SysUtils, Classes, + Controls, + ZendTypes, ZendAPI, PHPTypes, PHPAPI, Dialogs, typinfo, + Forms, stdctrls; + +{$ifdef fpc} + {$mode delphi} +{$endif} + +var + + author_class_entry : Tzend_class_entry; + delphi_object_entry : TZend_class_entry; + + object_functions : array[0..2] of zend_function_entry; + author_functions : array[0..2] of zend_function_entry; + + DelphiObject : pzend_class_entry; + ce : pzend_class_entry; + + {$IFDEF PHP5} + DelphiObjectHandlers : zend_object_handlers; + {$ENDIF} + + +procedure RegisterInternalClasses(p : pointer); + + +//proto string delphi_get_system_directory(void) +{$IFDEF PHP510} +procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_str_date(void) +{$IFDEF PHP510} +procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto float delphi_date(void) +{$IFDEF PHP510} +procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_extract_file_dir(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_extract_file_drive(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_extract_file_name(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_extract_file_ext(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto void delphi_show_message(string message) +{$IFDEF PHP510} +procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +//proto string delphi_input_box(string caption, string prompt, string default) +{$IFDEF PHP510} +procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; + this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +{$IFDEF PHP510} +procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +{$IFDEF PHP510} +procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +{$IFDEF PHP510} +procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +const + SimpleProps = [tkInteger, tkChar, tkEnumeration, tkFloat, + tkString, tkWChar, tkLString, tkWString, tkVariant]; + +implementation + + + +//proto string delphi_get_system_directory(void) +{$IFDEF PHP510} +procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto string delphi_str_date(void) +{$IFDEF PHP510} +procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + ZVAL_STRING(return_value, PAnsiChar(DateToStr(Date)), true); +end; + +//proto float delphi_date(void) +{$IFDEF PHP510} +procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + ZVAL_DOUBLE(return_value, Date); +end; + +//proto string delphi_extract_file_dir(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto string delphi_extract_file_drive(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto string delphi_extract_file_name(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto string delphi_extract_file_ext(string source) +{$IFDEF PHP510} +procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +//proto void delphi_show_message(string message) +{$IFDEF PHP510} +procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +begin + +end; + + //proto string delphi_input_box(string caption, string prompt, string default) {$IFDEF PHP510} procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; @@ -266,474 +266,474 @@ procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; begin if ht <> 3 then begin - zend_wrong_param_count(TSRMLS_DC); - exit; + zend_wrong_param_count(TSRMLS_DC); + exit; end; zend_get_parameters_my(ht, p, TSRMLS_DC); ZVAL_STRINGW(return_value, PWideChar(InputBox( Z_STRVAL(p[0]^), Z_STRVAL(p[1]^), Z_STRVAL(p[2]^) )), true); dispose_pzval_array(p); -end; - -//proto void delphi_send_message(void) -{$IFDEF PHP510} -procedure delphi_send_email(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_send_email(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - //ShellExecute(0, 'open', 'mailto:serge_perevoznyk@hotmail.com', nil, nil, SW_SHOWNORMAL); -end; - -//proto void delphi_visit_homepage(void) -{$IFDEF PHP510} -procedure delphi_visit_homepage(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_visit_homepage(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - //ShellExecute(0, 'open', 'http://users.chello.be/ws36637', nil, nil, SW_SHOW); -end; - - -//Delphi objects support - -{$IFDEF PHP510} -procedure delphi_object_classname(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_object_classname(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -{$IFDEF PHP510} -procedure delphi_object_classnameis(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_object_classnameis(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin -end; - - - -{$IFDEF PHP4} -function delphi_set_property_handler(property_reference : Pzend_property_reference; value : pzval) : integer; cdecl; -var - this_ptr : pzval; - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - propname : AnsiString; -// --> hupu, 2006.06.01 -// pt : TTypeKind; -{$IFDEF VERSION7} - Scripter : TPHPScriptableObject; -{$ELSE} - pt : TypInfo.TTypeKind; -{$ENDIF} -// <-- hupu, 2006.06.01 -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - -// --> hupu, 2006.06.01 -{$IFDEF VERSION7} - Scripter := TPHPScriptableObject(Obj); - if SameText('Parent', propname) then - begin - TWinControl(Scripter.InstanceObj).Parent := - TWinControl(value^.value.lval); - end - else - Scripter.SetPropertyByID(Scripter.NameToDispID(propname), - [zval2variant(value^)] ); -{$ELSE} -// <-- hupu, 2006.06.01 - - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - SetPropValue(OBJ, propname, zval2variant(value^)) - else - if pt = tkClass then - begin - Obj := GetObjectProp(Obj, propname); - while element <> nil do - begin - element := element^.prev; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - begin - SetPropValue(OBJ, propname, zval2variant(value^)); - break; - end - else - if pt = tkClass then - Obj := GetObjectProp(Obj, propname); - end; - end; - -// --> hupu, 2006.06.01 -{$ENDIF} -// <-- hupu, 2006.06.01 - Result := SUCCESS; -end; - - - -procedure delphi_get_property_handler(val : pzval; property_reference : PZend_property_reference); cdecl; -var - this_ptr : pzval; - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - propname : AnsiString; -// --> hupu, 2006.06.01 -// pt : TTypeKind; -{$IFDEF VERSION7} - Scripter : TPHPScriptableObject; -{$ELSE} - pt : TypInfo.TTypeKind; -{$ENDIF} -// <-- hupu, 2006.06.01 -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - -// --> hupu, 2006.06.01 -{$IFDEF VERSION7} -Scripter := TPHPScriptableObject(Obj); -if SameText('Parent', propname) then -begin -TWinControl(Scripter.InstanceObj).Parent := -TWinControl(val^.value.lval); -end -else - -Scripter.SetPropertyByID(Scripter.NameToDispID(propname), -[zval2variant(val^)] ); -{$ELSE} -// <-- hupu, 2006.06.01 - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - variant2zval(GetPropValue(OBJ, propname), val) - else - if pt = tkClass then - begin - Obj := GetObjectProp(Obj, propname); - while element <> nil do - begin - element := element^.prev; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - begin - variant2zval(GetPropValue(OBJ, propname), val); - break; - end - else - if pt = tkClass then - Obj := GetObjectProp(Obj, propname); - end; - end; -// --> hupu, 2006.06.01 -{$ENDIF} -// <-- hupu, 2006.06.01 -end; - - - -procedure _delphi_get_property_wrapper; assembler; -asm - push ebp - mov ebp,esp - sub esp,50h - push ebx - push esi - push edi - lea edi,[ebp-50h] - mov ecx,14h - mov eax,0CCCCCCCCh - rep stosd - mov eax,dword ptr [ebp+0Ch] - push eax - lea ecx,[ebp-10h] - push ecx - call delphi_get_property_handler - add esp,8 - mov edx,dword ptr [ebp+8] - mov eax,dword ptr [ebp-10h] - mov dword ptr [edx],eax - mov ecx,dword ptr [ebp-0Ch] - mov dword ptr [edx+4],ecx - mov eax,dword ptr [ebp-8] - mov dword ptr [edx+8],eax - mov ecx,dword ptr [ebp-4] - mov dword ptr [edx+0Ch],ecx - mov eax,dword ptr [ebp+8] - - pop edi - pop esi - pop ebx - add esp,50h - cmp ebp,esp - mov esp,ebp - pop ebp - ret -end; - - -procedure delphi_call_function(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; -var - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - MethodName : AnsiString; - Params : pzval_array; - M, D : integer; -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - MethodName := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - if ( Obj.InheritsFrom(TCustomEdit) ) then - begin - if SameText(MethodName, 'Clear') then - TCustomEdit(Obj).Clear; - if SameText(MethodName, 'ClearSelection') then - TCustomEdit(Obj).ClearSelection; - if SameText(MethodName, 'CopyToClipboard') then - TCustomEdit(Obj).CopyToClipboard; - if SameText(MethodName, 'ControlCount') then - ZVAL_LONG(return_value, TCustomEdit(Obj).ControlCount); - if SameText(MethodName, 'ScaleBy') then - begin - if ht > 0 then - begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - end; - M := Params[0]^.value.lval; - D := Params[1]^.value.lval; - TCustomEdit(Obj).ScaleBy(M, D); - dispose_pzval_array(Params); - end; - end; -end; -{$ENDIF} - - - -{$IFDEF PHP5} - -// Read object property value (getter) -function delphi_get_property_handler(_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; -begin - -end; - -// Write object property value (setter) -procedure delphi_set_property_handler(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; -begin - -end; - -{$IFDEF PHP510} -function delphi_call_method(method : PAnsiChar; ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; -{$ELSE} -function delphi_call_method(method : PAnsiChar; ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; -{$ENDIF} -begin - -end; - -function delphi_get_method(_object : pzval; method_name : PAnsiChar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; - -begin - -end; - - -{$ENDIF} - -{$IFDEF PHP510} -procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - properties : array[0..3] of PAnsiChar; -begin - properties[0] := 'name'; - properties[1] := 'last'; - properties[2] := 'height'; - properties[3] := 'email'; - {$IFDEF PHP4} - _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); - {$ELSE} - object_init(return_value, ce, TSRMLS_DC ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1); - {$ELSE} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1, TSRMLS_DC); - {$ENDIF} - - {$IFDEF PHP5} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); - {$ELSE} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); - {$ENDIF} - - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1); - {$ELSE} - add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1, TSRMLS_DC); - {$ENDIF} -end; - - - - -{$IFDEF PHP510} -procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -begin - -end; - -{$IFDEF PHP510} -procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -begin - - -end; - - - -procedure RegisterInternalClasses(p : pointer); - -begin - object_functions[0].fname := 'delphi_classname'; - object_functions[0].handler := @delphi_object_classname; - - object_functions[1].fname := 'delphi_classnameis'; - object_functions[1].handler := @delphi_object_classnameis; - - object_functions[2].fname := nil; - object_functions[2].handler := nil; - - INIT_CLASS_ENTRY(delphi_object_entry, 'delphi_class' , @object_functions); - - {$IFDEF PHP4} - Delphi_Object_Entry.handle_property_get := @_delphi_get_property_wrapper; - Delphi_Object_Entry.handle_property_set := @delphi_set_property_handler; - Delphi_Object_Entry.handle_function_call := @delphi_call_function; - {$ELSE} - Move(zend_get_std_object_handlers()^, DelphiObjectHandlers, sizeof(zend_object_handlers)); - DelphiObjectHandlers.read_property := @delphi_get_property_handler; - DelphiObjecthandlers.write_property := @delphi_set_property_handler; - DelphiObjectHandlers.call_method := @delphi_call_method; - DelphiObjectHandlers.get_method := @delphi_get_method; - {$ENDIF} - - DelphiObject := zend_register_internal_class(@delphi_object_entry, p); - - author_functions[0].fname := 'send_email'; - author_functions[0].handler := @delphi_send_email; - - author_functions[1].fname := 'visit_homepage'; - author_functions[1].handler := @delphi_visit_homepage; - - author_functions[2].fname := nil; - author_functions[2].handler := nil; - INIT_CLASS_ENTRY(author_class_entry, 'php4delphi_author', @author_functions); - ce := zend_register_internal_class(@author_class_entry, p); - -end; - -{$IFDEF VERSION7} - -{ -Delphi scripting support -The Original Code is: JvOle2Auto.PAS, released on 2002-07-04. -The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev -Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev -Copyright (c) 2001,2002 SGB Software -All Rights Reserved. -} - - -function WashVariant(const Value: Variant): OleVariant; -begin - if TVarData(Value).VType = (varString or varByRef) then - Result := PString(TVarData(VAlue).VString)^ + '' - else - Result := Value; -end; - - - -{$ENDIF} - +end; + +//proto void delphi_send_message(void) +{$IFDEF PHP510} +procedure delphi_send_email(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_send_email(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + //ShellExecute(0, 'open', 'mailto:serge_perevoznyk@hotmail.com', nil, nil, SW_SHOWNORMAL); +end; + +//proto void delphi_visit_homepage(void) +{$IFDEF PHP510} +procedure delphi_visit_homepage(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_visit_homepage(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + //ShellExecute(0, 'open', 'http://users.chello.be/ws36637', nil, nil, SW_SHOW); +end; + + +//Delphi objects support + +{$IFDEF PHP510} +procedure delphi_object_classname(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_object_classname(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin + +end; + +{$IFDEF PHP510} +procedure delphi_object_classnameis(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_object_classnameis(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +begin +end; + + + +{$IFDEF PHP4} +function delphi_set_property_handler(property_reference : Pzend_property_reference; value : pzval) : integer; cdecl; +var + this_ptr : pzval; + OBJ : TObject; + data: ^ppzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + p : pointer; + propname : AnsiString; +// --> hupu, 2006.06.01 +// pt : TTypeKind; +{$IFDEF VERSION7} + Scripter : TPHPScriptableObject; +{$ELSE} + pt : TypInfo.TTypeKind; +{$ENDIF} +// <-- hupu, 2006.06.01 +begin + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + + this_ptr := property_reference^._object; + new(data); + zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); + Obj := TObject(data^^^.value.lval); + freemem(data); + +// --> hupu, 2006.06.01 +{$IFDEF VERSION7} + Scripter := TPHPScriptableObject(Obj); + if SameText('Parent', propname) then + begin + TWinControl(Scripter.InstanceObj).Parent := + TWinControl(value^.value.lval); + end + else + Scripter.SetPropertyByID(Scripter.NameToDispID(propname), + [zval2variant(value^)] ); +{$ELSE} +// <-- hupu, 2006.06.01 + + pt := PropType(Obj, propname); + if ( pt in SimpleProps) then + SetPropValue(OBJ, propname, zval2variant(value^)) + else + if pt = tkClass then + begin + Obj := GetObjectProp(Obj, propname); + while element <> nil do + begin + element := element^.prev; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + pt := PropType(Obj, propname); + if ( pt in SimpleProps) then + begin + SetPropValue(OBJ, propname, zval2variant(value^)); + break; + end + else + if pt = tkClass then + Obj := GetObjectProp(Obj, propname); + end; + end; + +// --> hupu, 2006.06.01 +{$ENDIF} +// <-- hupu, 2006.06.01 + Result := SUCCESS; +end; + + + +procedure delphi_get_property_handler(val : pzval; property_reference : PZend_property_reference); cdecl; +var + this_ptr : pzval; + OBJ : TObject; + data: ^ppzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + p : pointer; + propname : AnsiString; +// --> hupu, 2006.06.01 +// pt : TTypeKind; +{$IFDEF VERSION7} + Scripter : TPHPScriptableObject; +{$ELSE} + pt : TypInfo.TTypeKind; +{$ENDIF} +// <-- hupu, 2006.06.01 +begin + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + this_ptr := property_reference^._object; + new(data); + zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); + Obj := TObject(data^^^.value.lval); + freemem(data); + +// --> hupu, 2006.06.01 +{$IFDEF VERSION7} +Scripter := TPHPScriptableObject(Obj); +if SameText('Parent', propname) then +begin +TWinControl(Scripter.InstanceObj).Parent := +TWinControl(val^.value.lval); +end +else + +Scripter.SetPropertyByID(Scripter.NameToDispID(propname), +[zval2variant(val^)] ); +{$ELSE} +// <-- hupu, 2006.06.01 + pt := PropType(Obj, propname); + if ( pt in SimpleProps) then + variant2zval(GetPropValue(OBJ, propname), val) + else + if pt = tkClass then + begin + Obj := GetObjectProp(Obj, propname); + while element <> nil do + begin + element := element^.prev; + p := @element^.data; + prop := pzend_overloaded_element(p); + propname := prop^.element.value.str.val; + pt := PropType(Obj, propname); + if ( pt in SimpleProps) then + begin + variant2zval(GetPropValue(OBJ, propname), val); + break; + end + else + if pt = tkClass then + Obj := GetObjectProp(Obj, propname); + end; + end; +// --> hupu, 2006.06.01 +{$ENDIF} +// <-- hupu, 2006.06.01 +end; + + + +procedure _delphi_get_property_wrapper; assembler; +asm + push ebp + mov ebp,esp + sub esp,50h + push ebx + push esi + push edi + lea edi,[ebp-50h] + mov ecx,14h + mov eax,0CCCCCCCCh + rep stosd + mov eax,dword ptr [ebp+0Ch] + push eax + lea ecx,[ebp-10h] + push ecx + call delphi_get_property_handler + add esp,8 + mov edx,dword ptr [ebp+8] + mov eax,dword ptr [ebp-10h] + mov dword ptr [edx],eax + mov ecx,dword ptr [ebp-0Ch] + mov dword ptr [edx+4],ecx + mov eax,dword ptr [ebp-8] + mov dword ptr [edx+8],eax + mov ecx,dword ptr [ebp-4] + mov dword ptr [edx+0Ch],ecx + mov eax,dword ptr [ebp+8] + + pop edi + pop esi + pop ebx + add esp,50h + cmp ebp,esp + mov esp,ebp + pop ebp + ret +end; + + +procedure delphi_call_function(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; +var + OBJ : TObject; + data: ^ppzval; + element : pzend_list_element; + prop : pzend_overloaded_element; + p : pointer; + MethodName : AnsiString; + Params : pzval_array; + M, D : integer; +begin + element := property_reference^.elements_list^.head; + p := @element^.data; + prop := pzend_overloaded_element(p); + MethodName := prop^.element.value.str.val; + this_ptr := property_reference^._object; + new(data); + zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); + Obj := TObject(data^^^.value.lval); + freemem(data); + if ( Obj.InheritsFrom(TCustomEdit) ) then + begin + if SameText(MethodName, 'Clear') then + TCustomEdit(Obj).Clear; + if SameText(MethodName, 'ClearSelection') then + TCustomEdit(Obj).ClearSelection; + if SameText(MethodName, 'CopyToClipboard') then + TCustomEdit(Obj).CopyToClipboard; + if SameText(MethodName, 'ControlCount') then + ZVAL_LONG(return_value, TCustomEdit(Obj).ControlCount); + if SameText(MethodName, 'ScaleBy') then + begin + if ht > 0 then + begin + if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + end; + M := Params[0]^.value.lval; + D := Params[1]^.value.lval; + TCustomEdit(Obj).ScaleBy(M, D); + dispose_pzval_array(Params); + end; + end; +end; +{$ENDIF} + + + +{$IFDEF PHP5} + +// Read object property value (getter) +function delphi_get_property_handler(_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; +begin + +end; + +// Write object property value (setter) +procedure delphi_set_property_handler(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; +begin + +end; + +{$IFDEF PHP510} +function delphi_call_method(method : PAnsiChar; ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; +{$ELSE} +function delphi_call_method(method : PAnsiChar; ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; +{$ENDIF} +begin + +end; + +function delphi_get_method(_object : pzval; method_name : PAnsiChar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; + +begin + +end; + + +{$ENDIF} + +{$IFDEF PHP510} +procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + properties : array[0..3] of PAnsiChar; +begin + properties[0] := 'name'; + properties[1] := 'last'; + properties[2] := 'height'; + properties[3] := 'email'; + {$IFDEF PHP4} + _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); + {$ELSE} + object_init(return_value, ce, TSRMLS_DC ); + {$ENDIF} + + {$IFDEF PHP4} + add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); + add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1); + {$ELSE} + add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); + add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1, TSRMLS_DC); + {$ENDIF} + + {$IFDEF PHP5} + add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); + {$ELSE} + add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); + {$ENDIF} + + {$IFDEF PHP4} + add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1); + {$ELSE} + add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1, TSRMLS_DC); + {$ENDIF} +end; + + + + +{$IFDEF PHP510} +procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +begin + +end; + +{$IFDEF PHP510} +procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} + +begin + + +end; + + + +procedure RegisterInternalClasses(p : pointer); + +begin + object_functions[0].fname := 'delphi_classname'; + object_functions[0].handler := @delphi_object_classname; + + object_functions[1].fname := 'delphi_classnameis'; + object_functions[1].handler := @delphi_object_classnameis; + + object_functions[2].fname := nil; + object_functions[2].handler := nil; + + INIT_CLASS_ENTRY(delphi_object_entry, 'delphi_class' , @object_functions); + + {$IFDEF PHP4} + Delphi_Object_Entry.handle_property_get := @_delphi_get_property_wrapper; + Delphi_Object_Entry.handle_property_set := @delphi_set_property_handler; + Delphi_Object_Entry.handle_function_call := @delphi_call_function; + {$ELSE} + Move(zend_get_std_object_handlers()^, DelphiObjectHandlers, sizeof(zend_object_handlers)); + DelphiObjectHandlers.read_property := @delphi_get_property_handler; + DelphiObjecthandlers.write_property := @delphi_set_property_handler; + DelphiObjectHandlers.call_method := @delphi_call_method; + DelphiObjectHandlers.get_method := @delphi_get_method; + {$ENDIF} + + DelphiObject := zend_register_internal_class(@delphi_object_entry, p); + + author_functions[0].fname := 'send_email'; + author_functions[0].handler := @delphi_send_email; + + author_functions[1].fname := 'visit_homepage'; + author_functions[1].handler := @delphi_visit_homepage; + + author_functions[2].fname := nil; + author_functions[2].handler := nil; + INIT_CLASS_ENTRY(author_class_entry, 'php4delphi_author', @author_functions); + ce := zend_register_internal_class(@author_class_entry, p); + +end; + +{$IFDEF VERSION7} + +{ +Delphi scripting support +The Original Code is: JvOle2Auto.PAS, released on 2002-07-04. +The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev +Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev +Copyright (c) 2001,2002 SGB Software +All Rights Reserved. +} + + +function WashVariant(const Value: Variant): OleVariant; +begin + if TVarData(Value).VType = (varString or varByRef) then + Result := PString(TVarData(VAlue).VString)^ + '' + else + Result := Value; +end; + + + +{$ENDIF} + end. diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dti b/Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dti rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.dti diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Borland Demo/borland_demo.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/class_demo.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dti b/Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dti rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.dti diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/dm_Class.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Class demo/test_class.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/test_class.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Class demo/test_class.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Class demo/test_class.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dti b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dti rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.dti diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/delphi_class_module.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/readme.txt b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/readme.txt similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/readme.txt rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 1/readme.txt diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/readme.txt b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/readme.txt similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/readme.txt rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/readme.txt diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Math/delphi_math.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dti b/Source/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dti rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.dti diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Math/extmain.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Math/test_math.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/Math/test_math.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Math/test_math.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Math/test_math.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarp.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarptest.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarptest.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarptest.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Read array parameters/rarptest.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dti b/Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dti rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.dti diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/res_ext.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/Resources/test_resource.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/test_resource.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/Resources/test_resource.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/Resources/test_resource.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/array result/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/array result/rarray.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/css/CREDITS b/Source/Demos Delphi 2009 (WideString support)/Extensions/css/CREDITS similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/css/CREDITS rename to Source/Demos Delphi 2009 (WideString support)/Extensions/css/CREDITS diff --git a/Demos Delphi 2009 (WideString support)/Extensions/css/EXPERIMENTAL b/Source/Demos Delphi 2009 (WideString support)/Extensions/css/EXPERIMENTAL similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/css/EXPERIMENTAL rename to Source/Demos Delphi 2009 (WideString support)/Extensions/css/EXPERIMENTAL diff --git a/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/css/css.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/css/css.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/css/css.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/css/css.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/php class/test_class.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/php class/test_class.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/php class/test_class.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/php class/test_class.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dti b/Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dti rename to Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.dti diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/phpDLL.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/testdll.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/testdll.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/phpDLL/testdll.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/phpDLL/testdll.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Extensions/reference/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.res b/Source/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.res rename to Source/Demos Delphi 2009 (WideString support)/Extensions/reference/php_ref.res diff --git a/Demos Delphi 2009 (WideString support)/Extensions/reference/testref.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/reference/testref.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/reference/testref.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/reference/testref.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/CREDITS b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/CREDITS similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/skeleton/CREDITS rename to Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/CREDITS diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/EXPERIMENTAL b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/EXPERIMENTAL similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/skeleton/EXPERIMENTAL rename to Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/EXPERIMENTAL diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.bdsproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.bdsproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.bdsproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.bdsproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr rename to Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dproj b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dproj rename to Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dproj diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/skeleton.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/skeleton.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/skeleton.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/skeleton.php diff --git a/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/test_skeleton.php b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/test_skeleton.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/test_skeleton.php rename to Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/tests/test_skeleton.php diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dpr rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dpr diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dproj b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dproj rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.dproj diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.res b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.res rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Project1.res diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dti b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dti rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.dti diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.01/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dpr rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dpr diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dproj b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dproj rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.dproj diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.res b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.res rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Project1.res diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dti b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dti rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.dti diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.02/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dpr rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dpr diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dproj b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dproj rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.dproj diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.res b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.res rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Project1.res diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dti b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dti rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.dti diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.03/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dpr rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dpr diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dproj b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dproj rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.dproj diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.res b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.res rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Project1.res diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dti b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dti rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.dti diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.04/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dpr rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dpr diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dproj b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dproj rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.dproj diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.res b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.res rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Project1.res diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dti b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dti rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.dti diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.05/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/Tutorial/Step.06/test_script.php b/Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.06/test_script.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/Tutorial/Step.06/test_script.php rename to Source/Demos Delphi 2009 (WideString support)/Tutorial/Step.06/test_script.php diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/App.ico b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/App.ico similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/App.ico rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/App.ico diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.cs b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.cs similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.cs rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.cs diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.resx b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.resx similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.resx rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/Form1.resx diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/app.config b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/app.config similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/app.config rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/app.config diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/test.php b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/test.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/test.php rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C#/PHP4DelphiDemo/test.php diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.cpp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.cpp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.cpp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.cpp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.h b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.h similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.h rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/StdAfx.h diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.cpp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.cpp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.cpp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.cpp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsw b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsw similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsw rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.dsw diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.sln b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.sln similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.sln rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.sln diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.vcproj b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.vcproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.vcproj rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/cdemo.vcproj diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/test.php b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/test.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/test.php rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 2005/test.php diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.cpp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.cpp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.cpp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.cpp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.h b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.h similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.h rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/StdAfx.h diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.cpp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.cpp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.cpp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.cpp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsw b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsw similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsw rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/cdemo.dsw diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/test.php b/Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/test.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/test.php rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/C++ VS 6.0/test.php diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.pas b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.pas rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.pas diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.resx b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.resx similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.resx rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.MainForm.resx diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.Standard.pas b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.Standard.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.Standard.pas rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.Standard.pas diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.dpr b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.dpr rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.dpr diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.res b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.res rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi .NET/php4DelphiDemo.res diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dproj b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dproj rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dproj diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.res b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.res rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.res diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/result.txt b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/result.txt similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi/result.txt rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/result.txt diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/test.php b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/test.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Delphi/test.php rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/test.php diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/Doc1.doc b/Source/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/Doc1.doc similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/MS Word/Doc1.doc rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/Doc1.doc diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/test.php b/Source/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/test.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/MS Word/test.php rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/MS Word/test.php diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi.sln b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi.sln similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi.sln rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi.sln diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user b/Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/Form1.frm b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/Form1.frm similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/Form1.frm rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/Form1.frm diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/MSSCCPRJ.SCC b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/MSSCCPRJ.SCC similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/MSSCCPRJ.SCC rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/MSSCCPRJ.SCC diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbp b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbp similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbp rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbp diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbw b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbw similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbw rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_VB.vbw diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_module.bas b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_module.bas similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_module.bas rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/php_module.bas diff --git a/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/test.php b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/test.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/test.php rename to Source/Demos Delphi 2009 (WideString support)/php4Applications/Visual Basic/test.php diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/ComponentsDemo.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Components/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Components/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/DemoMain.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/ExtDemo.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/phpShellLibrary.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/phpShellLibrary.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/phpShellLibrary.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Custom Library/phpShellLibrary.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Dynamic Array/dynamic_array.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/EncDemo.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Encryption/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/std.encryption.class.inc b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/std.encryption.class.inc similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Encryption/std.encryption.class.inc rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/std.encryption.class.inc diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Encryption/uMain.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Project1.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Graph/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Graph/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Graph/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmEngine.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/dmMain.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpISAPITest.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpISAPITest.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpISAPITest.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpISAPITest.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.bdsproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.bdsproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.bdsproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.bdsproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/ISAPI Module/phpisapitest.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/LibraryDemo.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dti b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dti similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dti rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.dti diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/dm_Main.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Library demo/frm_dialog.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/LogoDemo.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Logo/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/egg.gif b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/egg.gif similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Logo/egg.gif rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/egg.gif diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Logo/uMain.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/frm_main.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/php_thread.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/php_thread.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/php_thread.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/php_thread.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Project1.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/array demo/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/array demo/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/array demo/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/console/phpcon.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/console/test.php b/Source/Demos Delphi 2009 (WideString support)/psvPHP/console/test.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/console/test.php rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/console/test.php diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/Sample1.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.RES b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.RES similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.RES rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.RES diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.rc b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.rc similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.rc rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/internal.rc diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/php.gif b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/php.gif similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/php.gif rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/php.gif diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/test.php b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/test.php similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/test.php rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/test.php diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend1.gif b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend1.gif similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend1.gif rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend1.gif diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend2.gif b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend2.gif similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend2.gif rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/zend2.gif diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Sample2.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample2/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample2/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample2/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Sample3.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/Unit1.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample3/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample3/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample3/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/WindowsXP.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/WindowsXP.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample4/WindowsXP.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/WindowsXP.res diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.ddp b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.ddp similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.ddp rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.ddp diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.dfm b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.dfm similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.dfm rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.dfm diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.pas similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.pas rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/frm_PHPTest.pas diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dpr b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dpr similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dpr rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dpr diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dproj similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dproj rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.dproj diff --git a/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.res similarity index 100% rename from Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.res rename to Source/Demos Delphi 2009 (WideString support)/psvPHP/sample4/psvPHP_test.res diff --git a/Demos/Bonus/JpegConverter/php_jpeg.bdsproj b/Source/Demos/Bonus/JpegConverter/php_jpeg.bdsproj similarity index 100% rename from Demos/Bonus/JpegConverter/php_jpeg.bdsproj rename to Source/Demos/Bonus/JpegConverter/php_jpeg.bdsproj diff --git a/Demos/Bonus/JpegConverter/php_jpeg.dpr b/Source/Demos/Bonus/JpegConverter/php_jpeg.dpr similarity index 96% rename from Demos/Bonus/JpegConverter/php_jpeg.dpr rename to Source/Demos/Bonus/JpegConverter/php_jpeg.dpr index 876e836..2ef4892 100644 --- a/Demos/Bonus/JpegConverter/php_jpeg.dpr +++ b/Source/Demos/Bonus/JpegConverter/php_jpeg.dpr @@ -1,292 +1,292 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.telenet.be/ws36637 } -{*******************************************************} - -{ $Id: php_jpeg.dpr,v 7.4 10/2009 delphi32 Exp $ } - -{$I PHP.INC} - -library php_jpeg; - -uses - Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI, jpeg, graphics, - Classes; - - -procedure Bmp2Jpg(ABitmap : TBitmap; AJpeg : TJpegImage); -begin - if not Assigned(ABitmap) then - Exit; - - if not Assigned(AJPeg) then - Exit; - - AJPeg.Assign(ABitmap); -end; - -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PAnsiChar('JPEG support'), PAnsiChar('enabled')); - php_info_print_table_end(); -end; - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -{$IFDEF PHP510} -procedure convert_bmp_jpeg (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure convert_bmp_jpeg (ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - bmpName : PAnsiChar; - JpgName : PAnsiChar; - param : pzval_array; - Bitmap : TBitmap; - Jpg : TJPEGImage; -begin - if ht <> 2 then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - bmpName := param[0]^.value.str.val; - JpgName := param[1]^.value.str.val; - dispose_pzval_array(param); - - if not FileExists(bmpName) then - begin - ZVAL_FALSE(return_value); - exit; - end; - - try - BitMap := TBitmap.Create; - Bitmap.LoadFromFile(bmpName); - Jpg := TJPegImage.Create; - Bmp2Jpg(Bitmap, Jpg); - Jpg.SaveToFile(JpgName); - ZVAL_TRUE(return_value); - except - ZVAL_FALSE(return_value); - end; -end; - - -{$IFDEF PHP510} -procedure show_bmp_jpeg (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure show_bmp_jpeg (ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - bmpName : PAnsiChar; - param : pzval_array; - Bitmap : TBitmap; - Jpg : TJPEGImage; - MS : TMemoryStream; - _content_type : PAnsiChar; -begin - if ht <> 1 then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - bmpName := param[0]^.value.str.val; - dispose_pzval_array(param); - if not FileExists(bmpName) then - begin - ZVAL_FALSE(return_value); - Exit; - end; - - try - BitMap := TBitmap.Create; - Bitmap.LoadFromFile(bmpName); - Jpg := TJPegImage.Create; - Bmp2Jpg(Bitmap, Jpg); - MS := TMemoryStream.Create; - Jpg.SaveToStream(MS); - _content_type := 'Content-type: image/jpeg'; - sapi_add_header_ex(_content_type, strlen(_content_type), true, true, TSRMLS_DC); - php_body_write(MS.Memory, MS.Size, TSRMLS_DC); - MS.Free; - ZVAL_TRUE(return_value); - except - ZVAL_FALSE(return_value); - end; -end; - - -{$IFDEF PHP510} -procedure sign_jpeg (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure sign_jpeg (ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - JpgName : PAnsiChar; - FontName : PAnsiChar; - Color : TColor; - Size : integer; - X : integer; - Y : integer; - Sign : PAnsiChar; - - param : pzval_array; - Jpg : TJPEGImage; - Bmp : TBitmap; - - MS : TMemoryStream; - _content_type : PAnsiChar; - -begin - if ht <> 7 then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - JpgName := param[0]^.value.str.val; - FontName := param[1]^.value.str.val; - Color := param[2]^.value.lval; - Size := param[3]^.value.lval; - X := param[4]^.value.lval; - Y := param[5]^.value.lval; - Sign := param[6]^.value.str.val; - - dispose_pzval_array(param); - - if not FileExists(JpgName) then - begin - ZVAL_FALSE(return_value); - Exit; - end; - - try - Jpg := TJpegImage.Create; - Jpg.LoadFromFile(JpgName); - Bmp := TBitmap.Create; - Bmp.Assign(JPG); - Bmp.Canvas.Font.Name := FontName; - Bmp.Canvas.Font.Size := Size; - Bmp.canvas.Font.Color := Color; - Bmp.Canvas.Pen.Style := psClear; - Bmp.Canvas.Brush.Style := bsClear; - Bmp.Canvas.TextOut(X, Y, Sign); - Jpg.Assign(bmp); - Bmp.Free; - MS := TMemoryStream.Create; - Jpg.SaveToStream(MS); - _content_type := 'Content-type: image/jpeg'; - sapi_add_header_ex(_content_type, strlen(_content_type), true, true, TSRMLS_DC); - php_body_write(MS.Memory, MS.Size, TSRMLS_DC); - MS.Free; - ZVAL_TRUE(return_value); - except - ZVAL_FALSE(return_value); - end; -end; - - -var - moduleEntry : Tzend_module_entry; - module_entry_table : array[0..3] of zend_function_entry; - - -function get_module : Pzend_module_entry; cdecl; -begin - if not PHPLoaded then - LoadPHP; - - ModuleEntry.size := sizeof(Tzend_module_entry); - ModuleEntry.zend_api := ZEND_MODULE_API_NO; - ModuleEntry.zts := USING_ZTS; - ModuleEntry.Name := 'php_jpeg'; - ModuleEntry.version := '1.0'; - ModuleEntry.module_startup_func := @minit; - ModuleEntry.module_shutdown_func := @mshutdown; - ModuleEntry.request_startup_func := @rinit; - ModuleEntry.request_shutdown_func := @rshutdown; - ModuleEntry.info_func := @php_info_module; - - Module_entry_table[0].fname := 'convert_bmp_jpeg'; - Module_entry_table[0].handler := @convert_bmp_jpeg; - - Module_entry_table[1].fname := 'show_bmp_jpeg'; - Module_entry_table[1].handler := @show_bmp_jpeg; - - Module_entry_table[2].fname := 'sign_jpeg'; - Module_entry_table[2].handler := @sign_jpeg; - - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} - ModuleEntry.functions := @module_entry_table[0]; - ModuleEntry._type := MODULE_PERSISTENT; - - {$IFDEF PHP530} - {$IFNDEF COMPILER_VC9} - moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ELSE} - moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ENDIF} - {$ENDIF} - - Result := @ModuleEntry; -end; - - - -exports - get_module; - -end. - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{ $Id: php_jpeg.dpr,v 7.4 10/2009 delphi32 Exp $ } + +{$I PHP.INC} + +library php_jpeg; + +uses + Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI, jpeg, graphics, + Classes; + + +procedure Bmp2Jpg(ABitmap : TBitmap; AJpeg : TJpegImage); +begin + if not Assigned(ABitmap) then + Exit; + + if not Assigned(AJPeg) then + Exit; + + AJPeg.Assign(ABitmap); +end; + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('JPEG support'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +{$IFDEF PHP510} +procedure convert_bmp_jpeg (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure convert_bmp_jpeg (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + bmpName : PAnsiChar; + JpgName : PAnsiChar; + param : pzval_array; + Bitmap : TBitmap; + Jpg : TJPEGImage; +begin + if ht <> 2 then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + bmpName := param[0]^.value.str.val; + JpgName := param[1]^.value.str.val; + dispose_pzval_array(param); + + if not FileExists(bmpName) then + begin + ZVAL_FALSE(return_value); + exit; + end; + + try + BitMap := TBitmap.Create; + Bitmap.LoadFromFile(bmpName); + Jpg := TJPegImage.Create; + Bmp2Jpg(Bitmap, Jpg); + Jpg.SaveToFile(JpgName); + ZVAL_TRUE(return_value); + except + ZVAL_FALSE(return_value); + end; +end; + + +{$IFDEF PHP510} +procedure show_bmp_jpeg (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure show_bmp_jpeg (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + bmpName : PAnsiChar; + param : pzval_array; + Bitmap : TBitmap; + Jpg : TJPEGImage; + MS : TMemoryStream; + _content_type : PAnsiChar; +begin + if ht <> 1 then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + bmpName := param[0]^.value.str.val; + dispose_pzval_array(param); + if not FileExists(bmpName) then + begin + ZVAL_FALSE(return_value); + Exit; + end; + + try + BitMap := TBitmap.Create; + Bitmap.LoadFromFile(bmpName); + Jpg := TJPegImage.Create; + Bmp2Jpg(Bitmap, Jpg); + MS := TMemoryStream.Create; + Jpg.SaveToStream(MS); + _content_type := 'Content-type: image/jpeg'; + sapi_add_header_ex(_content_type, strlen(_content_type), true, true, TSRMLS_DC); + php_body_write(MS.Memory, MS.Size, TSRMLS_DC); + MS.Free; + ZVAL_TRUE(return_value); + except + ZVAL_FALSE(return_value); + end; +end; + + +{$IFDEF PHP510} +procedure sign_jpeg (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure sign_jpeg (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + JpgName : PAnsiChar; + FontName : PAnsiChar; + Color : TColor; + Size : integer; + X : integer; + Y : integer; + Sign : PAnsiChar; + + param : pzval_array; + Jpg : TJPEGImage; + Bmp : TBitmap; + + MS : TMemoryStream; + _content_type : PAnsiChar; + +begin + if ht <> 7 then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + JpgName := param[0]^.value.str.val; + FontName := param[1]^.value.str.val; + Color := param[2]^.value.lval; + Size := param[3]^.value.lval; + X := param[4]^.value.lval; + Y := param[5]^.value.lval; + Sign := param[6]^.value.str.val; + + dispose_pzval_array(param); + + if not FileExists(JpgName) then + begin + ZVAL_FALSE(return_value); + Exit; + end; + + try + Jpg := TJpegImage.Create; + Jpg.LoadFromFile(JpgName); + Bmp := TBitmap.Create; + Bmp.Assign(JPG); + Bmp.Canvas.Font.Name := FontName; + Bmp.Canvas.Font.Size := Size; + Bmp.canvas.Font.Color := Color; + Bmp.Canvas.Pen.Style := psClear; + Bmp.Canvas.Brush.Style := bsClear; + Bmp.Canvas.TextOut(X, Y, Sign); + Jpg.Assign(bmp); + Bmp.Free; + MS := TMemoryStream.Create; + Jpg.SaveToStream(MS); + _content_type := 'Content-type: image/jpeg'; + sapi_add_header_ex(_content_type, strlen(_content_type), true, true, TSRMLS_DC); + php_body_write(MS.Memory, MS.Size, TSRMLS_DC); + MS.Free; + ZVAL_TRUE(return_value); + except + ZVAL_FALSE(return_value); + end; +end; + + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..3] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'php_jpeg'; + ModuleEntry.version := '1.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + + Module_entry_table[0].fname := 'convert_bmp_jpeg'; + Module_entry_table[0].handler := @convert_bmp_jpeg; + + Module_entry_table[1].fname := 'show_bmp_jpeg'; + Module_entry_table[1].handler := @show_bmp_jpeg; + + Module_entry_table[2].fname := 'sign_jpeg'; + Module_entry_table[2].handler := @sign_jpeg; + + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos/Bonus/JpegConverter/php_jpeg.php b/Source/Demos/Bonus/JpegConverter/php_jpeg.php similarity index 95% rename from Demos/Bonus/JpegConverter/php_jpeg.php rename to Source/Demos/Bonus/JpegConverter/php_jpeg.php index 09531ec..bfcc65b 100644 --- a/Demos/Bonus/JpegConverter/php_jpeg.php +++ b/Source/Demos/Bonus/JpegConverter/php_jpeg.php @@ -1,16 +1,16 @@ - + diff --git a/Demos/Bonus/PHPEncoder/phpencoder.bdsproj b/Source/Demos/Bonus/PHPEncoder/phpencoder.bdsproj similarity index 100% rename from Demos/Bonus/PHPEncoder/phpencoder.bdsproj rename to Source/Demos/Bonus/PHPEncoder/phpencoder.bdsproj diff --git a/Demos/Bonus/PHPEncoder/phpencoder.dpr b/Source/Demos/Bonus/PHPEncoder/phpencoder.dpr similarity index 96% rename from Demos/Bonus/PHPEncoder/phpencoder.dpr rename to Source/Demos/Bonus/PHPEncoder/phpencoder.dpr index a8fcfff..0f03996 100644 --- a/Demos/Bonus/PHPEncoder/phpencoder.dpr +++ b/Source/Demos/Bonus/PHPEncoder/phpencoder.dpr @@ -1,110 +1,110 @@ -library phpencoder; - -{$I PHP.INC} - -uses - Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI, Classes; - - -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PAnsiChar('php encryption'), PAnsiChar('enabled')); - php_info_print_table_end(); -end; - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -{$IFDEF PHP510} -procedure ex_dec(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure ex_dec(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - FileName : PAnsiChar; - S : TFileStream; - st : string; - i : integer; -begin - FileName := zend_get_executed_filename(TSRMLS_DC); - - S := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); - SetLength(St, S.Size); - S.Read(St[1], S.Size); - S.Free; - i := pos('?>', St); - Delete(St, 1, I + 1); - //Now st contains encrypted string - //encryption is very simple: xor - for i := 1 to length(st) do - if (st[i] <> #10) and (st[i] <> #13) then - st[i] := chr ( ord(st[i]) xor 8); - zend_eval_string(PAnsiChar(st), nil, 'decoded', TSRMLS_DC); -end; - - -var - moduleEntry : Tzend_module_entry; - module_entry_table : array[0..1] of zend_function_entry; - - -function get_module : Pzend_module_entry; cdecl; -begin - if not PHPLoaded then - LoadPHP; - ModuleEntry.size := sizeof(Tzend_module_entry); - ModuleEntry.zend_api := ZEND_MODULE_API_NO; - ModuleEntry.zts := USING_ZTS; - ModuleEntry.Name := 'phpencoder'; - ModuleEntry.version := '0.0'; - ModuleEntry.module_startup_func := @minit; - ModuleEntry.module_shutdown_func := @mshutdown; - ModuleEntry.request_startup_func := @rinit; - ModuleEntry.request_shutdown_func := @rshutdown; - ModuleEntry.info_func := @php_info_module; - Module_entry_table[0].fname := 'ex_dec'; - Module_entry_table[0].handler := @ex_dec; - - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} - ModuleEntry.functions := @module_entry_table[0]; - ModuleEntry._type := MODULE_PERSISTENT; - {$IFDEF PHP530} - {$IFNDEF COMPILER_VC9} - moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ELSE} - moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ENDIF} - {$ENDIF} - - Result := @ModuleEntry; -end; - - - -exports - get_module; - -end. - +library phpencoder; + +{$I PHP.INC} + +uses + Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI, Classes; + + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('php encryption'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +{$IFDEF PHP510} +procedure ex_dec(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure ex_dec(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + FileName : PAnsiChar; + S : TFileStream; + st : string; + i : integer; +begin + FileName := zend_get_executed_filename(TSRMLS_DC); + + S := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); + SetLength(St, S.Size); + S.Read(St[1], S.Size); + S.Free; + i := pos('?>', St); + Delete(St, 1, I + 1); + //Now st contains encrypted string + //encryption is very simple: xor + for i := 1 to length(st) do + if (st[i] <> #10) and (st[i] <> #13) then + st[i] := chr ( ord(st[i]) xor 8); + zend_eval_string(PAnsiChar(st), nil, 'decoded', TSRMLS_DC); +end; + + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..1] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'phpencoder'; + ModuleEntry.version := '0.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + Module_entry_table[0].fname := 'ex_dec'; + Module_entry_table[0].handler := @ex_dec; + + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos/Bonus/PHPEncoder/test.php b/Source/Demos/Bonus/PHPEncoder/test.php similarity index 92% rename from Demos/Bonus/PHPEncoder/test.php rename to Source/Demos/Bonus/PHPEncoder/test.php index f3f0d07..d1edd8b 100644 --- a/Demos/Bonus/PHPEncoder/test.php +++ b/Source/Demos/Bonus/PHPEncoder/test.php @@ -1,5 +1,5 @@ - + x`xafng !3 \ No newline at end of file diff --git a/Demos/Bonus/phpRegistry/Bin/php_registry.dll b/Source/Demos/Bonus/phpRegistry/Bin/php_registry.dll similarity index 100% rename from Demos/Bonus/phpRegistry/Bin/php_registry.dll rename to Source/Demos/Bonus/phpRegistry/Bin/php_registry.dll diff --git a/Demos/Bonus/phpRegistry/php_registry.dpr b/Source/Demos/Bonus/phpRegistry/php_registry.dpr similarity index 96% rename from Demos/Bonus/phpRegistry/php_registry.dpr rename to Source/Demos/Bonus/phpRegistry/php_registry.dpr index 8509823..ef0bd03 100644 --- a/Demos/Bonus/phpRegistry/php_registry.dpr +++ b/Source/Demos/Bonus/phpRegistry/php_registry.dpr @@ -1,646 +1,646 @@ -library php_registry; - -{$I PHP.INC} - -uses - Windows, ZendTypes, ZENDAPI, PHPTypes, PHPAPI; - - const - NAME_HKEY_CLASSES_ROOT = 'HKEY_CLASSES_ROOT'; - NAME_HKEY_CURRENT_USER = 'HKEY_CURRENT_USER'; - NAME_HKEY_LOCAL_MACHINE = 'HKEY_LOCAL_MACHINE'; - NAME_HKEY_USERS = 'HKEY_USERS'; - NAME_HKEY_PERFORMANCE_DATA = 'HKEY_PERFORMANCE_DATA'; - NAME_HKEY_CURRENT_CONFIG = 'HKEY_CURRENT_CONFIG'; - NAME_HKEY_DYN_DATA = 'HKEY_DYN_DATA'; - -function StrLen(const Str: PChar): Cardinal; assembler; -asm - MOV EDX,EDI - MOV EDI,EAX - MOV ECX,0FFFFFFFFH - XOR AL,AL - REPNE SCASB - MOV EAX,0FFFFFFFEH - SUB EAX,ECX - MOV EDI,EDX -end; - -function int2HKEY(i : integer) : HKEY; -begin - case i of - 0 : Result := HKEY_CLASSES_ROOT; - 1 : Result := HKEY_CURRENT_USER; - 2 : Result := HKEY_LOCAL_MACHINE; - 3 : Result := HKEY_USERS; - 4 : Result := HKEY_PERFORMANCE_DATA; - 5 : Result := HKEY_CURRENT_CONFIG; - else - Result := HKEY_DYN_DATA; - end; -end; - - -function RelativeKey(const Key: string): PChar; -begin - Result := PChar(Key); - if (Key <> '') and (Key[1] = '\') then - Inc(Result); -end; - -function RegCreateKey(const RootKey: HKEY; const Key, Value: string): Longint; -begin - Result := RegSetValue(RootKey, RelativeKey(Key), REG_SZ, PChar(Value), Length(Value)); -end; - -function RegDeleteEntry(const RootKey: HKEY; const Key, Name: string): Boolean; -var - RegKey: HKEY; -begin - Result := False; - if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_SET_VALUE, RegKey) = ERROR_SUCCESS then - begin - Result := RegDeleteValue(RegKey, PChar(Name)) = ERROR_SUCCESS; - RegCloseKey(RegKey); - end; -end; - - -function RegDeleteKeyTree(const RootKey: HKEY; const Key: string): Boolean; -var - RegKey: HKEY; - I: DWORD; - Size: DWORD; - NumSubKeys: DWORD; - MaxSubKeyLen: DWORD; - KeyName: string; -begin - Result := RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_ALL_ACCESS, RegKey) = ERROR_SUCCESS; - if Result then - begin - RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, @MaxSubKeyLen, nil, nil, nil, nil, nil, nil); - if NumSubKeys <> 0 then - for I := NumSubKeys-1 downto 0 do - begin - Size := MaxSubKeyLen+1; - SetLength(KeyName, Size); - RegEnumKeyEx(RegKey, I, PChar(KeyName), Size, nil, nil, nil, nil); - SetLength(KeyName, StrLen(PChar(KeyName))); - Result := RegDeleteKeyTree(RootKey, Key + '\' + KeyName); - if not Result then - Break; - end; - RegCloseKey(RegKey); - if Result then - Result := Windows.RegDeleteKey(RootKey, RelativeKey(Key)) = ERROR_SUCCESS; - end -end; - - -function RegReadInteger(const RootKey: HKEY; const Key, Name: string): Integer; -var - RegKey: HKEY; - Size: DWORD; - IntVal: Integer; - RegKind: DWORD; - Ret: Longint; -begin - if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS then - begin - RegKind := 0; - Size := SizeOf(Integer); - Ret := RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, @IntVal, @Size); - RegCloseKey(RegKey); - if Ret = ERROR_SUCCESS then - begin - if RegKind = REG_DWORD then - Result := IntVal - else - Result := -1; - end - else - Result := -1; - end - else - Result := -1; -end; - -function RegReadBool(const RootKey: HKEY; const Key, Name: string): Boolean; -begin - Result := RegReadInteger(RootKey, Key, Name) <> 0; -end; - - -function RegReadString(const RootKey: HKEY; const Key, Name: string): string; -var - RegKey: HKEY; - Size: DWORD; - StrVal: string; - RegKind: DWORD; - Ret: Longint; -begin - Result := ''; - if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS then - begin - RegKind := 0; - Size := 0; - Ret := RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, nil, @Size); - if Ret = ERROR_SUCCESS then - if RegKind in [REG_SZ, REG_EXPAND_SZ] then - begin - SetLength(StrVal, Size); - RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, PByte(StrVal), @Size); - SetLength(StrVal, StrLen(PChar(StrVal))); - Result := StrVal; - end; - RegCloseKey(RegKey); - end; -end; - - -procedure RegWriteInteger(const RootKey: HKEY; const Key, Name: string; Value: Integer); -var - RegKey: HKEY; -begin - if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_SET_VALUE, RegKey) = ERROR_SUCCESS then - begin - RegSetValueEx(RegKey, PChar(Name), 0, REG_DWORD, @Value, SizeOf(Integer)); - RegCloseKey(RegKey); - end -end; - -procedure RegWriteBool(const RootKey: HKEY; const Key, Name: string; Value: Boolean); -begin - RegWriteInteger(RootKey, Key, Name, Ord(Value)); -end; - - -procedure RegWriteString(const RootKey: HKEY; const Key, Name, Value: string); -var - RegKey: HKEY; -begin - if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_SET_VALUE, RegKey) = ERROR_SUCCESS then - begin - RegSetValueEx(RegKey, PChar(Name), 0, REG_SZ, PChar(Value), Length(Value)+1); - RegCloseKey(RegKey); - end -end; - - -function RegHasSubKeys(const RootKey: HKEY; const Key: string): Boolean; -var - RegKey: HKEY; - NumSubKeys: Integer; -begin - Result := False; - if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS then - begin - RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, nil, nil, nil, nil, nil, nil, nil); - Result := NumSubKeys <> 0; - RegCloseKey(RegKey); - end -end; - - -function RegKeyExists(const RootKey: HKEY; const Key: string): Boolean; -var - RegKey: HKEY; -begin - Result := (RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS); - if Result then RegCloseKey(RegKey); -end; - -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PChar('Windows registry support'), PChar('enabled')); - php_info_print_table_end(); -end; - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - zend_register_long_constant(PChar(NAME_HKEY_CLASSES_ROOT), strlen(PChar(NAME_HKEY_CLASSES_ROOT)) + 1, 0, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); - zend_register_long_constant(PChar(NAME_HKEY_CURRENT_USER), strlen(PChar(NAME_HKEY_CURRENT_USER)) + 1, 1, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); - zend_register_long_constant(PChar(NAME_HKEY_LOCAL_MACHINE), strlen(PChar(NAME_HKEY_LOCAL_MACHINE)) + 1, 2, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); - zend_register_long_constant(PChar(NAME_HKEY_USERS), strlen(PChar(NAME_HKEY_USERS)) + 1, 3, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); - zend_register_long_constant(PChar(NAME_HKEY_PERFORMANCE_DATA), strlen(PChar(NAME_HKEY_PERFORMANCE_DATA)) + 1, 4, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); - zend_register_long_constant(PChar(NAME_HKEY_CURRENT_CONFIG), strlen(PChar(NAME_HKEY_CURRENT_CONFIG)) + 1, 5, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); - zend_register_long_constant(PChar(NAME_HKEY_DYN_DATA), strlen(PChar(NAME_HKEY_DYN_DATA)) + 1, 6, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -//function RegCreateKey(const RootKey: HKEY; const Key, Value: string): Longint; -{$IFDEF PHP510} -procedure php_RegCreateKey(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegCreateKey(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -Value : string; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - Value := param[2]^.value.str.val; - ZVAL_LONG(return_value, RegCreateKey(RootKey, Key, Value)); - dispose_pzval_array(param); -end; - - -//function RegDeleteEntry(const RootKey: HKEY; const Key, Name: string): Boolean; -{$IFDEF PHP510} -procedure php_RegDeleteEntry(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegDeleteEntry(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -Name : string; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - Name := param[2]^.value.str.val; - ZVAL_BOOL(return_value, RegDeleteEntry(RootKey, Key, Name)); - dispose_pzval_array(param); -end; - -//function RegDeleteKeyTree(const RootKey: HKEY; const Key: string): Boolean; -{$IFDEF PHP510} -procedure php_RegDeleteKeyTree(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegDeleteKeyTree(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - ZVAL_BOOL(return_value, RegDeleteKeyTree(RootKey, Key)); - dispose_pzval_array(param); -end; - -//function RegReadBool(const RootKey: HKEY; const Key, Name: string): Boolean; -{$IFDEF PHP510} -procedure php_RegReadBool(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegReadBool(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -Name : string; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - Name := param[2]^.value.str.val; - ZVAL_BOOL(return_value, RegReadBool(RootKey, Key, Name)); - dispose_pzval_array(param); -end; - -//function RegReadInteger(const RootKey: HKEY; const Key, Name: string): Integer; -{$IFDEF PHP510} -procedure php_RegReadInteger(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegReadInteger(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -Name : string; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - Name := param[2]^.value.str.val; - ZVAL_LONG(return_value, RegReadInteger(RootKey, Key, Name)); - dispose_pzval_array(param); -end; - -//function RegReadString(const RootKey: HKEY; const Key, Name: string): string; -{$IFDEF PHP510} -procedure php_RegReadString(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegReadString(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - RootKey : HKEY; - Key : string; - Name : string; - param : pzval_array; - st : string; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - Name := param[2]^.value.str.val; - st := regReadString(RootKey, Key, Name); - ZVAL_STRING(return_value, PChar(st), true); - dispose_pzval_array(param); -end; - -//procedure RegWriteBool(const RootKey: HKEY; const Key, Name: string; Value: Boolean); -{$IFDEF PHP510} -procedure php_RegWriteBool(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegWriteBool(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - RootKey : HKEY; - Key : string; - Name : string; - Value : boolean; - param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - Name := param[2]^.value.str.val; - Value := Boolean(param[3]^.value.lval); - RegWriteBool(RootKey, Key, Name, Value); - dispose_pzval_array(param); -end; - -//procedure RegWriteInteger(const RootKey: HKEY; const Key, Name: string; Value: Integer); -{$IFDEF PHP510} -procedure php_RegWriteInteger(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegWriteInteger(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -Name : string; -Value : integer; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - Name := param[2]^.value.str.val; - Value := param[3]^.value.lval; - RegWriteInteger(RootKey, Key, Name, Value); - dispose_pzval_array(param); -end; - -//procedure RegWriteString(const RootKey: HKEY; const Key, Name, Value: string); -{$IFDEF PHP510} -procedure php_RegWriteString(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegWriteString(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -Name : string; -Value : string; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - Name := param[2]^.value.str.val; - Value := param[3]^.value.str.val; - RegWriteString(RootKey, Key, Name, Value); - dispose_pzval_array(param); -end; - -//function RegHasSubKeys(const RootKey: HKEY; const Key: string): Boolean; -{$IFDEF PHP510} -procedure php_RegHasSubKeys(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegHasSubKeys(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - ZVAL_BOOL(return_value, RegHasSubKeys(RootKey, Key)); - dispose_pzval_array(param); -end; - -//function RegKeyExists(const RootKey: HKEY; const Key: string): Boolean; -{$IFDEF PHP510} -procedure php_RegKeyExists(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure php_RegKeyExists(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -RootKey : HKEY; -Key : string; -param : pzval_array; -begin - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - RootKey := Int2HKey(param[0]^.value.lval); - Key := param[1]^.value.str.val; - ZVAL_BOOL(return_value, RegKeyExists(RootKey, Key)); - dispose_pzval_array(param); -end; - -var - moduleEntry : Tzend_module_entry; - module_entry_table : array[0..11] of zend_function_entry; - - -function get_module : Pzend_module_entry; cdecl; -begin - if not PHPLoaded then - LoadPHP; - ModuleEntry.size := sizeof(Tzend_module_entry); - ModuleEntry.zend_api := ZEND_MODULE_API_NO; - ModuleEntry.zts := USING_ZTS; - ModuleEntry.Name := 'php_registry'; - ModuleEntry.version := '1.0'; - ModuleEntry.module_startup_func := @minit; - ModuleEntry.module_shutdown_func := @mshutdown; - ModuleEntry.request_startup_func := @rinit; - ModuleEntry.request_shutdown_func := @rshutdown; - ModuleEntry.info_func := @php_info_module; - - module_entry_table[0].fname := 'regcreatekey'; - module_entry_table[0].handler := @php_regcreatekey; - {$IFDEF PHP4} - module_entry_table[0].func_arg_types := nil; - {$ENDIF} - - module_entry_table[1].fname := 'regdeleteentry'; - module_entry_table[1].handler := @php_regdeleteentry; - {$IFDEF PHP4} - module_entry_table[1].func_arg_types := nil; - {$ENDIF} - - module_entry_table[2].fname := 'regdeletekeytree'; - module_entry_table[2].handler := @php_regdeletekeytree; - {$IFDEF PHP4} - module_entry_table[2].func_arg_types := nil; - {$ENDIF} - - module_entry_table[3].fname := 'reghassubkeys'; - module_entry_table[3].handler := @php_reghassubkeys; - {$IFDEF PHP4} - module_entry_table[3].func_arg_types := nil; - {$ENDIF} - - module_entry_table[4].fname := 'regkeyexists'; - module_entry_table[4].handler := @php_regkeyexists; - {$IFDEF PHP4} - module_entry_table[4].func_arg_types := nil; - {$ENDIF} - - module_entry_table[5].fname := 'regreadbool'; - module_entry_table[5].handler := @php_regreadbool; - {$IFDEF PHP4} - module_entry_table[5].func_arg_types := nil; - {$ENDIF} - - module_entry_table[6].fname := 'regreadinteger'; - module_entry_table[6].handler := @php_regreadinteger; - {$IFDEF PHP4} - module_entry_table[6].func_arg_types := nil; - {$ENDIF} - - module_entry_table[7].fname := 'regreadstring'; - module_entry_table[7].handler := @php_regreadstring; - {$IFDEF PHP4} - module_entry_table[7].func_arg_types := nil; - {$ENDIF} - - module_entry_table[8].fname := 'regwritebool'; - module_entry_table[8].handler := @php_regwritebool; - {$IFDEF PHP4} - module_entry_table[8].func_arg_types := nil; - {$ENDIF} - - module_entry_table[9].fname := 'regwriteinteger'; - module_entry_table[9].handler := @php_regwriteinteger; - {$IFDEF PHP4} - module_entry_table[9].func_arg_types := nil; - {$ENDIF} - - module_entry_table[10].fname := 'regwritestring'; - module_entry_table[10].handler := @php_regwritestring; - {$IFDEF PHP4} - module_entry_table[10].func_arg_types := nil; - {$ENDIF} - - module_entry_table[11].fname := nil; - module_entry_table[11].handler := nil; - {$IFDEF PHP4} - module_entry_table[11].func_arg_types := nil; - {$ENDIF} - - ModuleEntry.functions := @module_entry_table[0]; - ModuleEntry._type := MODULE_PERSISTENT; - - result := @ModuleEntry; -end; - - -exports - get_module; - -end. - +library php_registry; + +{$I PHP.INC} + +uses + Windows, ZendTypes, ZENDAPI, PHPTypes, PHPAPI; + + const + NAME_HKEY_CLASSES_ROOT = 'HKEY_CLASSES_ROOT'; + NAME_HKEY_CURRENT_USER = 'HKEY_CURRENT_USER'; + NAME_HKEY_LOCAL_MACHINE = 'HKEY_LOCAL_MACHINE'; + NAME_HKEY_USERS = 'HKEY_USERS'; + NAME_HKEY_PERFORMANCE_DATA = 'HKEY_PERFORMANCE_DATA'; + NAME_HKEY_CURRENT_CONFIG = 'HKEY_CURRENT_CONFIG'; + NAME_HKEY_DYN_DATA = 'HKEY_DYN_DATA'; + +function StrLen(const Str: PChar): Cardinal; assembler; +asm + MOV EDX,EDI + MOV EDI,EAX + MOV ECX,0FFFFFFFFH + XOR AL,AL + REPNE SCASB + MOV EAX,0FFFFFFFEH + SUB EAX,ECX + MOV EDI,EDX +end; + +function int2HKEY(i : integer) : HKEY; +begin + case i of + 0 : Result := HKEY_CLASSES_ROOT; + 1 : Result := HKEY_CURRENT_USER; + 2 : Result := HKEY_LOCAL_MACHINE; + 3 : Result := HKEY_USERS; + 4 : Result := HKEY_PERFORMANCE_DATA; + 5 : Result := HKEY_CURRENT_CONFIG; + else + Result := HKEY_DYN_DATA; + end; +end; + + +function RelativeKey(const Key: string): PChar; +begin + Result := PChar(Key); + if (Key <> '') and (Key[1] = '\') then + Inc(Result); +end; + +function RegCreateKey(const RootKey: HKEY; const Key, Value: string): Longint; +begin + Result := RegSetValue(RootKey, RelativeKey(Key), REG_SZ, PChar(Value), Length(Value)); +end; + +function RegDeleteEntry(const RootKey: HKEY; const Key, Name: string): Boolean; +var + RegKey: HKEY; +begin + Result := False; + if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_SET_VALUE, RegKey) = ERROR_SUCCESS then + begin + Result := RegDeleteValue(RegKey, PChar(Name)) = ERROR_SUCCESS; + RegCloseKey(RegKey); + end; +end; + + +function RegDeleteKeyTree(const RootKey: HKEY; const Key: string): Boolean; +var + RegKey: HKEY; + I: DWORD; + Size: DWORD; + NumSubKeys: DWORD; + MaxSubKeyLen: DWORD; + KeyName: string; +begin + Result := RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_ALL_ACCESS, RegKey) = ERROR_SUCCESS; + if Result then + begin + RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, @MaxSubKeyLen, nil, nil, nil, nil, nil, nil); + if NumSubKeys <> 0 then + for I := NumSubKeys-1 downto 0 do + begin + Size := MaxSubKeyLen+1; + SetLength(KeyName, Size); + RegEnumKeyEx(RegKey, I, PChar(KeyName), Size, nil, nil, nil, nil); + SetLength(KeyName, StrLen(PChar(KeyName))); + Result := RegDeleteKeyTree(RootKey, Key + '\' + KeyName); + if not Result then + Break; + end; + RegCloseKey(RegKey); + if Result then + Result := Windows.RegDeleteKey(RootKey, RelativeKey(Key)) = ERROR_SUCCESS; + end +end; + + +function RegReadInteger(const RootKey: HKEY; const Key, Name: string): Integer; +var + RegKey: HKEY; + Size: DWORD; + IntVal: Integer; + RegKind: DWORD; + Ret: Longint; +begin + if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS then + begin + RegKind := 0; + Size := SizeOf(Integer); + Ret := RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, @IntVal, @Size); + RegCloseKey(RegKey); + if Ret = ERROR_SUCCESS then + begin + if RegKind = REG_DWORD then + Result := IntVal + else + Result := -1; + end + else + Result := -1; + end + else + Result := -1; +end; + +function RegReadBool(const RootKey: HKEY; const Key, Name: string): Boolean; +begin + Result := RegReadInteger(RootKey, Key, Name) <> 0; +end; + + +function RegReadString(const RootKey: HKEY; const Key, Name: string): string; +var + RegKey: HKEY; + Size: DWORD; + StrVal: string; + RegKind: DWORD; + Ret: Longint; +begin + Result := ''; + if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS then + begin + RegKind := 0; + Size := 0; + Ret := RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, nil, @Size); + if Ret = ERROR_SUCCESS then + if RegKind in [REG_SZ, REG_EXPAND_SZ] then + begin + SetLength(StrVal, Size); + RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, PByte(StrVal), @Size); + SetLength(StrVal, StrLen(PChar(StrVal))); + Result := StrVal; + end; + RegCloseKey(RegKey); + end; +end; + + +procedure RegWriteInteger(const RootKey: HKEY; const Key, Name: string; Value: Integer); +var + RegKey: HKEY; +begin + if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_SET_VALUE, RegKey) = ERROR_SUCCESS then + begin + RegSetValueEx(RegKey, PChar(Name), 0, REG_DWORD, @Value, SizeOf(Integer)); + RegCloseKey(RegKey); + end +end; + +procedure RegWriteBool(const RootKey: HKEY; const Key, Name: string; Value: Boolean); +begin + RegWriteInteger(RootKey, Key, Name, Ord(Value)); +end; + + +procedure RegWriteString(const RootKey: HKEY; const Key, Name, Value: string); +var + RegKey: HKEY; +begin + if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_SET_VALUE, RegKey) = ERROR_SUCCESS then + begin + RegSetValueEx(RegKey, PChar(Name), 0, REG_SZ, PChar(Value), Length(Value)+1); + RegCloseKey(RegKey); + end +end; + + +function RegHasSubKeys(const RootKey: HKEY; const Key: string): Boolean; +var + RegKey: HKEY; + NumSubKeys: Integer; +begin + Result := False; + if RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS then + begin + RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, nil, nil, nil, nil, nil, nil, nil); + Result := NumSubKeys <> 0; + RegCloseKey(RegKey); + end +end; + + +function RegKeyExists(const RootKey: HKEY; const Key: string): Boolean; +var + RegKey: HKEY; +begin + Result := (RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS); + if Result then RegCloseKey(RegKey); +end; + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PChar('Windows registry support'), PChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + zend_register_long_constant(PChar(NAME_HKEY_CLASSES_ROOT), strlen(PChar(NAME_HKEY_CLASSES_ROOT)) + 1, 0, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + zend_register_long_constant(PChar(NAME_HKEY_CURRENT_USER), strlen(PChar(NAME_HKEY_CURRENT_USER)) + 1, 1, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + zend_register_long_constant(PChar(NAME_HKEY_LOCAL_MACHINE), strlen(PChar(NAME_HKEY_LOCAL_MACHINE)) + 1, 2, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + zend_register_long_constant(PChar(NAME_HKEY_USERS), strlen(PChar(NAME_HKEY_USERS)) + 1, 3, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + zend_register_long_constant(PChar(NAME_HKEY_PERFORMANCE_DATA), strlen(PChar(NAME_HKEY_PERFORMANCE_DATA)) + 1, 4, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + zend_register_long_constant(PChar(NAME_HKEY_CURRENT_CONFIG), strlen(PChar(NAME_HKEY_CURRENT_CONFIG)) + 1, 5, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + zend_register_long_constant(PChar(NAME_HKEY_DYN_DATA), strlen(PChar(NAME_HKEY_DYN_DATA)) + 1, 6, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +//function RegCreateKey(const RootKey: HKEY; const Key, Value: string): Longint; +{$IFDEF PHP510} +procedure php_RegCreateKey(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegCreateKey(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +Value : string; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + Value := param[2]^.value.str.val; + ZVAL_LONG(return_value, RegCreateKey(RootKey, Key, Value)); + dispose_pzval_array(param); +end; + + +//function RegDeleteEntry(const RootKey: HKEY; const Key, Name: string): Boolean; +{$IFDEF PHP510} +procedure php_RegDeleteEntry(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegDeleteEntry(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +Name : string; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + Name := param[2]^.value.str.val; + ZVAL_BOOL(return_value, RegDeleteEntry(RootKey, Key, Name)); + dispose_pzval_array(param); +end; + +//function RegDeleteKeyTree(const RootKey: HKEY; const Key: string): Boolean; +{$IFDEF PHP510} +procedure php_RegDeleteKeyTree(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegDeleteKeyTree(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + ZVAL_BOOL(return_value, RegDeleteKeyTree(RootKey, Key)); + dispose_pzval_array(param); +end; + +//function RegReadBool(const RootKey: HKEY; const Key, Name: string): Boolean; +{$IFDEF PHP510} +procedure php_RegReadBool(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegReadBool(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +Name : string; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + Name := param[2]^.value.str.val; + ZVAL_BOOL(return_value, RegReadBool(RootKey, Key, Name)); + dispose_pzval_array(param); +end; + +//function RegReadInteger(const RootKey: HKEY; const Key, Name: string): Integer; +{$IFDEF PHP510} +procedure php_RegReadInteger(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegReadInteger(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +Name : string; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + Name := param[2]^.value.str.val; + ZVAL_LONG(return_value, RegReadInteger(RootKey, Key, Name)); + dispose_pzval_array(param); +end; + +//function RegReadString(const RootKey: HKEY; const Key, Name: string): string; +{$IFDEF PHP510} +procedure php_RegReadString(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegReadString(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + RootKey : HKEY; + Key : string; + Name : string; + param : pzval_array; + st : string; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + Name := param[2]^.value.str.val; + st := regReadString(RootKey, Key, Name); + ZVAL_STRING(return_value, PChar(st), true); + dispose_pzval_array(param); +end; + +//procedure RegWriteBool(const RootKey: HKEY; const Key, Name: string; Value: Boolean); +{$IFDEF PHP510} +procedure php_RegWriteBool(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegWriteBool(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + RootKey : HKEY; + Key : string; + Name : string; + Value : boolean; + param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + Name := param[2]^.value.str.val; + Value := Boolean(param[3]^.value.lval); + RegWriteBool(RootKey, Key, Name, Value); + dispose_pzval_array(param); +end; + +//procedure RegWriteInteger(const RootKey: HKEY; const Key, Name: string; Value: Integer); +{$IFDEF PHP510} +procedure php_RegWriteInteger(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegWriteInteger(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +Name : string; +Value : integer; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + Name := param[2]^.value.str.val; + Value := param[3]^.value.lval; + RegWriteInteger(RootKey, Key, Name, Value); + dispose_pzval_array(param); +end; + +//procedure RegWriteString(const RootKey: HKEY; const Key, Name, Value: string); +{$IFDEF PHP510} +procedure php_RegWriteString(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegWriteString(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +Name : string; +Value : string; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + Name := param[2]^.value.str.val; + Value := param[3]^.value.str.val; + RegWriteString(RootKey, Key, Name, Value); + dispose_pzval_array(param); +end; + +//function RegHasSubKeys(const RootKey: HKEY; const Key: string): Boolean; +{$IFDEF PHP510} +procedure php_RegHasSubKeys(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegHasSubKeys(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + ZVAL_BOOL(return_value, RegHasSubKeys(RootKey, Key)); + dispose_pzval_array(param); +end; + +//function RegKeyExists(const RootKey: HKEY; const Key: string): Boolean; +{$IFDEF PHP510} +procedure php_RegKeyExists(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure php_RegKeyExists(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +RootKey : HKEY; +Key : string; +param : pzval_array; +begin + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + RootKey := Int2HKey(param[0]^.value.lval); + Key := param[1]^.value.str.val; + ZVAL_BOOL(return_value, RegKeyExists(RootKey, Key)); + dispose_pzval_array(param); +end; + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..11] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'php_registry'; + ModuleEntry.version := '1.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + + module_entry_table[0].fname := 'regcreatekey'; + module_entry_table[0].handler := @php_regcreatekey; + {$IFDEF PHP4} + module_entry_table[0].func_arg_types := nil; + {$ENDIF} + + module_entry_table[1].fname := 'regdeleteentry'; + module_entry_table[1].handler := @php_regdeleteentry; + {$IFDEF PHP4} + module_entry_table[1].func_arg_types := nil; + {$ENDIF} + + module_entry_table[2].fname := 'regdeletekeytree'; + module_entry_table[2].handler := @php_regdeletekeytree; + {$IFDEF PHP4} + module_entry_table[2].func_arg_types := nil; + {$ENDIF} + + module_entry_table[3].fname := 'reghassubkeys'; + module_entry_table[3].handler := @php_reghassubkeys; + {$IFDEF PHP4} + module_entry_table[3].func_arg_types := nil; + {$ENDIF} + + module_entry_table[4].fname := 'regkeyexists'; + module_entry_table[4].handler := @php_regkeyexists; + {$IFDEF PHP4} + module_entry_table[4].func_arg_types := nil; + {$ENDIF} + + module_entry_table[5].fname := 'regreadbool'; + module_entry_table[5].handler := @php_regreadbool; + {$IFDEF PHP4} + module_entry_table[5].func_arg_types := nil; + {$ENDIF} + + module_entry_table[6].fname := 'regreadinteger'; + module_entry_table[6].handler := @php_regreadinteger; + {$IFDEF PHP4} + module_entry_table[6].func_arg_types := nil; + {$ENDIF} + + module_entry_table[7].fname := 'regreadstring'; + module_entry_table[7].handler := @php_regreadstring; + {$IFDEF PHP4} + module_entry_table[7].func_arg_types := nil; + {$ENDIF} + + module_entry_table[8].fname := 'regwritebool'; + module_entry_table[8].handler := @php_regwritebool; + {$IFDEF PHP4} + module_entry_table[8].func_arg_types := nil; + {$ENDIF} + + module_entry_table[9].fname := 'regwriteinteger'; + module_entry_table[9].handler := @php_regwriteinteger; + {$IFDEF PHP4} + module_entry_table[9].func_arg_types := nil; + {$ENDIF} + + module_entry_table[10].fname := 'regwritestring'; + module_entry_table[10].handler := @php_regwritestring; + {$IFDEF PHP4} + module_entry_table[10].func_arg_types := nil; + {$ENDIF} + + module_entry_table[11].fname := nil; + module_entry_table[11].handler := nil; + {$IFDEF PHP4} + module_entry_table[11].func_arg_types := nil; + {$ENDIF} + + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + + result := @ModuleEntry; +end; + + +exports + get_module; + +end. + diff --git a/Demos/Bonus/phpRegistry/php_registry.dproj b/Source/Demos/Bonus/phpRegistry/php_registry.dproj similarity index 100% rename from Demos/Bonus/phpRegistry/php_registry.dproj rename to Source/Demos/Bonus/phpRegistry/php_registry.dproj diff --git a/Demos/Bonus/phpRegistry/php_registry.dproj.local b/Source/Demos/Bonus/phpRegistry/php_registry.dproj.local similarity index 100% rename from Demos/Bonus/phpRegistry/php_registry.dproj.local rename to Source/Demos/Bonus/phpRegistry/php_registry.dproj.local diff --git a/Demos/Bonus/phpRegistry/php_registry.identcache b/Source/Demos/Bonus/phpRegistry/php_registry.identcache similarity index 100% rename from Demos/Bonus/phpRegistry/php_registry.identcache rename to Source/Demos/Bonus/phpRegistry/php_registry.identcache diff --git a/Demos/Bonus/phpRegistry/php_registry.stat b/Source/Demos/Bonus/phpRegistry/php_registry.stat similarity index 100% rename from Demos/Bonus/phpRegistry/php_registry.stat rename to Source/Demos/Bonus/phpRegistry/php_registry.stat diff --git a/Demos/Bonus/wincon/Bin/php_wincon.dll b/Source/Demos/Bonus/wincon/Bin/php_wincon.dll similarity index 100% rename from Demos/Bonus/wincon/Bin/php_wincon.dll rename to Source/Demos/Bonus/wincon/Bin/php_wincon.dll diff --git a/Demos/Bonus/wincon/test_wincon.php b/Source/Demos/Bonus/wincon/Bin/test_wincon.php similarity index 100% rename from Demos/Bonus/wincon/test_wincon.php rename to Source/Demos/Bonus/wincon/Bin/test_wincon.php diff --git a/Demos/Bonus/wincon/php_wincon.h b/Source/Demos/Bonus/wincon/php_wincon.h similarity index 96% rename from Demos/Bonus/wincon/php_wincon.h rename to Source/Demos/Bonus/wincon/php_wincon.h index 23ef163..c1c372c 100644 --- a/Demos/Bonus/wincon/php_wincon.h +++ b/Source/Demos/Bonus/wincon/php_wincon.h @@ -1,59 +1,59 @@ -#ifndef PHP_WINCON_H -#define PHP_WINCON_H - -extern zend_module_entry extname_module_entry; -#define phpext_extname_ptr &extname_module_entry - -#ifdef PHP_WIN32 -#define PHP_WINCON_API __declspec(dllexport) -#else -#define PHP_WINCON_API -#endif - -#ifdef ZTS -#include "TSRM.h" -#endif - -PHP_MINIT_FUNCTION(wincon); -PHP_MSHUTDOWN_FUNCTION(wincon); -PHP_RINIT_FUNCTION(wincon); -PHP_RSHUTDOWN_FUNCTION(wincon); -PHP_MINFO_FUNCTION(wincon); - -PHP_FUNCTION(allocconsole); -PHP_FUNCTION(createconsolescreenbuffer); -PHP_FUNCTION(fillconsoleoutputattribute); -PHP_FUNCTION(getstdhandle); -PHP_FUNCTION(setconsoletitle); -PHP_FUNCTION(readconsole); -PHP_FUNCTION(flushconsoleinputbuffer); -PHP_FUNCTION(freeconsole); -PHP_FUNCTION(generateconsolectrlevent); -PHP_FUNCTION(getconsolecp); -PHP_FUNCTION(getconsolecursorsize); -PHP_FUNCTION(getconsolecursorvisible); -PHP_FUNCTION(getconsolemode); -PHP_FUNCTION(getconsoleoutputcp); -PHP_FUNCTION(getconsolescreenbufferinfo); -PHP_FUNCTION(getconsoletitle); -PHP_FUNCTION(getnumberofconsoleinputevents); -PHP_FUNCTION(setconsolecp); -PHP_FUNCTION(writeconsole); -PHP_FUNCTION(setconsoletextattribute); -PHP_FUNCTION(setconsoleoutputcp); -PHP_FUNCTION(setstdhandle); -PHP_FUNCTION(setconsolemode); -PHP_FUNCTION(setconsolecursorposition); -PHP_FUNCTION(setconsolecursorinfo); -PHP_FUNCTION(writeconsoleoutputcharacter); - - - -#ifdef ZTS -#define EXTNAME_G(v) TSRMG(wincon_globals_id, zend_wincon_globals *, v) -#else -#define EXTNAME_G(v) (wincon_globals.v) -#endif - -#endif /* PHP_WINCON_H */ - +#ifndef PHP_WINCON_H +#define PHP_WINCON_H + +extern zend_module_entry extname_module_entry; +#define phpext_extname_ptr &extname_module_entry + +#ifdef PHP_WIN32 +#define PHP_WINCON_API __declspec(dllexport) +#else +#define PHP_WINCON_API +#endif + +#ifdef ZTS +#include "TSRM.h" +#endif + +PHP_MINIT_FUNCTION(wincon); +PHP_MSHUTDOWN_FUNCTION(wincon); +PHP_RINIT_FUNCTION(wincon); +PHP_RSHUTDOWN_FUNCTION(wincon); +PHP_MINFO_FUNCTION(wincon); + +PHP_FUNCTION(allocconsole); +PHP_FUNCTION(createconsolescreenbuffer); +PHP_FUNCTION(fillconsoleoutputattribute); +PHP_FUNCTION(getstdhandle); +PHP_FUNCTION(setconsoletitle); +PHP_FUNCTION(readconsole); +PHP_FUNCTION(flushconsoleinputbuffer); +PHP_FUNCTION(freeconsole); +PHP_FUNCTION(generateconsolectrlevent); +PHP_FUNCTION(getconsolecp); +PHP_FUNCTION(getconsolecursorsize); +PHP_FUNCTION(getconsolecursorvisible); +PHP_FUNCTION(getconsolemode); +PHP_FUNCTION(getconsoleoutputcp); +PHP_FUNCTION(getconsolescreenbufferinfo); +PHP_FUNCTION(getconsoletitle); +PHP_FUNCTION(getnumberofconsoleinputevents); +PHP_FUNCTION(setconsolecp); +PHP_FUNCTION(writeconsole); +PHP_FUNCTION(setconsoletextattribute); +PHP_FUNCTION(setconsoleoutputcp); +PHP_FUNCTION(setstdhandle); +PHP_FUNCTION(setconsolemode); +PHP_FUNCTION(setconsolecursorposition); +PHP_FUNCTION(setconsolecursorinfo); +PHP_FUNCTION(writeconsoleoutputcharacter); + + + +#ifdef ZTS +#define EXTNAME_G(v) TSRMG(wincon_globals_id, zend_wincon_globals *, v) +#else +#define EXTNAME_G(v) (wincon_globals.v) +#endif + +#endif /* PHP_WINCON_H */ + diff --git a/Demos/Bonus/wincon/resource.h b/Source/Demos/Bonus/wincon/resource.h similarity index 96% rename from Demos/Bonus/wincon/resource.h rename to Source/Demos/Bonus/wincon/resource.h index 8f85267..7af6201 100644 --- a/Demos/Bonus/wincon/resource.h +++ b/Source/Demos/Bonus/wincon/resource.h @@ -1,14 +1,14 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by wincon.rc - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by wincon.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Demos/Bonus/wincon/Bin/test_wincon.php b/Source/Demos/Bonus/wincon/test_wincon.php similarity index 97% rename from Demos/Bonus/wincon/Bin/test_wincon.php rename to Source/Demos/Bonus/wincon/test_wincon.php index 175df4d..3967338 100644 --- a/Demos/Bonus/wincon/Bin/test_wincon.php +++ b/Source/Demos/Bonus/wincon/test_wincon.php @@ -1,13 +1,13 @@ - + diff --git a/Demos/Bonus/wincon/wincon.c b/Source/Demos/Bonus/wincon/wincon.c similarity index 96% rename from Demos/Bonus/wincon/wincon.c rename to Source/Demos/Bonus/wincon/wincon.c index 0c371f9..383ba1f 100644 --- a/Demos/Bonus/wincon/wincon.c +++ b/Source/Demos/Bonus/wincon/wincon.c @@ -1,666 +1,666 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" -#include "php_ini.h" -#include "ext/standard/info.h" -#include "php_wincon.h" -#include -#include "zend_alloc.h" - - -/* True global resources - no need for thread safety here */ -static int le_wincon; - -/* {{{ wincon_functions[] - * - * Every user visible function must have an entry in wincon_functions[]. - */ -function_entry wincon_functions[] = { - PHP_FE(allocconsole, NULL) - PHP_FE(createconsolescreenbuffer, NULL) - PHP_FE(fillconsoleoutputattribute, NULL) - PHP_FE(getstdhandle, NULL) - PHP_FE(setconsoletitle, NULL) - PHP_FE(readconsole, NULL) - PHP_FE(flushconsoleinputbuffer, NULL) - PHP_FE(freeconsole, NULL) - PHP_FE(generateconsolectrlevent, NULL) - PHP_FE(getconsolecp, NULL) - PHP_FE(getconsolecursorsize, NULL) - PHP_FE(getconsolecursorvisible, NULL) - PHP_FE(getconsolemode, NULL) - PHP_FE(getconsoleoutputcp, NULL) - PHP_FE(getconsolescreenbufferinfo, NULL) - PHP_FE(getconsoletitle, NULL) - PHP_FE(getnumberofconsoleinputevents, NULL) - PHP_FE(setconsolecp, NULL) - PHP_FE(setconsoletextattribute, NULL) - PHP_FE(writeconsole, NULL) - PHP_FE(setconsoleoutputcp, NULL) - PHP_FE(setstdhandle, NULL) - PHP_FE(setconsolemode, NULL) - PHP_FE(setconsolecursorposition, NULL) - PHP_FE(setconsolecursorinfo, NULL) - PHP_FE(writeconsoleoutputcharacter, NULL) - {NULL, NULL, NULL} -}; -/* }}} */ - -/* {{{ wincon_module_entry - */ -zend_module_entry wincon_module_entry = { -#if ZEND_MODULE_API_NO >= 20010901 - STANDARD_MODULE_HEADER, -#endif - "php_wincon", - wincon_functions, - PHP_MINIT(wincon), - PHP_MSHUTDOWN(wincon), - PHP_RINIT(wincon), - PHP_RSHUTDOWN(wincon), - PHP_MINFO(wincon), -#if ZEND_MODULE_API_NO >= 20010901 - "1.1", -#endif - STANDARD_MODULE_PROPERTIES -}; -/* }}} */ - -#ifdef COMPILE_DL_WINCON -ZEND_GET_MODULE(wincon) -#endif - - - -/* {{{ PHP_MINIT_FUNCTION - */ -PHP_MINIT_FUNCTION(wincon) -{ - REGISTER_LONG_CONSTANT("STD_INPUT_HANDLE", STD_INPUT_HANDLE, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STD_OUTPUT_HANDLE", STD_OUTPUT_HANDLE, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STD_ERROR_HANDLE", STD_ERROR_HANDLE, CONST_CS|CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("CTRL_C_EVENT", CTRL_C_EVENT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("CTRL_BREAK_EVENT", CTRL_BREAK_EVENT, CONST_CS|CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("ENABLE_LINE_INPUT", ENABLE_LINE_INPUT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ENABLE_ECHO_INPUT", ENABLE_ECHO_INPUT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ENABLE_PROCESSED_INPUT", ENABLE_PROCESSED_INPUT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ENABLE_WINDOW_INPUT", ENABLE_WINDOW_INPUT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ENABLE_MOUSE_INPUT", ENABLE_MOUSE_INPUT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ENABLE_PROCESSED_OUTPUT", ENABLE_PROCESSED_OUTPUT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ENABLE_WRAP_AT_EOL_OUTPUT", ENABLE_WRAP_AT_EOL_OUTPUT, CONST_CS|CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("BACKGROUND_BLUE", BACKGROUND_BLUE, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("FOREGROUND_BLUE", FOREGROUND_BLUE, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("BACKGROUND_GREEN", BACKGROUND_GREEN, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("FOREGROUND_GREEN", FOREGROUND_GREEN, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("BACKGROUND_RED", BACKGROUND_RED, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("FOREGROUND_RED", FOREGROUND_RED, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("BACKGROUND_INTENSITY", BACKGROUND_INTENSITY, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("FOREGROUND_INTENSITY", FOREGROUND_INTENSITY, CONST_CS|CONST_PERSISTENT); - - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_MSHUTDOWN_FUNCTION - */ -PHP_MSHUTDOWN_FUNCTION(wincon) -{ - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_RINIT_FUNCTION - */ -PHP_RINIT_FUNCTION(wincon) -{ - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_RSHUTDOWN_FUNCTION - */ -PHP_RSHUTDOWN_FUNCTION(wincon) -{ - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_MINFO_FUNCTION - */ -PHP_MINFO_FUNCTION(wincon) -{ - php_info_print_table_start(); - php_info_print_table_header(2, "Windows console support", "enabled"); - php_info_print_table_end(); - - /* Remove comments if you have entries in php.ini - DISPLAY_INI_ENTRIES(); - */ -} -/* }}} */ - - - -/* {{{ proto bool AllocConsole(void) - */ -PHP_FUNCTION(allocconsole) -{ - RETURN_BOOL(AllocConsole()); -} - -/* {{{ proto long createconsolescreenbuffer(int desiredaccess; int sharemode; int flags) - */ -PHP_FUNCTION(createconsolescreenbuffer) -{ - zval **desiredaccess; - zval **sharemode; - zval **flags; - long ret; - int ac = ZEND_NUM_ARGS(); - - if (ac != 2 || zend_get_parameters_ex(ac, &desiredaccess, &sharemode, &flags) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(desiredaccess); - convert_to_long_ex(sharemode); - convert_to_long_ex(flags); - - ret = (long)CreateConsoleScreenBuffer(Z_LVAL_PP(desiredaccess), Z_LVAL_PP(sharemode), NULL, Z_LVAL_PP(flags), NULL); - RETURN_LONG(ret); -} - -/* {{{ proto bool fillconsoleoutputattribute(int consoleoutput, int attribute, int len, int x, int y) - */ -PHP_FUNCTION(fillconsoleoutputattribute) -{ - zval **consoleoutput; - zval **attribute; - zval **len; - zval **x; - zval **y; - DWORD dw; - - COORD coord; - - int ac = ZEND_NUM_ARGS(); - - if (ac != 5 || zend_get_parameters_ex(ac, &consoleoutput, &attribute, &len, &x, &y) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleoutput); - convert_to_long_ex(attribute); - convert_to_long_ex(len); - convert_to_long_ex(x); - convert_to_long_ex(y); - - coord.X = (short)Z_LVAL_PP(x); - coord.Y = (short)Z_LVAL_PP(y); - RETURN_BOOL(FillConsoleOutputAttribute((HANDLE)Z_LVAL_PP(consoleoutput), (WORD)Z_LVAL_PP(attribute), Z_LVAL_PP(len), coord, &dw)); - -} - -/* {{{ proto long getstdhandle(int stdhandle) - */ -PHP_FUNCTION(getstdhandle) -{ - zval **stdhandle; - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &stdhandle) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(stdhandle); - RETURN_LONG((long)GetStdHandle(Z_LVAL_PP(stdhandle))); -} - -/* {{{ proto bool setconsoletitle(string title) - */ -PHP_FUNCTION(setconsoletitle) -{ - zval **title; - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &title) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_string_ex(title); - RETURN_BOOL(SetConsoleTitle(Z_STRVAL_PP(title))); -} - - -/* {{{ proto string readconsole(int consoleinput, int buflen) - */ -PHP_FUNCTION(readconsole) -{ - char *buffer; - DWORD buflen; - zval **zbuflen; - zval **consoleinput; - DWORD cr; - int ac = ZEND_NUM_ARGS(); - - if (ac != 2 || zend_get_parameters_ex(ac, &consoleinput, &zbuflen) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(zbuflen); - convert_to_long_ex(consoleinput); - buflen = (DWORD)Z_LVAL_PP(zbuflen); - buffer = emalloc(buflen); - ReadConsole( (HANDLE)Z_LVAL_PP(consoleinput), buffer, buflen, &cr, NULL); - ZVAL_STRING(return_value, buffer, TRUE); - efree(buffer); -} - - -/* {{{ proto bool flushconsoleinputbuffer(int consoleinput) - */ -PHP_FUNCTION(flushconsoleinputbuffer) -{ - zval **consoleinput; - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &consoleinput) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleinput); - RETURN_BOOL(FlushConsoleInputBuffer((HANDLE)Z_LVAL_PP(consoleinput))); - -} - - -/* {{{ proto bool freeconsole(void) - */ -PHP_FUNCTION(freeconsole) -{ - RETURN_BOOL(FreeConsole()); -} - - -/* {{{ proto bool generateconsolectrlevent(int ctrlevent, int processgroupid) - */ -PHP_FUNCTION(generateconsolectrlevent) -{ - zval **ctrlevent; - zval **processgroupid; - int ac = ZEND_NUM_ARGS(); - - if (ac != 2 || zend_get_parameters_ex(ac, &ctrlevent, &processgroupid) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(ctrlevent); - convert_to_long_ex(processgroupid); - - RETURN_BOOL(GenerateConsoleCtrlEvent(Z_LVAL_PP(ctrlevent), Z_LVAL_PP(processgroupid))); -} - - -/* {{{ proto int getconsolecp(void) - */ -PHP_FUNCTION(getconsolecp) -{ - RETURN_LONG(GetConsoleCP()); -} - - -/* {{{ proto long getconsolecursorsize(int consoleoutput) - */ -PHP_FUNCTION(getconsolecursorsize) -{ - zval **consoleoutput; - CONSOLE_CURSOR_INFO cursorinfo; - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &consoleoutput) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleoutput); - GetConsoleCursorInfo((HANDLE)Z_LVAL_PP(consoleoutput), &cursorinfo); - - RETURN_LONG(cursorinfo.dwSize); -} - - -/* {{{ proto bool getconsolecursorvisible(int consoleoutput) - */ -PHP_FUNCTION(getconsolecursorvisible) -{ - zval **consoleoutput; - CONSOLE_CURSOR_INFO cursorinfo; - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &consoleoutput) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleoutput); - GetConsoleCursorInfo((HANDLE)Z_LVAL_PP(consoleoutput), &cursorinfo); - RETURN_BOOL(cursorinfo.bVisible); -} - - -/* {{{ proto int getconsolemode(int consolehandle) - */ -PHP_FUNCTION(getconsolemode) -{ - zval **consolehandle; - DWORD flags; - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &consolehandle) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consolehandle); - GetConsoleMode((HANDLE)Z_LVAL_PP(consolehandle), &flags); - RETURN_LONG(flags); -} - - -/* {{{ proto int getconsoleoutputcp(void) - */ -PHP_FUNCTION(getconsoleoutputcp) -{ - RETURN_LONG(GetConsoleOutputCP()); -} - - -/* {{{ proto array getconsolescreenbufferinfo(int consoleoutput) - */ -PHP_FUNCTION(getconsolescreenbufferinfo) -{ - - zval **consoleoutput; - zval *size; - zval *cursorposition; - zval *srwindow; - zval *maxwinsize; - - CONSOLE_SCREEN_BUFFER_INFO bufferinfo; - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &consoleoutput) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleoutput); - GetConsoleScreenBufferInfo((HANDLE)Z_LVAL_PP(consoleoutput), &bufferinfo); - array_init(return_value); - - MAKE_STD_ZVAL(size); - MAKE_STD_ZVAL(cursorposition); - MAKE_STD_ZVAL(srwindow); - MAKE_STD_ZVAL(maxwinsize); - - array_init(size); - array_init(cursorposition); - array_init(srwindow); - array_init(maxwinsize); - - add_assoc_long(size, "x", bufferinfo.dwSize.X); - add_assoc_long(size, "y", bufferinfo.dwSize.Y); - - add_assoc_long(cursorposition, "x", bufferinfo.dwCursorPosition.X); - add_assoc_long(cursorposition, "y", bufferinfo.dwCursorPosition.Y); - - add_assoc_zval(return_value, "dwsize", size); - add_assoc_zval(return_value, "dwcursorposition", cursorposition); - - add_assoc_long(return_value, "wattributes", bufferinfo.wAttributes); - - add_assoc_long(srwindow, "left", bufferinfo.srWindow.Left); - add_assoc_long(srwindow, "top", bufferinfo.srWindow.Top); - add_assoc_long(srwindow, "right", bufferinfo.srWindow.Right); - add_assoc_long(srwindow, "bottom", bufferinfo.srWindow.Bottom); - - add_assoc_zval(return_value, "srwindow", srwindow); - - - add_assoc_long(maxwinsize, "x", bufferinfo.dwMaximumWindowSize.X); - add_assoc_long(maxwinsize, "y", bufferinfo.dwMaximumWindowSize.Y); - - add_assoc_zval(return_value, "dwmaximumwindowsize", maxwinsize); - -} - - -/* {{{ proto string getconsoletitle(int buflen) - */ -PHP_FUNCTION(getconsoletitle) -{ - char *buffer; - DWORD buflen; - zval **zbuflen; - - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &zbuflen) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(zbuflen); - - buflen = (DWORD)Z_LVAL_PP(zbuflen); - buffer = emalloc(buflen); - GetConsoleTitle(buffer, buflen); - ZVAL_STRING(return_value, buffer, TRUE); - efree(buffer); - -} - - -/* {{{ proto int getnumberofconsoleevents(int consoleinput) - */ -PHP_FUNCTION(getnumberofconsoleinputevents) -{ - zval **consoleinput; - DWORD numberofevents; - - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &consoleinput) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleinput); - - GetNumberOfConsoleInputEvents((HANDLE)Z_LVAL_PP(consoleinput), &numberofevents); - RETURN_LONG(numberofevents); -} - -/* {{{ proto bool setconsolecp(int codepage) - */ -PHP_FUNCTION(setconsolecp) -{ - zval **codepage; - int ac = ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &codepage) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(codepage); - RETURN_BOOL(SetConsoleCP(Z_LVAL_PP(codepage))); - -} - - -/* {{{ proto bool writeconsole(int consoleoutput, string str) - */ -PHP_FUNCTION(writeconsole) -{ - zval **consoleoutput; - zval **str; - DWORD nNumberOfCharsToWrite; // number of characters to write - DWORD NumberOfCharsWritten; // number of characters written - int ac = ZEND_NUM_ARGS(); - - if (ac != 2 || zend_get_parameters_ex(ac, &consoleoutput, &str) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long_ex(consoleoutput); - convert_to_string_ex(str); - nNumberOfCharsToWrite = Z_STRLEN_PP(str); - RETURN_BOOL(WriteConsole((HANDLE)Z_LVAL_PP(consoleoutput), Z_STRVAL_PP(str), nNumberOfCharsToWrite, &NumberOfCharsWritten, NULL)); - -} - -/* {{{ proto bool setconsoleattribute(int consoleoutput int attributes) - */ -PHP_FUNCTION(setconsoletextattribute) -{ - zval **consoleoutput; - zval **attributes; - int ac = ZEND_NUM_ARGS(); - - if (ac != 2 || zend_get_parameters_ex(ac, &consoleoutput, &attributes) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long_ex(consoleoutput); - convert_to_long_ex(attributes); - RETURN_BOOL(SetConsoleTextAttribute((HANDLE)Z_LVAL_PP(consoleoutput), (WORD)Z_LVAL_PP(attributes))); -} - - -/* {{{ proto bool setconsoleoutputcp(int codepageid) - */ -PHP_FUNCTION(setconsoleoutputcp) -{ - zval **codepageid; - int ac=ZEND_NUM_ARGS(); - - if (ac != 1 || zend_get_parameters_ex(ac, &codepageid) == FAILURE) { - WRONG_PARAM_COUNT; - } - RETURN_BOOL(SetConsoleOutputCP(Z_LVAL_PP(codepageid))); -} - - -/* {{{ proto bool setstdhandle(int stdhandle, int hHandle) - */ -PHP_FUNCTION(setstdhandle) -{ - zval **stdhandle; - zval **hHandle; - - int ac = ZEND_NUM_ARGS(); - - if (ac != 2 || zend_get_parameters_ex(ac, &stdhandle, &hHandle) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long_ex(stdhandle); - convert_to_long_ex(hHandle); - RETURN_BOOL(SetStdHandle(Z_LVAL_PP(stdhandle), (HANDLE)Z_LVAL_PP(hHandle))); -} - -/* {{{ proto bool setconsolemode(int consolehandle, int mode) - */ -PHP_FUNCTION(setconsolemode) -{ - zval **consolehandle; - zval **mode; - int ac = ZEND_NUM_ARGS(); - - if (ac != 2 || zend_get_parameters_ex(ac, &consolehandle, &mode) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long_ex(consolehandle); - convert_to_long_ex(mode); - RETURN_BOOL(SetConsoleMode((HANDLE)Z_LVAL_PP(consolehandle), Z_LVAL_PP(mode))); -} - -/* {{{ proto bool setconsolecursorposition(int consoleoutput, int x, int y) - */ -PHP_FUNCTION(setconsolecursorposition) -{ - zval **consoleoutput; - zval **x; - zval **y; - COORD coord; - int ac = ZEND_NUM_ARGS(); - - if (ac != 3 || zend_get_parameters_ex(ac, &consoleoutput, &x, &y) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleoutput); - convert_to_long_ex(x); - convert_to_long_ex(y); - coord.X = (short)Z_LVAL_PP(x); - coord.Y = (short)Z_LVAL_PP(y); - RETURN_BOOL(SetConsoleCursorPosition((HANDLE)Z_LVAL_PP(consoleoutput), coord)); -} - -/* {{{ proto bool setconsolecursorinfo(int consoleoutput, int size, bool visible) - */ -PHP_FUNCTION(setconsolecursorinfo) -{ - zval **consoleoutput; - zval **size; - zval **visible; - CONSOLE_CURSOR_INFO cursorinfo; - int ac = ZEND_NUM_ARGS(); - - if (ac != 3 || zend_get_parameters_ex(ac, &consoleoutput, &size, &visible) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleoutput); - convert_to_long_ex(size); - convert_to_boolean_ex(visible); - cursorinfo.dwSize = Z_LVAL_PP(size); - cursorinfo.bVisible = Z_BVAL_PP(visible); - RETURN_BOOL(SetConsoleCursorInfo((HANDLE)Z_LVAL_PP(consoleoutput), &cursorinfo)); -} - -/* {{{ proto bool writeconsoleoutputcharacter(int consoleoutput, string arg, int x, int y) - */ -PHP_FUNCTION(writeconsoleoutputcharacter) -{ - zval **consoleoutput; - zval **characters; - zval **x; - zval **y; - COORD coord; - int n; - int len; - - int ac = ZEND_NUM_ARGS(); - - if (ac != 4 || zend_get_parameters_ex(ac, &consoleoutput, &characters, &x, &y) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(consoleoutput); - convert_to_long_ex(x); - convert_to_long_ex(y); - convert_to_string_ex(characters); - len = Z_STRLEN_PP(characters); - coord.X = (short)Z_LVAL_PP(x); - coord.Y = (short)Z_LVAL_PP(y); - RETURN_BOOL(WriteConsoleOutputCharacter((HANDLE)Z_LVAL_PP(consoleoutput), Z_STRVAL_PP(characters), len, coord, &n)); -} - -/* }}} */ - - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" +#include "php_wincon.h" +#include +#include "zend_alloc.h" + + +/* True global resources - no need for thread safety here */ +static int le_wincon; + +/* {{{ wincon_functions[] + * + * Every user visible function must have an entry in wincon_functions[]. + */ +function_entry wincon_functions[] = { + PHP_FE(allocconsole, NULL) + PHP_FE(createconsolescreenbuffer, NULL) + PHP_FE(fillconsoleoutputattribute, NULL) + PHP_FE(getstdhandle, NULL) + PHP_FE(setconsoletitle, NULL) + PHP_FE(readconsole, NULL) + PHP_FE(flushconsoleinputbuffer, NULL) + PHP_FE(freeconsole, NULL) + PHP_FE(generateconsolectrlevent, NULL) + PHP_FE(getconsolecp, NULL) + PHP_FE(getconsolecursorsize, NULL) + PHP_FE(getconsolecursorvisible, NULL) + PHP_FE(getconsolemode, NULL) + PHP_FE(getconsoleoutputcp, NULL) + PHP_FE(getconsolescreenbufferinfo, NULL) + PHP_FE(getconsoletitle, NULL) + PHP_FE(getnumberofconsoleinputevents, NULL) + PHP_FE(setconsolecp, NULL) + PHP_FE(setconsoletextattribute, NULL) + PHP_FE(writeconsole, NULL) + PHP_FE(setconsoleoutputcp, NULL) + PHP_FE(setstdhandle, NULL) + PHP_FE(setconsolemode, NULL) + PHP_FE(setconsolecursorposition, NULL) + PHP_FE(setconsolecursorinfo, NULL) + PHP_FE(writeconsoleoutputcharacter, NULL) + {NULL, NULL, NULL} +}; +/* }}} */ + +/* {{{ wincon_module_entry + */ +zend_module_entry wincon_module_entry = { +#if ZEND_MODULE_API_NO >= 20010901 + STANDARD_MODULE_HEADER, +#endif + "php_wincon", + wincon_functions, + PHP_MINIT(wincon), + PHP_MSHUTDOWN(wincon), + PHP_RINIT(wincon), + PHP_RSHUTDOWN(wincon), + PHP_MINFO(wincon), +#if ZEND_MODULE_API_NO >= 20010901 + "1.1", +#endif + STANDARD_MODULE_PROPERTIES +}; +/* }}} */ + +#ifdef COMPILE_DL_WINCON +ZEND_GET_MODULE(wincon) +#endif + + + +/* {{{ PHP_MINIT_FUNCTION + */ +PHP_MINIT_FUNCTION(wincon) +{ + REGISTER_LONG_CONSTANT("STD_INPUT_HANDLE", STD_INPUT_HANDLE, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STD_OUTPUT_HANDLE", STD_OUTPUT_HANDLE, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STD_ERROR_HANDLE", STD_ERROR_HANDLE, CONST_CS|CONST_PERSISTENT); + + REGISTER_LONG_CONSTANT("CTRL_C_EVENT", CTRL_C_EVENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTRL_BREAK_EVENT", CTRL_BREAK_EVENT, CONST_CS|CONST_PERSISTENT); + + REGISTER_LONG_CONSTANT("ENABLE_LINE_INPUT", ENABLE_LINE_INPUT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ENABLE_ECHO_INPUT", ENABLE_ECHO_INPUT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ENABLE_PROCESSED_INPUT", ENABLE_PROCESSED_INPUT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ENABLE_WINDOW_INPUT", ENABLE_WINDOW_INPUT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ENABLE_MOUSE_INPUT", ENABLE_MOUSE_INPUT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ENABLE_PROCESSED_OUTPUT", ENABLE_PROCESSED_OUTPUT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ENABLE_WRAP_AT_EOL_OUTPUT", ENABLE_WRAP_AT_EOL_OUTPUT, CONST_CS|CONST_PERSISTENT); + + REGISTER_LONG_CONSTANT("BACKGROUND_BLUE", BACKGROUND_BLUE, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("FOREGROUND_BLUE", FOREGROUND_BLUE, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("BACKGROUND_GREEN", BACKGROUND_GREEN, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("FOREGROUND_GREEN", FOREGROUND_GREEN, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("BACKGROUND_RED", BACKGROUND_RED, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("FOREGROUND_RED", FOREGROUND_RED, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("BACKGROUND_INTENSITY", BACKGROUND_INTENSITY, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("FOREGROUND_INTENSITY", FOREGROUND_INTENSITY, CONST_CS|CONST_PERSISTENT); + + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_MSHUTDOWN_FUNCTION + */ +PHP_MSHUTDOWN_FUNCTION(wincon) +{ + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_RINIT_FUNCTION + */ +PHP_RINIT_FUNCTION(wincon) +{ + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_RSHUTDOWN_FUNCTION + */ +PHP_RSHUTDOWN_FUNCTION(wincon) +{ + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_MINFO_FUNCTION + */ +PHP_MINFO_FUNCTION(wincon) +{ + php_info_print_table_start(); + php_info_print_table_header(2, "Windows console support", "enabled"); + php_info_print_table_end(); + + /* Remove comments if you have entries in php.ini + DISPLAY_INI_ENTRIES(); + */ +} +/* }}} */ + + + +/* {{{ proto bool AllocConsole(void) + */ +PHP_FUNCTION(allocconsole) +{ + RETURN_BOOL(AllocConsole()); +} + +/* {{{ proto long createconsolescreenbuffer(int desiredaccess; int sharemode; int flags) + */ +PHP_FUNCTION(createconsolescreenbuffer) +{ + zval **desiredaccess; + zval **sharemode; + zval **flags; + long ret; + int ac = ZEND_NUM_ARGS(); + + if (ac != 2 || zend_get_parameters_ex(ac, &desiredaccess, &sharemode, &flags) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(desiredaccess); + convert_to_long_ex(sharemode); + convert_to_long_ex(flags); + + ret = (long)CreateConsoleScreenBuffer(Z_LVAL_PP(desiredaccess), Z_LVAL_PP(sharemode), NULL, Z_LVAL_PP(flags), NULL); + RETURN_LONG(ret); +} + +/* {{{ proto bool fillconsoleoutputattribute(int consoleoutput, int attribute, int len, int x, int y) + */ +PHP_FUNCTION(fillconsoleoutputattribute) +{ + zval **consoleoutput; + zval **attribute; + zval **len; + zval **x; + zval **y; + DWORD dw; + + COORD coord; + + int ac = ZEND_NUM_ARGS(); + + if (ac != 5 || zend_get_parameters_ex(ac, &consoleoutput, &attribute, &len, &x, &y) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleoutput); + convert_to_long_ex(attribute); + convert_to_long_ex(len); + convert_to_long_ex(x); + convert_to_long_ex(y); + + coord.X = (short)Z_LVAL_PP(x); + coord.Y = (short)Z_LVAL_PP(y); + RETURN_BOOL(FillConsoleOutputAttribute((HANDLE)Z_LVAL_PP(consoleoutput), (WORD)Z_LVAL_PP(attribute), Z_LVAL_PP(len), coord, &dw)); + +} + +/* {{{ proto long getstdhandle(int stdhandle) + */ +PHP_FUNCTION(getstdhandle) +{ + zval **stdhandle; + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &stdhandle) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(stdhandle); + RETURN_LONG((long)GetStdHandle(Z_LVAL_PP(stdhandle))); +} + +/* {{{ proto bool setconsoletitle(string title) + */ +PHP_FUNCTION(setconsoletitle) +{ + zval **title; + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &title) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(title); + RETURN_BOOL(SetConsoleTitle(Z_STRVAL_PP(title))); +} + + +/* {{{ proto string readconsole(int consoleinput, int buflen) + */ +PHP_FUNCTION(readconsole) +{ + char *buffer; + DWORD buflen; + zval **zbuflen; + zval **consoleinput; + DWORD cr; + int ac = ZEND_NUM_ARGS(); + + if (ac != 2 || zend_get_parameters_ex(ac, &consoleinput, &zbuflen) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(zbuflen); + convert_to_long_ex(consoleinput); + buflen = (DWORD)Z_LVAL_PP(zbuflen); + buffer = emalloc(buflen); + ReadConsole( (HANDLE)Z_LVAL_PP(consoleinput), buffer, buflen, &cr, NULL); + ZVAL_STRING(return_value, buffer, TRUE); + efree(buffer); +} + + +/* {{{ proto bool flushconsoleinputbuffer(int consoleinput) + */ +PHP_FUNCTION(flushconsoleinputbuffer) +{ + zval **consoleinput; + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &consoleinput) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleinput); + RETURN_BOOL(FlushConsoleInputBuffer((HANDLE)Z_LVAL_PP(consoleinput))); + +} + + +/* {{{ proto bool freeconsole(void) + */ +PHP_FUNCTION(freeconsole) +{ + RETURN_BOOL(FreeConsole()); +} + + +/* {{{ proto bool generateconsolectrlevent(int ctrlevent, int processgroupid) + */ +PHP_FUNCTION(generateconsolectrlevent) +{ + zval **ctrlevent; + zval **processgroupid; + int ac = ZEND_NUM_ARGS(); + + if (ac != 2 || zend_get_parameters_ex(ac, &ctrlevent, &processgroupid) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(ctrlevent); + convert_to_long_ex(processgroupid); + + RETURN_BOOL(GenerateConsoleCtrlEvent(Z_LVAL_PP(ctrlevent), Z_LVAL_PP(processgroupid))); +} + + +/* {{{ proto int getconsolecp(void) + */ +PHP_FUNCTION(getconsolecp) +{ + RETURN_LONG(GetConsoleCP()); +} + + +/* {{{ proto long getconsolecursorsize(int consoleoutput) + */ +PHP_FUNCTION(getconsolecursorsize) +{ + zval **consoleoutput; + CONSOLE_CURSOR_INFO cursorinfo; + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &consoleoutput) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleoutput); + GetConsoleCursorInfo((HANDLE)Z_LVAL_PP(consoleoutput), &cursorinfo); + + RETURN_LONG(cursorinfo.dwSize); +} + + +/* {{{ proto bool getconsolecursorvisible(int consoleoutput) + */ +PHP_FUNCTION(getconsolecursorvisible) +{ + zval **consoleoutput; + CONSOLE_CURSOR_INFO cursorinfo; + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &consoleoutput) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleoutput); + GetConsoleCursorInfo((HANDLE)Z_LVAL_PP(consoleoutput), &cursorinfo); + RETURN_BOOL(cursorinfo.bVisible); +} + + +/* {{{ proto int getconsolemode(int consolehandle) + */ +PHP_FUNCTION(getconsolemode) +{ + zval **consolehandle; + DWORD flags; + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &consolehandle) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consolehandle); + GetConsoleMode((HANDLE)Z_LVAL_PP(consolehandle), &flags); + RETURN_LONG(flags); +} + + +/* {{{ proto int getconsoleoutputcp(void) + */ +PHP_FUNCTION(getconsoleoutputcp) +{ + RETURN_LONG(GetConsoleOutputCP()); +} + + +/* {{{ proto array getconsolescreenbufferinfo(int consoleoutput) + */ +PHP_FUNCTION(getconsolescreenbufferinfo) +{ + + zval **consoleoutput; + zval *size; + zval *cursorposition; + zval *srwindow; + zval *maxwinsize; + + CONSOLE_SCREEN_BUFFER_INFO bufferinfo; + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &consoleoutput) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleoutput); + GetConsoleScreenBufferInfo((HANDLE)Z_LVAL_PP(consoleoutput), &bufferinfo); + array_init(return_value); + + MAKE_STD_ZVAL(size); + MAKE_STD_ZVAL(cursorposition); + MAKE_STD_ZVAL(srwindow); + MAKE_STD_ZVAL(maxwinsize); + + array_init(size); + array_init(cursorposition); + array_init(srwindow); + array_init(maxwinsize); + + add_assoc_long(size, "x", bufferinfo.dwSize.X); + add_assoc_long(size, "y", bufferinfo.dwSize.Y); + + add_assoc_long(cursorposition, "x", bufferinfo.dwCursorPosition.X); + add_assoc_long(cursorposition, "y", bufferinfo.dwCursorPosition.Y); + + add_assoc_zval(return_value, "dwsize", size); + add_assoc_zval(return_value, "dwcursorposition", cursorposition); + + add_assoc_long(return_value, "wattributes", bufferinfo.wAttributes); + + add_assoc_long(srwindow, "left", bufferinfo.srWindow.Left); + add_assoc_long(srwindow, "top", bufferinfo.srWindow.Top); + add_assoc_long(srwindow, "right", bufferinfo.srWindow.Right); + add_assoc_long(srwindow, "bottom", bufferinfo.srWindow.Bottom); + + add_assoc_zval(return_value, "srwindow", srwindow); + + + add_assoc_long(maxwinsize, "x", bufferinfo.dwMaximumWindowSize.X); + add_assoc_long(maxwinsize, "y", bufferinfo.dwMaximumWindowSize.Y); + + add_assoc_zval(return_value, "dwmaximumwindowsize", maxwinsize); + +} + + +/* {{{ proto string getconsoletitle(int buflen) + */ +PHP_FUNCTION(getconsoletitle) +{ + char *buffer; + DWORD buflen; + zval **zbuflen; + + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &zbuflen) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(zbuflen); + + buflen = (DWORD)Z_LVAL_PP(zbuflen); + buffer = emalloc(buflen); + GetConsoleTitle(buffer, buflen); + ZVAL_STRING(return_value, buffer, TRUE); + efree(buffer); + +} + + +/* {{{ proto int getnumberofconsoleevents(int consoleinput) + */ +PHP_FUNCTION(getnumberofconsoleinputevents) +{ + zval **consoleinput; + DWORD numberofevents; + + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &consoleinput) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleinput); + + GetNumberOfConsoleInputEvents((HANDLE)Z_LVAL_PP(consoleinput), &numberofevents); + RETURN_LONG(numberofevents); +} + +/* {{{ proto bool setconsolecp(int codepage) + */ +PHP_FUNCTION(setconsolecp) +{ + zval **codepage; + int ac = ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &codepage) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(codepage); + RETURN_BOOL(SetConsoleCP(Z_LVAL_PP(codepage))); + +} + + +/* {{{ proto bool writeconsole(int consoleoutput, string str) + */ +PHP_FUNCTION(writeconsole) +{ + zval **consoleoutput; + zval **str; + DWORD nNumberOfCharsToWrite; // number of characters to write + DWORD NumberOfCharsWritten; // number of characters written + int ac = ZEND_NUM_ARGS(); + + if (ac != 2 || zend_get_parameters_ex(ac, &consoleoutput, &str) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(consoleoutput); + convert_to_string_ex(str); + nNumberOfCharsToWrite = Z_STRLEN_PP(str); + RETURN_BOOL(WriteConsole((HANDLE)Z_LVAL_PP(consoleoutput), Z_STRVAL_PP(str), nNumberOfCharsToWrite, &NumberOfCharsWritten, NULL)); + +} + +/* {{{ proto bool setconsoleattribute(int consoleoutput int attributes) + */ +PHP_FUNCTION(setconsoletextattribute) +{ + zval **consoleoutput; + zval **attributes; + int ac = ZEND_NUM_ARGS(); + + if (ac != 2 || zend_get_parameters_ex(ac, &consoleoutput, &attributes) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(consoleoutput); + convert_to_long_ex(attributes); + RETURN_BOOL(SetConsoleTextAttribute((HANDLE)Z_LVAL_PP(consoleoutput), (WORD)Z_LVAL_PP(attributes))); +} + + +/* {{{ proto bool setconsoleoutputcp(int codepageid) + */ +PHP_FUNCTION(setconsoleoutputcp) +{ + zval **codepageid; + int ac=ZEND_NUM_ARGS(); + + if (ac != 1 || zend_get_parameters_ex(ac, &codepageid) == FAILURE) { + WRONG_PARAM_COUNT; + } + RETURN_BOOL(SetConsoleOutputCP(Z_LVAL_PP(codepageid))); +} + + +/* {{{ proto bool setstdhandle(int stdhandle, int hHandle) + */ +PHP_FUNCTION(setstdhandle) +{ + zval **stdhandle; + zval **hHandle; + + int ac = ZEND_NUM_ARGS(); + + if (ac != 2 || zend_get_parameters_ex(ac, &stdhandle, &hHandle) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(stdhandle); + convert_to_long_ex(hHandle); + RETURN_BOOL(SetStdHandle(Z_LVAL_PP(stdhandle), (HANDLE)Z_LVAL_PP(hHandle))); +} + +/* {{{ proto bool setconsolemode(int consolehandle, int mode) + */ +PHP_FUNCTION(setconsolemode) +{ + zval **consolehandle; + zval **mode; + int ac = ZEND_NUM_ARGS(); + + if (ac != 2 || zend_get_parameters_ex(ac, &consolehandle, &mode) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(consolehandle); + convert_to_long_ex(mode); + RETURN_BOOL(SetConsoleMode((HANDLE)Z_LVAL_PP(consolehandle), Z_LVAL_PP(mode))); +} + +/* {{{ proto bool setconsolecursorposition(int consoleoutput, int x, int y) + */ +PHP_FUNCTION(setconsolecursorposition) +{ + zval **consoleoutput; + zval **x; + zval **y; + COORD coord; + int ac = ZEND_NUM_ARGS(); + + if (ac != 3 || zend_get_parameters_ex(ac, &consoleoutput, &x, &y) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleoutput); + convert_to_long_ex(x); + convert_to_long_ex(y); + coord.X = (short)Z_LVAL_PP(x); + coord.Y = (short)Z_LVAL_PP(y); + RETURN_BOOL(SetConsoleCursorPosition((HANDLE)Z_LVAL_PP(consoleoutput), coord)); +} + +/* {{{ proto bool setconsolecursorinfo(int consoleoutput, int size, bool visible) + */ +PHP_FUNCTION(setconsolecursorinfo) +{ + zval **consoleoutput; + zval **size; + zval **visible; + CONSOLE_CURSOR_INFO cursorinfo; + int ac = ZEND_NUM_ARGS(); + + if (ac != 3 || zend_get_parameters_ex(ac, &consoleoutput, &size, &visible) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleoutput); + convert_to_long_ex(size); + convert_to_boolean_ex(visible); + cursorinfo.dwSize = Z_LVAL_PP(size); + cursorinfo.bVisible = Z_BVAL_PP(visible); + RETURN_BOOL(SetConsoleCursorInfo((HANDLE)Z_LVAL_PP(consoleoutput), &cursorinfo)); +} + +/* {{{ proto bool writeconsoleoutputcharacter(int consoleoutput, string arg, int x, int y) + */ +PHP_FUNCTION(writeconsoleoutputcharacter) +{ + zval **consoleoutput; + zval **characters; + zval **x; + zval **y; + COORD coord; + int n; + int len; + + int ac = ZEND_NUM_ARGS(); + + if (ac != 4 || zend_get_parameters_ex(ac, &consoleoutput, &characters, &x, &y) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(consoleoutput); + convert_to_long_ex(x); + convert_to_long_ex(y); + convert_to_string_ex(characters); + len = Z_STRLEN_PP(characters); + coord.X = (short)Z_LVAL_PP(x); + coord.Y = (short)Z_LVAL_PP(y); + RETURN_BOOL(WriteConsoleOutputCharacter((HANDLE)Z_LVAL_PP(consoleoutput), Z_STRVAL_PP(characters), len, coord, &n)); +} + +/* }}} */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/Demos/Bonus/wincon/wincon.dsp b/Source/Demos/Bonus/wincon/wincon.dsp similarity index 97% rename from Demos/Bonus/wincon/wincon.dsp rename to Source/Demos/Bonus/wincon/wincon.dsp index 3ae22b1..0571990 100644 --- a/Demos/Bonus/wincon/wincon.dsp +++ b/Source/Demos/Bonus/wincon/wincon.dsp @@ -1,113 +1,113 @@ -# Microsoft Developer Studio Project File - Name="wincon" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=wincon - Win32 Release_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 "wincon.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 "wincon.mak" CFG="wincon - Win32 Release_TS" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "wincon - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "wincon - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "wincon - Win32 Release_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release_TS" -# PROP BASE Intermediate_Dir "Release_TS" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release_TS" -# PROP Intermediate_Dir "Release_TS" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_WINCON" /D ZTS=1 /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WINCON_EXPORTS" /D "COMPILE_DL_WINCON" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_WINCON=1 /D "LIBZEND_EXPORTS" /FR /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x406 /d "NDEBUG" -# ADD RSC /l 0x406 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_wincon.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" - -!ELSEIF "$(CFG)" == "wincon - Win32 Debug_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Debug_TS" -# PROP BASE Intermediate_Dir "Debug_TS" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Debug_TS" -# PROP Intermediate_Dir "Debug_TS" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_WINCON" /D ZTS=1 /YX /FD /c -# ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WINCON_EXPORTS" /D "COMPILE_DL_WINCON" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_WINCON=1 /D "LIBZEND_EXPORTS" /FR /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x406 /d "NDEBUG" -# ADD RSC /l 0x406 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Debug_TS/php_wincon.dll" /libpath:"..\..\Debug_TS" - -!ENDIF - -# Begin Target - -# Name "wincon - Win32 Release_TS" -# Name "wincon - Win32 Debug_TS" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\wincon.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\php_wincon.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="wincon" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=wincon - Win32 Release_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 "wincon.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 "wincon.mak" CFG="wincon - Win32 Release_TS" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "wincon - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wincon - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "wincon - Win32 Release_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release_TS" +# PROP BASE Intermediate_Dir "Release_TS" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_TS" +# PROP Intermediate_Dir "Release_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_WINCON" /D ZTS=1 /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WINCON_EXPORTS" /D "COMPILE_DL_WINCON" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_WINCON=1 /D "LIBZEND_EXPORTS" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x406 /d "NDEBUG" +# ADD RSC /l 0x406 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_wincon.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" + +!ELSEIF "$(CFG)" == "wincon - Win32 Debug_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Debug_TS" +# PROP BASE Intermediate_Dir "Debug_TS" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Debug_TS" +# PROP Intermediate_Dir "Debug_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_WINCON" /D ZTS=1 /YX /FD /c +# ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WINCON_EXPORTS" /D "COMPILE_DL_WINCON" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_WINCON=1 /D "LIBZEND_EXPORTS" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x406 /d "NDEBUG" +# ADD RSC /l 0x406 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Debug_TS/php_wincon.dll" /libpath:"..\..\Debug_TS" + +!ENDIF + +# Begin Target + +# Name "wincon - Win32 Release_TS" +# Name "wincon - Win32 Debug_TS" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\wincon.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\php_wincon.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/Demos/Bonus/wincon/wincon.dsw b/Source/Demos/Bonus/wincon/wincon.dsw similarity index 94% rename from Demos/Bonus/wincon/wincon.dsw rename to Source/Demos/Bonus/wincon/wincon.dsw index ed47022..6d0218b 100644 --- a/Demos/Bonus/wincon/wincon.dsw +++ b/Source/Demos/Bonus/wincon/wincon.dsw @@ -1,29 +1,29 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "wincon"=".\wincon.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "wincon"=".\wincon.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Demos/Bonus/wincon/wincon.rc b/Source/Demos/Bonus/wincon/wincon.rc similarity index 95% rename from Demos/Bonus/wincon/wincon.rc rename to Source/Demos/Bonus/wincon/wincon.rc index 65d94cb..0cef2a1 100644 --- a/Demos/Bonus/wincon/wincon.rc +++ b/Source/Demos/Bonus/wincon/wincon.rc @@ -1,115 +1,115 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Russian resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) -#ifdef _WIN32 -LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -#pragma code_page(1251) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // Russian resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// Dutch (Belgium) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NLB) -#ifdef _WIN32 -LANGUAGE LANG_DUTCH, SUBLANG_DUTCH_BELGIAN -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 6,2,0,1 - PRODUCTVERSION 6,2,0,1 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "000904b0" - BEGIN - VALUE "CompanyName", "Serhiy Perevoznyk" - VALUE "FileDescription", "Windows Console PHP Extension" - VALUE "FileVersion", "6, 2, 0, 1" - VALUE "InternalName", "wincon" - VALUE "LegalCopyright", "Copyright (C) 2006, Serhiy Perevoznyk" - VALUE "LegalTrademarks", "PHP4Delphi" - VALUE "OriginalFilename", "wincon.dll" - VALUE "ProductName", "PHP4Delphi" - VALUE "ProductVersion", "6, 2, 0, 1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x9, 1200 - END -END - -#endif // Dutch (Belgium) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Dutch (Belgium) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NLB) +#ifdef _WIN32 +LANGUAGE LANG_DUTCH, SUBLANG_DUTCH_BELGIAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 6,2,0,1 + PRODUCTVERSION 6,2,0,1 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000904b0" + BEGIN + VALUE "CompanyName", "Serhiy Perevoznyk" + VALUE "FileDescription", "Windows Console PHP Extension" + VALUE "FileVersion", "6, 2, 0, 1" + VALUE "InternalName", "wincon" + VALUE "LegalCopyright", "Copyright (C) 2006, Serhiy Perevoznyk" + VALUE "LegalTrademarks", "PHP4Delphi" + VALUE "OriginalFilename", "wincon.dll" + VALUE "ProductName", "PHP4Delphi" + VALUE "ProductVersion", "6, 2, 0, 1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x9, 1200 + END +END + +#endif // Dutch (Belgium) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Demos/Bonus/wincon/wincon.sln b/Source/Demos/Bonus/wincon/wincon.sln similarity index 97% rename from Demos/Bonus/wincon/wincon.sln rename to Source/Demos/Bonus/wincon/wincon.sln index dd403b0..bf20a7e 100644 --- a/Demos/Bonus/wincon/wincon.sln +++ b/Source/Demos/Bonus/wincon/wincon.sln @@ -1,20 +1,20 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wincon", "wincon.vcproj", "{FA700C0B-DE1A-473D-8FCE-BE984E866697}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_TS|Win32 = Debug_TS|Win32 - Release_TS|Win32 = Release_TS|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FA700C0B-DE1A-473D-8FCE-BE984E866697}.Debug_TS|Win32.ActiveCfg = Debug_TS|Win32 - {FA700C0B-DE1A-473D-8FCE-BE984E866697}.Debug_TS|Win32.Build.0 = Debug_TS|Win32 - {FA700C0B-DE1A-473D-8FCE-BE984E866697}.Release_TS|Win32.ActiveCfg = Release_TS|Win32 - {FA700C0B-DE1A-473D-8FCE-BE984E866697}.Release_TS|Win32.Build.0 = Release_TS|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wincon", "wincon.vcproj", "{FA700C0B-DE1A-473D-8FCE-BE984E866697}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_TS|Win32 = Debug_TS|Win32 + Release_TS|Win32 = Release_TS|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FA700C0B-DE1A-473D-8FCE-BE984E866697}.Debug_TS|Win32.ActiveCfg = Debug_TS|Win32 + {FA700C0B-DE1A-473D-8FCE-BE984E866697}.Debug_TS|Win32.Build.0 = Debug_TS|Win32 + {FA700C0B-DE1A-473D-8FCE-BE984E866697}.Release_TS|Win32.ActiveCfg = Release_TS|Win32 + {FA700C0B-DE1A-473D-8FCE-BE984E866697}.Release_TS|Win32.Build.0 = Release_TS|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Demos/Bonus/wincon/wincon.vcproj b/Source/Demos/Bonus/wincon/wincon.vcproj similarity index 95% rename from Demos/Bonus/wincon/wincon.vcproj rename to Source/Demos/Bonus/wincon/wincon.vcproj index b361d54..3ce8ac8 100644 --- a/Demos/Bonus/wincon/wincon.vcproj +++ b/Source/Demos/Bonus/wincon/wincon.vcproj @@ -1,267 +1,267 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demos/Delphi4PHP/DesignIDE/d4pide.dpr b/Source/Demos/Delphi4PHP/DesignIDE/d4pide.dpr similarity index 100% rename from Demos/Delphi4PHP/DesignIDE/d4pide.dpr rename to Source/Demos/Delphi4PHP/DesignIDE/d4pide.dpr diff --git a/Demos/Delphi4PHP/DesignIDE/readme.txt b/Source/Demos/Delphi4PHP/DesignIDE/readme.txt similarity index 100% rename from Demos/Delphi4PHP/DesignIDE/readme.txt rename to Source/Demos/Delphi4PHP/DesignIDE/readme.txt diff --git a/Demos/Extensions/Borland Demo/Unit1.ddp b/Source/Demos/Extensions/Borland Demo/Unit1.ddp similarity index 100% rename from Demos/Extensions/Borland Demo/Unit1.ddp rename to Source/Demos/Extensions/Borland Demo/Unit1.ddp diff --git a/Demos/Extensions/Borland Demo/Unit1.dfm b/Source/Demos/Extensions/Borland Demo/Unit1.dfm similarity index 96% rename from Demos/Extensions/Borland Demo/Unit1.dfm rename to Source/Demos/Extensions/Borland Demo/Unit1.dfm index c542afd..e64935b 100644 --- a/Demos/Extensions/Borland Demo/Unit1.dfm +++ b/Source/Demos/Extensions/Borland Demo/Unit1.dfm @@ -1,139 +1,139 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - OnCreate = PHPExtensionCreate - OnDestroy = PHPExtensionDestroy - Version = '0.0' - Functions = < - item - FunctionName = 'produce_page' - Tag = 0 - Parameters = < - item - Name = 'Action' - ParamType = tpString - end> - OnExecute = PHPExtension1Functions0Execute - end - item - FunctionName = 'runquery' - Tag = 0 - Parameters = < - item - Name = 'CustNo' - ParamType = tpString - end> - OnExecute = PHPExtension1Functions1Execute - end> - ModuleName = 'borland_demo' - Height = 640 - Width = 870 - object Root: TPageProducer - HTMLDoc.Strings = ( - '' - 'PHP Example ( Former ISAPI/NSAPI/CGI Example)' - '' - '

PHP Example server

' - '

' - 'Web Examples' - '

' - 'TPageProducer using a Custom Tag
' - 'For an example of using a TPageProducer with a Custom Tag click' - - '
here. This exam' + - 'ple returns' - - 'list of all customers from the Customer.DB table. You can click' + - ' the customer'#39's' - 'name to view a listing of their orders.' - '

' - 'TDatasetPageProducer
' - - 'For an example of using the TDatasetPageProducer and of returnin' + - 'g a graphic' - - 'from a table click here. This example' - - 'makes use of the JPeg unit to display a bitmap stored in the gra' + - 'phic field of the' - 'Biolife.DB table.' - '

' - 'Server Redirect
' - - 'Click
here for a dem' + - 'onstration of' - 'how to redirect a use to an other web site.
' - '' - '' - '' - '' - ' ' - ' ') - OnHTMLTag = RootHTMLTag - Left = 26 - Top = 176 - end - object BioLifeProducer: TDataSetPageProducer - HTMLDoc.Strings = ( - '' - '' - ' Biolife Data' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '
Category:<#Category>
Common Name:<#Common_Name>
Notes:<#Notes>
Picture:<#Graphic>
' - '' - '' - '') - Left = 110 - Top = 126 - end - object CustSource: TDataSource - Left = 90 - Top = 65 - end - object CustomerList: TPageProducer - HTMLDoc.Strings = ( - '' - '' - '' - '' - '' - 'Sample Delphi Web server application' - '' - '' - '

Customer Order Information

' - '
' - 'Click a customer name to view their orders.

' - '<#CUSTLIST>

' - '' - '' - ' ') - OnHTMLTag = CustomerListHTMLTag - Left = 118 - Top = 9 - end -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + OnCreate = PHPExtensionCreate + OnDestroy = PHPExtensionDestroy + Version = '0.0' + Functions = < + item + FunctionName = 'produce_page' + Tag = 0 + Parameters = < + item + Name = 'Action' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions0Execute + end + item + FunctionName = 'runquery' + Tag = 0 + Parameters = < + item + Name = 'CustNo' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions1Execute + end> + ModuleName = 'borland_demo' + Height = 640 + Width = 870 + object Root: TPageProducer + HTMLDoc.Strings = ( + '' + 'PHP Example ( Former ISAPI/NSAPI/CGI Example)' + '' + '

PHP Example server

' + '

' + 'Web Examples' + '

' + 'TPageProducer using a Custom Tag
' + 'For an example of using a TPageProducer with a Custom Tag click' + + 'here. This exam' + + 'ple returns' + + 'list of all customers from the Customer.DB table. You can click' + + ' the customer'#39's' + 'name to view a listing of their orders.' + '

' + 'TDatasetPageProducer
' + + 'For an example of using the TDatasetPageProducer and of returnin' + + 'g a graphic' + + 'from a table click here. This example' + + 'makes use of the JPeg unit to display a bitmap stored in the gra' + + 'phic field of the' + 'Biolife.DB table.' + '

' + 'Server Redirect
' + + 'Click
here for a dem' + + 'onstration of' + 'how to redirect a use to an other web site.
' + '' + '' + '' + '' + ' ' + ' ') + OnHTMLTag = RootHTMLTag + Left = 26 + Top = 176 + end + object BioLifeProducer: TDataSetPageProducer + HTMLDoc.Strings = ( + '' + '' + ' Biolife Data' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Category:<#Category>
Common Name:<#Common_Name>
Notes:<#Notes>
Picture:<#Graphic>
' + '' + '' + '') + Left = 110 + Top = 126 + end + object CustSource: TDataSource + Left = 90 + Top = 65 + end + object CustomerList: TPageProducer + HTMLDoc.Strings = ( + '' + '' + '' + '' + '' + 'Sample Delphi Web server application' + '' + '' + '

Customer Order Information

' + '
' + 'Click a customer name to view their orders.

' + '<#CUSTLIST>

' + '' + '' + ' ') + OnHTMLTag = CustomerListHTMLTag + Left = 118 + Top = 9 + end +end diff --git a/Demos/Extensions/Borland Demo/Unit1.dti b/Source/Demos/Extensions/Borland Demo/Unit1.dti similarity index 92% rename from Demos/Extensions/Borland Demo/Unit1.dti rename to Source/Demos/Extensions/Borland Demo/Unit1.dti index db23cf9..69a56ab 100644 --- a/Demos/Extensions/Borland Demo/Unit1.dti +++ b/Source/Demos/Extensions/Borland Demo/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=285 -Top=161 -Width=741 -Height=479 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=PHPExtension1\PHPExtension1.Functions - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1\PHPExtension1.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Extensions/Borland Demo/Unit1.pas b/Source/Demos/Extensions/Borland Demo/Unit1.pas similarity index 96% rename from Demos/Extensions/Borland Demo/Unit1.pas rename to Source/Demos/Extensions/Borland Demo/Unit1.pas index fce4133..686a79e 100644 --- a/Demos/Extensions/Borland Demo/Unit1.pas +++ b/Source/Demos/Extensions/Borland Demo/Unit1.pas @@ -1,238 +1,238 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -unit Unit1; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules, DBWeb, Db, DSProd, HTTPApp, DBTables, Graphics, JPeg, - DBBdeWeb, HTTPProd; - -type - - TPHPExtension1 = class(TPHPExtension) - Root: TPageProducer; - BioLifeProducer: TDataSetPageProducer; - CustSource: TDataSource; - CustomerList: TPageProducer; - procedure PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure RootHTMLTag(Sender: TObject; Tag: TTag; - const TagString: String; TagParams: TStrings; - var ReplaceText: String); - procedure CustomerListHTMLTag(Sender: TObject; Tag: TTag; - const TagString: String; TagParams: TStrings; - var ReplaceText: String); - procedure PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure PHPExtensionCreate(Sender: TObject); - procedure BioLifeGraphicGetText(Sender: TField; var Text: String; - DisplayText: Boolean); - procedure BioLifeNotesGetText(Sender: TField; var Text: String; - DisplayText: Boolean); - procedure PHPExtensionDestroy(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - -procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - Action : string; - _redirect : PChar; - _content_type : PChar; - gl : Psapi_globals_struct; - ts : pointer; - Jpg: TJpegImage; - S: TMemoryStream; - B: TBitmap; - -begin - ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals; - - Action := Parameters.Values('Action'); - if Action = '' then - begin - ReturnValue := Root.Content; - Exit; - end; - - if SameText(Action, 'redirect') then - begin - _redirect := 'Location: http://www.borland.com'; - php_header_write(_redirect, strlen(_redirect) + 1, TSRMLS_DC); - gl.sapi_headers.http_response_code := 302; - Exit; - end; - - if SameText(Action, 'customerlist') then - begin - ReturnValue := CustomerList.Content; - Exit; - end; - - if SameText(Action, 'biolife') then - begin - ReturnValue := BioLifeProducer.Content; - Exit; - end; - - if SameText(Action, 'getimage') then - begin - Jpg := TJpegImage.Create; - try - B := TBitmap.Create; - try - B.Assign(BioLifeGraphic); - Jpg.Assign(B); - finally - B.Free; - end; - S := TMemoryStream.Create; - Jpg.SaveToStream(S); - S.Position := 0; - _content_type := 'Content-type: image/jpeg'; - php_header_write(_content_type, strlen(_content_type), TSRMLS_DC); - php_body_write(PChar(S.memory), S.Size, TSRMLS_DC); - S.Free; - finally - Jpg.Free; - end; - - end; - - ReturnValue := 'Unknown action: ' + Action; -end; - - - -procedure TPHPExtension1.RootHTMLTag(Sender: TObject; Tag: TTag; - const TagString: String; TagParams: TStrings; var ReplaceText: String); -var - gl : Psapi_globals_struct; - ts : pointer; -begin - - if SameText(TagString, 'MODULENAME') then - begin - ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals; - ReplaceText := gl.request_info.request_uri; - end; -end; - -procedure TPHPExtension1.CustomerListHTMLTag(Sender: TObject; Tag: TTag; - const TagString: String; TagParams: TStrings; var ReplaceText: String); -var - Customers: String; - Scriptname : string; - gl : Psapi_globals_struct; - ts : pointer; -begin - ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals; - ScriptName := gl.request_info.request_uri; - - if CompareText(TagString, 'CUSTLIST') = 0 then - begin - Customers := ''; - Customer.First; - while not Customer.Eof do - begin - Customers := Customers + Format('%s
', - [ScriptName, CustomerCustNo.AsInteger, CustomerCompany.AsString]); - Customer.Next; - end; - end; - ReplaceText := Customers; -end; - -procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - CustNo : string; -begin - CustNo := Parameters.Values('CustNo'); - if Customer.Locate('CustNo', CustNo, []) then - begin - CustomerOrders.Header.Clear; - CustomerOrders.Header.Add('The following table was produced using a TDatasetTableProducer.

'); - CustomerOrders.Header.Add('Orders for: ' + CustomerCompany.AsString); - ReturnValue := CustomerOrders.Content; - end - else - ReturnValue := Format('Customer: %s not found', - [CustNo]); - -end; - -procedure TPHPExtension1.PHPExtensionCreate(Sender: TObject); -begin - Customer.Open; - BioLife.Open; -end; - -procedure TPHPExtension1.BioLifeGraphicGetText(Sender: TField; - var Text: String; DisplayText: Boolean); -var - Scriptname : string; - gl : Psapi_globals_struct; - ts : pointer; - -begin - ts := ts_resource_ex(0, nil); - gl := GetSAPIGlobals; - ScriptName := gl.request_info.request_uri; - - Text := Format('[%s]', - [ScriptName, BiolifeCommon_Name.Text]); -end; - -procedure TPHPExtension1.BioLifeNotesGetText(Sender: TField; - var Text: String; DisplayText: Boolean); -begin - Text := Sender.AsString; -end; - -procedure TPHPExtension1.PHPExtensionDestroy(Sender: TObject); -begin - try - Database1.Connected := false; - except - end; -end; - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules, DBWeb, Db, DSProd, HTTPApp, DBTables, Graphics, JPeg, + DBBdeWeb, HTTPProd; + +type + + TPHPExtension1 = class(TPHPExtension) + Root: TPageProducer; + BioLifeProducer: TDataSetPageProducer; + CustSource: TDataSource; + CustomerList: TPageProducer; + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure RootHTMLTag(Sender: TObject; Tag: TTag; + const TagString: String; TagParams: TStrings; + var ReplaceText: String); + procedure CustomerListHTMLTag(Sender: TObject; Tag: TTag; + const TagString: String; TagParams: TStrings; + var ReplaceText: String); + procedure PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPExtensionCreate(Sender: TObject); + procedure BioLifeGraphicGetText(Sender: TField; var Text: String; + DisplayText: Boolean); + procedure BioLifeNotesGetText(Sender: TField; var Text: String; + DisplayText: Boolean); + procedure PHPExtensionDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + Action : string; + _redirect : PChar; + _content_type : PChar; + gl : Psapi_globals_struct; + ts : pointer; + Jpg: TJpegImage; + S: TMemoryStream; + B: TBitmap; + +begin + ts := ts_resource_ex(0, nil); + gl := GetSAPIGlobals; + + Action := Parameters.Values('Action'); + if Action = '' then + begin + ReturnValue := Root.Content; + Exit; + end; + + if SameText(Action, 'redirect') then + begin + _redirect := 'Location: http://www.borland.com'; + php_header_write(_redirect, strlen(_redirect) + 1, TSRMLS_DC); + gl.sapi_headers.http_response_code := 302; + Exit; + end; + + if SameText(Action, 'customerlist') then + begin + ReturnValue := CustomerList.Content; + Exit; + end; + + if SameText(Action, 'biolife') then + begin + ReturnValue := BioLifeProducer.Content; + Exit; + end; + + if SameText(Action, 'getimage') then + begin + Jpg := TJpegImage.Create; + try + B := TBitmap.Create; + try + B.Assign(BioLifeGraphic); + Jpg.Assign(B); + finally + B.Free; + end; + S := TMemoryStream.Create; + Jpg.SaveToStream(S); + S.Position := 0; + _content_type := 'Content-type: image/jpeg'; + php_header_write(_content_type, strlen(_content_type), TSRMLS_DC); + php_body_write(PChar(S.memory), S.Size, TSRMLS_DC); + S.Free; + finally + Jpg.Free; + end; + + end; + + ReturnValue := 'Unknown action: ' + Action; +end; + + + +procedure TPHPExtension1.RootHTMLTag(Sender: TObject; Tag: TTag; + const TagString: String; TagParams: TStrings; var ReplaceText: String); +var + gl : Psapi_globals_struct; + ts : pointer; +begin + + if SameText(TagString, 'MODULENAME') then + begin + ts := ts_resource_ex(0, nil); + gl := GetSAPIGlobals; + ReplaceText := gl.request_info.request_uri; + end; +end; + +procedure TPHPExtension1.CustomerListHTMLTag(Sender: TObject; Tag: TTag; + const TagString: String; TagParams: TStrings; var ReplaceText: String); +var + Customers: String; + Scriptname : string; + gl : Psapi_globals_struct; + ts : pointer; +begin + ts := ts_resource_ex(0, nil); + gl := GetSAPIGlobals; + ScriptName := gl.request_info.request_uri; + + if CompareText(TagString, 'CUSTLIST') = 0 then + begin + Customers := ''; + Customer.First; + while not Customer.Eof do + begin + Customers := Customers + Format('%s
', + [ScriptName, CustomerCustNo.AsInteger, CustomerCompany.AsString]); + Customer.Next; + end; + end; + ReplaceText := Customers; +end; + +procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + CustNo : string; +begin + CustNo := Parameters.Values('CustNo'); + if Customer.Locate('CustNo', CustNo, []) then + begin + CustomerOrders.Header.Clear; + CustomerOrders.Header.Add('The following table was produced using a TDatasetTableProducer.

'); + CustomerOrders.Header.Add('Orders for: ' + CustomerCompany.AsString); + ReturnValue := CustomerOrders.Content; + end + else + ReturnValue := Format('Customer: %s not found', + [CustNo]); + +end; + +procedure TPHPExtension1.PHPExtensionCreate(Sender: TObject); +begin + Customer.Open; + BioLife.Open; +end; + +procedure TPHPExtension1.BioLifeGraphicGetText(Sender: TField; + var Text: String; DisplayText: Boolean); +var + Scriptname : string; + gl : Psapi_globals_struct; + ts : pointer; + +begin + ts := ts_resource_ex(0, nil); + gl := GetSAPIGlobals; + ScriptName := gl.request_info.request_uri; + + Text := Format('[%s]', + [ScriptName, BiolifeCommon_Name.Text]); +end; + +procedure TPHPExtension1.BioLifeNotesGetText(Sender: TField; + var Text: String; DisplayText: Boolean); +begin + Text := Sender.AsString; +end; + +procedure TPHPExtension1.PHPExtensionDestroy(Sender: TObject); +begin + try + Database1.Connected := false; + except + end; +end; + end. \ No newline at end of file diff --git a/Demos/Extensions/Borland Demo/borland_demo.dpr b/Source/Demos/Extensions/Borland Demo/borland_demo.dpr similarity index 94% rename from Demos/Extensions/Borland Demo/borland_demo.dpr rename to Source/Demos/Extensions/Borland Demo/borland_demo.dpr index 23660a2..f9cbef4 100644 --- a/Demos/Extensions/Borland Demo/borland_demo.dpr +++ b/Source/Demos/Extensions/Borland Demo/borland_demo.dpr @@ -1,16 +1,16 @@ -library borland_demo; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; +library borland_demo; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/Borland Demo/borland_demo.dproj b/Source/Demos/Extensions/Borland Demo/borland_demo.dproj similarity index 100% rename from Demos/Extensions/Borland Demo/borland_demo.dproj rename to Source/Demos/Extensions/Borland Demo/borland_demo.dproj diff --git a/Demos/Extensions/Borland Demo/borland_demo.dproj.local b/Source/Demos/Extensions/Borland Demo/borland_demo.dproj.local similarity index 100% rename from Demos/Extensions/Borland Demo/borland_demo.dproj.local rename to Source/Demos/Extensions/Borland Demo/borland_demo.dproj.local diff --git a/Demos/Extensions/Borland Demo/borland_demo.identcache b/Source/Demos/Extensions/Borland Demo/borland_demo.identcache similarity index 100% rename from Demos/Extensions/Borland Demo/borland_demo.identcache rename to Source/Demos/Extensions/Borland Demo/borland_demo.identcache diff --git a/Demos/Extensions/Borland Demo/borland_demo.php b/Source/Demos/Extensions/Borland Demo/borland_demo.php similarity index 92% rename from Demos/Extensions/Borland Demo/borland_demo.php rename to Source/Demos/Extensions/Borland Demo/borland_demo.php index 2ceaa6e..4ea9335 100644 --- a/Demos/Extensions/Borland Demo/borland_demo.php +++ b/Source/Demos/Extensions/Borland Demo/borland_demo.php @@ -1,18 +1,18 @@ - - + + diff --git a/Demos/Extensions/Borland Demo/borland_demo.res b/Source/Demos/Extensions/Borland Demo/borland_demo.res similarity index 100% rename from Demos/Extensions/Borland Demo/borland_demo.res rename to Source/Demos/Extensions/Borland Demo/borland_demo.res diff --git a/Demos/Extensions/Borland Demo/borland_demo.stat b/Source/Demos/Extensions/Borland Demo/borland_demo.stat similarity index 100% rename from Demos/Extensions/Borland Demo/borland_demo.stat rename to Source/Demos/Extensions/Borland Demo/borland_demo.stat diff --git a/Demos/Extensions/Borland Demo/borland_demo_Icon.ico b/Source/Demos/Extensions/Borland Demo/borland_demo_Icon.ico similarity index 100% rename from Demos/Extensions/Borland Demo/borland_demo_Icon.ico rename to Source/Demos/Extensions/Borland Demo/borland_demo_Icon.ico diff --git a/Demos/Extensions/Class demo/class_demo.bdsproj b/Source/Demos/Extensions/Class demo/class_demo.bdsproj similarity index 100% rename from Demos/Extensions/Class demo/class_demo.bdsproj rename to Source/Demos/Extensions/Class demo/class_demo.bdsproj diff --git a/Demos/Extensions/Class demo/class_demo.dpr b/Source/Demos/Extensions/Class demo/class_demo.dpr similarity index 94% rename from Demos/Extensions/Class demo/class_demo.dpr rename to Source/Demos/Extensions/Class demo/class_demo.dpr index cd91421..afe9e58 100644 --- a/Demos/Extensions/Class demo/class_demo.dpr +++ b/Source/Demos/Extensions/Class demo/class_demo.dpr @@ -1,16 +1,16 @@ -library class_demo; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - dm_Class in 'dm_Class.pas' {classdemo: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(Tclassdemo, classdemo); - Application.Run; +library class_demo; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + dm_Class in 'dm_Class.pas' {classdemo: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(Tclassdemo, classdemo); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/Class demo/class_demo.res b/Source/Demos/Extensions/Class demo/class_demo.res similarity index 100% rename from Demos/Extensions/Class demo/class_demo.res rename to Source/Demos/Extensions/Class demo/class_demo.res diff --git a/Demos/Extensions/Class demo/dm_Class.ddp b/Source/Demos/Extensions/Class demo/dm_Class.ddp similarity index 100% rename from Demos/Extensions/Class demo/dm_Class.ddp rename to Source/Demos/Extensions/Class demo/dm_Class.ddp diff --git a/Demos/Extensions/Class demo/dm_Class.dfm b/Source/Demos/Extensions/Class demo/dm_Class.dfm similarity index 95% rename from Demos/Extensions/Class demo/dm_Class.dfm rename to Source/Demos/Extensions/Class demo/dm_Class.dfm index 8930bb9..2459a68 100644 --- a/Demos/Extensions/Class demo/dm_Class.dfm +++ b/Source/Demos/Extensions/Class demo/dm_Class.dfm @@ -1,63 +1,63 @@ -object classdemo: Tclassdemo - OldCreateOrder = False - Version = '1.0' - Functions = < - item - FunctionName = 'new_class' - Tag = 0 - Parameters = <> - OnExecute = classdemoFunctions0Execute - end> - ModuleName = 'class_demo' - Left = 235 - Top = 225 - Height = 479 - Width = 741 - object PHPDemoClass: TPHPClass - Properties = < - item - Name = 'prop' - Value = 'hello' - end> - Methods = < - item - Name = 'get_email' - Tag = 0 - Parameters = <> - OnExecute = GetEmailExecute - end - item - Name = 'get_address' - Tag = 0 - Parameters = <> - OnExecute = GetAddressExecute - end - item - Name = 'print_text' - Tag = 0 - Parameters = < - item - Name = 'AText' - ParamType = tpString - end> - OnExecute = PrintTextExecute - end - item - Name = 'add_int' - Tag = 0 - Parameters = < - item - Name = 'X' - ParamType = tpInteger - end - item - Name = 'Y' - ParamType = tpInteger - end> - OnExecute = AddIntExecute - end> - PHPClassName = 'demo_class' - Left = 120 - Top = 48 - end -end +object classdemo: Tclassdemo + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'new_class' + Tag = 0 + Parameters = <> + OnExecute = classdemoFunctions0Execute + end> + ModuleName = 'class_demo' + Left = 235 + Top = 225 + Height = 479 + Width = 741 + object PHPDemoClass: TPHPClass + Properties = < + item + Name = 'prop' + Value = 'hello' + end> + Methods = < + item + Name = 'get_email' + Tag = 0 + Parameters = <> + OnExecute = GetEmailExecute + end + item + Name = 'get_address' + Tag = 0 + Parameters = <> + OnExecute = GetAddressExecute + end + item + Name = 'print_text' + Tag = 0 + Parameters = < + item + Name = 'AText' + ParamType = tpString + end> + OnExecute = PrintTextExecute + end + item + Name = 'add_int' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpInteger + end + item + Name = 'Y' + ParamType = tpInteger + end> + OnExecute = AddIntExecute + end> + PHPClassName = 'demo_class' + Left = 120 + Top = 48 + end +end diff --git a/Demos/Extensions/Class demo/dm_Class.dti b/Source/Demos/Extensions/Class demo/dm_Class.dti similarity index 92% rename from Demos/Extensions/Class demo/dm_Class.dti rename to Source/Demos/Extensions/Class demo/dm_Class.dti index 2ef2126..a60ac35 100644 --- a/Demos/Extensions/Class demo/dm_Class.dti +++ b/Source/Demos/Extensions/Class demo/dm_Class.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=285 -Top=161 -Width=741 -Height=479 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=classdemo\PHPDemoClass\PHPDemoClass.Methods - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=classdemo\PHPDemoClass\PHPDemoClass.Methods + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Extensions/Class demo/dm_Class.pas b/Source/Demos/Extensions/Class demo/dm_Class.pas similarity index 96% rename from Demos/Extensions/Class demo/dm_Class.pas rename to Source/Demos/Extensions/Class demo/dm_Class.pas index d71692a..8388fb5 100644 --- a/Demos/Extensions/Class demo/dm_Class.pas +++ b/Source/Demos/Extensions/Class demo/dm_Class.pas @@ -1,101 +1,101 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.telenet.be/ws36637 } -{*******************************************************} - -{ $Id: dm_Class.pas,v 7.0 04/2007 delphi32 Exp $ } - -unit dm_Class; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - phpClass, - PHPModules, PHPCommon; - -type - - Tclassdemo = class(TPHPExtension) - PHPDemoClass: TPHPClass; - procedure PrintTextExecute(Sender: TPHPClassInstance; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, - this_ptr: Pzval; TSRMLS_DC: Pointer); - procedure AddIntExecute(Sender: TPHPClassInstance; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, - this_ptr: Pzval; TSRMLS_DC: Pointer); - procedure GetAddressExecute(Sender: TPHPClassInstance; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, - this_ptr: Pzval; TSRMLS_DC: Pointer); - procedure GetEmailExecute(Sender: TPHPClassInstance; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, - this_ptr: Pzval; TSRMLS_DC: Pointer); - procedure classdemoFunctions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - classdemo: Tclassdemo; - -implementation - -uses - Dialogs; - -{$R *.DFM} - - -procedure Tclassdemo.PrintTextExecute(Sender: TPHPClassInstance; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, - this_ptr: Pzval; TSRMLS_DC: Pointer); -begin - ReturnValue := Parameters[0].Value; -end; - -procedure Tclassdemo.AddIntExecute(Sender: TPHPClassInstance; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, - this_ptr: Pzval; TSRMLS_DC: Pointer); -begin - ReturnValue := Parameters[0].Value + Parameters[1].Value; -end; - -procedure Tclassdemo.GetAddressExecute(Sender: TPHPClassInstance; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, - this_ptr: Pzval; TSRMLS_DC: Pointer); -begin - ReturnValue := 'www.php.net'; -end; - -procedure Tclassdemo.GetEmailExecute(Sender: TPHPClassInstance; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, - this_ptr: Pzval; TSRMLS_DC: Pointer); -begin - ReturnValue := 'myaddress@hotmail.com'; -end; - -procedure Tclassdemo.classdemoFunctions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - PHPDemoClass.ProduceInstance(ZendVar.AsZendVariable); -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{*******************************************************} + +{ $Id: dm_Class.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit dm_Class; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + phpClass, + PHPModules, PHPCommon; + +type + + Tclassdemo = class(TPHPExtension) + PHPDemoClass: TPHPClass; + procedure PrintTextExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); + procedure AddIntExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); + procedure GetAddressExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); + procedure GetEmailExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); + procedure classdemoFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + classdemo: Tclassdemo; + +implementation + +uses + Dialogs; + +{$R *.DFM} + + +procedure Tclassdemo.PrintTextExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); +begin + ReturnValue := Parameters[0].Value; +end; + +procedure Tclassdemo.AddIntExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); +begin + ReturnValue := Parameters[0].Value + Parameters[1].Value; +end; + +procedure Tclassdemo.GetAddressExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); +begin + ReturnValue := 'www.php.net'; +end; + +procedure Tclassdemo.GetEmailExecute(Sender: TPHPClassInstance; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendValue, + this_ptr: Pzval; TSRMLS_DC: Pointer); +begin + ReturnValue := 'myaddress@hotmail.com'; +end; + +procedure Tclassdemo.classdemoFunctions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + PHPDemoClass.ProduceInstance(ZendVar.AsZendVariable); +end; + +end. diff --git a/Demos/Extensions/Class demo/test_class.php b/Source/Demos/Extensions/Class demo/test_class.php similarity index 91% rename from Demos/Extensions/Class demo/test_class.php rename to Source/Demos/Extensions/Class demo/test_class.php index 28283e4..604a5c0 100644 --- a/Demos/Extensions/Class demo/test_class.php +++ b/Source/Demos/Extensions/Class demo/test_class.php @@ -1,15 +1,15 @@ -get_email(); - -echo "\n"; - -$b = new_class(); -echo $b->prop; - -?> - +get_email(); + +echo "\n"; + +$b = new_class(); +echo $b->prop; + +?> + diff --git a/Demos/Extensions/Delphi Class 1/delphi_class.bdsproj b/Source/Demos/Extensions/Delphi Class 1/delphi_class.bdsproj similarity index 100% rename from Demos/Extensions/Delphi Class 1/delphi_class.bdsproj rename to Source/Demos/Extensions/Delphi Class 1/delphi_class.bdsproj diff --git a/Demos/Extensions/Delphi Class 1/delphi_class.dpr b/Source/Demos/Extensions/Delphi Class 1/delphi_class.dpr similarity index 95% rename from Demos/Extensions/Delphi Class 1/delphi_class.dpr rename to Source/Demos/Extensions/Delphi Class 1/delphi_class.dpr index f5c05c2..5b64f71 100644 --- a/Demos/Extensions/Delphi Class 1/delphi_class.dpr +++ b/Source/Demos/Extensions/Delphi Class 1/delphi_class.dpr @@ -1,16 +1,16 @@ -library delphi_class; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - delphi_class_module in 'delphi_class_module.pas' {PHDelphiPExtension: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHDelphiPExtension, PHDelphiPExtension); - Application.Run; +library delphi_class; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + delphi_class_module in 'delphi_class_module.pas' {PHDelphiPExtension: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHDelphiPExtension, PHDelphiPExtension); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/Delphi Class 1/delphi_class.php b/Source/Demos/Extensions/Delphi Class 1/delphi_class.php similarity index 93% rename from Demos/Extensions/Delphi Class 1/delphi_class.php rename to Source/Demos/Extensions/Delphi Class 1/delphi_class.php index cab7d63..524c9da 100644 --- a/Demos/Extensions/Delphi Class 1/delphi_class.php +++ b/Source/Demos/Extensions/Delphi Class 1/delphi_class.php @@ -1,15 +1,15 @@ - - + + diff --git a/Demos/Extensions/Delphi Class 1/delphi_class.res b/Source/Demos/Extensions/Delphi Class 1/delphi_class.res similarity index 100% rename from Demos/Extensions/Delphi Class 1/delphi_class.res rename to Source/Demos/Extensions/Delphi Class 1/delphi_class.res diff --git a/Demos/Extensions/Delphi Class 1/delphi_class_module.ddp b/Source/Demos/Extensions/Delphi Class 1/delphi_class_module.ddp similarity index 100% rename from Demos/Extensions/Delphi Class 1/delphi_class_module.ddp rename to Source/Demos/Extensions/Delphi Class 1/delphi_class_module.ddp diff --git a/Demos/Extensions/Delphi Class 1/delphi_class_module.dfm b/Source/Demos/Extensions/Delphi Class 1/delphi_class_module.dfm similarity index 95% rename from Demos/Extensions/Delphi Class 1/delphi_class_module.dfm rename to Source/Demos/Extensions/Delphi Class 1/delphi_class_module.dfm index 2ad6291..556ee25 100644 --- a/Demos/Extensions/Delphi Class 1/delphi_class_module.dfm +++ b/Source/Demos/Extensions/Delphi Class 1/delphi_class_module.dfm @@ -1,91 +1,91 @@ -object PHDelphiPExtension: TPHDelphiPExtension - OldCreateOrder = False - OnCreate = PHPExtensionCreate - Version = '1.0' - Functions = < - item - FunctionName = 'delphi_class_create' - Tag = 0 - Parameters = < - item - Name = 'ClassName' - ParamType = tpString - end - item - Name = 'ComponentName' - ParamType = tpString - end> - OnExecute = ClassCreateExecute - end - item - FunctionName = 'delphi_get_prop' - Tag = 0 - Parameters = < - item - Name = 'Instance' - ParamType = tpInteger - end - item - Name = 'PropName' - ParamType = tpString - end> - OnExecute = GetPropertyExecute - end - item - FunctionName = 'delphi_class_free' - Tag = 0 - Parameters = < - item - Name = 'Instance' - ParamType = tpInteger - end> - OnExecute = ClassFreeExecute - end - item - FunctionName = 'delphi_set_prop' - Tag = 0 - Parameters = < - item - Name = 'Instance' - ParamType = tpInteger - end - item - Name = 'PropName' - ParamType = tpString - end - item - Name = 'PropValue' - ParamType = tpString - end> - OnExecute = SetPropertyExecute - end - item - FunctionName = 'delphi_form_create' - Tag = 0 - Parameters = < - item - Name = 'ClassName' - ParamType = tpString - end - item - Name = 'ComponentName' - ParamType = tpString - end> - OnExecute = FormCreateExecute - end - item - FunctionName = 'delphi_message' - Tag = 0 - Parameters = < - item - Name = 'Message' - ParamType = tpString - end> - OnExecute = DelphiMessageExecute - end> - ModuleName = 'delphi_class' - Left = 285 - Top = 161 - Height = 479 - Width = 741 -end +object PHDelphiPExtension: TPHDelphiPExtension + OldCreateOrder = False + OnCreate = PHPExtensionCreate + Version = '1.0' + Functions = < + item + FunctionName = 'delphi_class_create' + Tag = 0 + Parameters = < + item + Name = 'ClassName' + ParamType = tpString + end + item + Name = 'ComponentName' + ParamType = tpString + end> + OnExecute = ClassCreateExecute + end + item + FunctionName = 'delphi_get_prop' + Tag = 0 + Parameters = < + item + Name = 'Instance' + ParamType = tpInteger + end + item + Name = 'PropName' + ParamType = tpString + end> + OnExecute = GetPropertyExecute + end + item + FunctionName = 'delphi_class_free' + Tag = 0 + Parameters = < + item + Name = 'Instance' + ParamType = tpInteger + end> + OnExecute = ClassFreeExecute + end + item + FunctionName = 'delphi_set_prop' + Tag = 0 + Parameters = < + item + Name = 'Instance' + ParamType = tpInteger + end + item + Name = 'PropName' + ParamType = tpString + end + item + Name = 'PropValue' + ParamType = tpString + end> + OnExecute = SetPropertyExecute + end + item + FunctionName = 'delphi_form_create' + Tag = 0 + Parameters = < + item + Name = 'ClassName' + ParamType = tpString + end + item + Name = 'ComponentName' + ParamType = tpString + end> + OnExecute = FormCreateExecute + end + item + FunctionName = 'delphi_message' + Tag = 0 + Parameters = < + item + Name = 'Message' + ParamType = tpString + end> + OnExecute = DelphiMessageExecute + end> + ModuleName = 'delphi_class' + Left = 285 + Top = 161 + Height = 479 + Width = 741 +end diff --git a/Demos/Extensions/Delphi Class 1/delphi_class_module.dti b/Source/Demos/Extensions/Delphi Class 1/delphi_class_module.dti similarity index 92% rename from Demos/Extensions/Delphi Class 1/delphi_class_module.dti rename to Source/Demos/Extensions/Delphi Class 1/delphi_class_module.dti index 165f1af..5187263 100644 --- a/Demos/Extensions/Delphi Class 1/delphi_class_module.dti +++ b/Source/Demos/Extensions/Delphi Class 1/delphi_class_module.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=285 -Top=161 -Width=741 -Height=479 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=PHDelphiPExtension\PHDelphiPExtension.Functions - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHDelphiPExtension\PHDelphiPExtension.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Extensions/Delphi Class 1/delphi_class_module.pas b/Source/Demos/Extensions/Delphi Class 1/delphi_class_module.pas similarity index 96% rename from Demos/Extensions/Delphi Class 1/delphi_class_module.pas rename to Source/Demos/Extensions/Delphi Class 1/delphi_class_module.pas index 2ee6ce4..94b4902 100644 --- a/Demos/Extensions/Delphi Class 1/delphi_class_module.pas +++ b/Source/Demos/Extensions/Delphi Class 1/delphi_class_module.pas @@ -1,341 +1,341 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{ This example is suitable only for Delphi 7 or higher } -{*******************************************************} -{$I PHP.INC} - -unit delphi_class_module; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - Dialogs, - TypInfo, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - stdctrls, - phpFunctions, - PHPModules; - -type - - TPHDelphiPExtension = class(TPHPExtension) - procedure DelphiMessageExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - procedure FormCreateExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - procedure SetPropertyExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - procedure ClassFreeExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - procedure PHPExtensionCreate(Sender: TObject); - procedure GetPropertyExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - procedure ClassCreateExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - - -{$IFDEF VERSION7} -type -{$METHODINFO ON} - TPHPButton = class(TButton) - private - FScriptText: string; - procedure SetScriptText(const Value: string); - public - function GetClassName : String; - procedure Click; override; - published - property Parent; - property ScriptText : string read FScriptText write SetScriptText; - end; - - TPHPForm = class(TCustomForm) - public - procedure Show; - function ShowModal: Integer; override; - published - property Action; - property ActiveControl; - property Align; - property AlphaBlend default False; - property AlphaBlendValue default 255; - property Anchors; - property AutoScroll; - property AutoSize; - property BiDiMode; - property BorderIcons; - property BorderStyle; - property BorderWidth; - property Caption; - property ClientHeight; - property ClientWidth; - property Color; - property TransparentColor default False; - property TransparentColorValue default 0; - property Constraints; - property Ctl3D; - property UseDockManager; - property DefaultMonitor; - property DockSite; - property DragKind; - property DragMode; - property Enabled; - property ParentFont default False; - property Font; - property FormStyle; - property Height; - property HelpFile; - property HorzScrollBar; - property Icon; - property KeyPreview; - property Menu; - property OldCreateOrder; - property ObjectMenuItem; - property ParentBiDiMode; - property PixelsPerInch; - property PopupMenu; - property Position; - property PrintScale; - property Scaled; - property ScreenSnap default False; - property ShowHint; - property SnapBuffer default 10; - property VertScrollBar; - property Visible; - property Width; - property WindowState; - property WindowMenu; - property OnActivate; - property OnCanResize; - property OnClick; - property OnClose; - property OnCloseQuery; - property OnConstrainedResize; - property OnContextPopup; - property OnCreate; - property OnDblClick; - property OnDestroy; - property OnDeactivate; - property OnDockDrop; - property OnDockOver; - property OnDragDrop; - property OnDragOver; - property OnEndDock; - property OnGetSiteInfo; - property OnHide; - property OnHelp; - property OnKeyDown; - property OnKeyPress; - property OnKeyUp; - property OnMouseDown; - property OnMouseMove; - property OnMouseUp; - property OnMouseWheel; - property OnMouseWheelDown; - property OnMouseWheelUp; - property OnPaint; - property OnResize; - property OnShortCut; - property OnShow; - property OnStartDock; - property OnUnDock; - end; -{$METHODINFO OFF} -{$ENDIF} - -var - PHDelphiPExtension: TPHDelphiPExtension; - -implementation - -{$R *.DFM} - -procedure TPHDelphiPExtension.ClassCreateExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - -var - CN : string; - DC : TComponentClass; - PC : TPersistentClass; - obj : TComponent; -begin - CN := Parameters[0].ZendVariable.AsString; - if CN = '' then - begin - ReturnValue := 0; - Exit; - end; - - PC := FindClass(CN); - if PC.InheritsFrom(TComponent) then - DC := TComponentClass(PC) - else - begin - ReturnValue := 0; - Exit; - end; - //create Delphi class instance - - if DC <> nil then - begin - obj := DC.Create(nil); - obj.Name := Parameters[1].ZendVariable.AsString; - ReturnValue := integer(Obj); - end - else - ReturnValue := 0; -end; - -procedure TPHDelphiPExtension.GetPropertyExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - Obj : TObject; - PN : String; -begin - obj := TObject(Parameters[0].ZendVariable.AsInteger); - PN := Parameters[1].ZendVariable.AsString; - ReturnValue := GetPropValue(Obj, PN, true); -end; - -procedure TPHDelphiPExtension.ClassFreeExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - TObject(Parameters[0].ZendVariable.AsInteger).Free; -end; - -procedure TPHDelphiPExtension.SetPropertyExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - Obj : TObject; - PN : String; -begin - obj := TObject(Parameters[0].ZendVariable.AsInteger); - PN := Parameters[1].ZendVariable.AsString; - SetPropValue(Obj, PN, Parameters[2].Value ); -end; - -procedure TPHDelphiPExtension.FormCreateExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - CN : string; - PC : TPersistentClass; - obj : TComponent; -begin - CN := Parameters[0].ZendVariable.AsString; - if CN = '' then - begin - ReturnValue := 0; - Exit; - end; - - PC := FindClass(CN); - if not PC.InheritsFrom(TCustomForm) then - begin - ReturnValue := 0; - Exit; - end; - //create Delphi class instance - - if PC <> nil then - begin - obj := TCustomFormClass(PC).CreateNew(nil); - obj.Name := Parameters[1].ZendVariable.AsString; - ReturnValue := integer(Obj); - end - else - ReturnValue := 0; -end; - -procedure TPHDelphiPExtension.DelphiMessageExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - ShowMessage(Parameters[0].ZendVariable.AsString); -end; - -procedure TPHDelphiPExtension.PHPExtensionCreate(Sender: TObject); -begin - {$IFDEF VERSION7} - RegisterClass(TButton); - RegisterClass(TPHPButton); - RegisterClass(TPHPForm); - {$ENDIF} -end; - -{$IFDEF VERSION7} -{ TPHPButton } - -function TPHPButton.GetClassName: String; -begin - Result := ClassName; -end; - - -procedure TPHPButton.Click; -begin - inherited; - if FScriptText <> '' then - begin - zend_eval_string(PChar(FScriptText), nil, 'delphi', ts_resource(0)); - end; -end; - -procedure TPHPButton.SetScriptText(const Value: string); -var - L : integer; -begin - if FScriptText <> Value then - begin - L := Length(Value); - SetLength(FScriptText, L); - Move(Value[1], FScriptText[1], L); - end; -end; - -{ TPHPForm } - -procedure TPHPForm.Show; -begin - inherited Show; -end; - -function TPHPForm.ShowModal: Integer; -begin - Result := inherited ShowModal; -end; - -{$ENDIF} - -end. - - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{ This example is suitable only for Delphi 7 or higher } +{*******************************************************} +{$I PHP.INC} + +unit delphi_class_module; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + Dialogs, + TypInfo, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + stdctrls, + phpFunctions, + PHPModules; + +type + + TPHDelphiPExtension = class(TPHPExtension) + procedure DelphiMessageExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure FormCreateExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure SetPropertyExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure ClassFreeExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure PHPExtensionCreate(Sender: TObject); + procedure GetPropertyExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + procedure ClassCreateExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + + +{$IFDEF VERSION7} +type +{$METHODINFO ON} + TPHPButton = class(TButton) + private + FScriptText: string; + procedure SetScriptText(const Value: string); + public + function GetClassName : String; + procedure Click; override; + published + property Parent; + property ScriptText : string read FScriptText write SetScriptText; + end; + + TPHPForm = class(TCustomForm) + public + procedure Show; + function ShowModal: Integer; override; + published + property Action; + property ActiveControl; + property Align; + property AlphaBlend default False; + property AlphaBlendValue default 255; + property Anchors; + property AutoScroll; + property AutoSize; + property BiDiMode; + property BorderIcons; + property BorderStyle; + property BorderWidth; + property Caption; + property ClientHeight; + property ClientWidth; + property Color; + property TransparentColor default False; + property TransparentColorValue default 0; + property Constraints; + property Ctl3D; + property UseDockManager; + property DefaultMonitor; + property DockSite; + property DragKind; + property DragMode; + property Enabled; + property ParentFont default False; + property Font; + property FormStyle; + property Height; + property HelpFile; + property HorzScrollBar; + property Icon; + property KeyPreview; + property Menu; + property OldCreateOrder; + property ObjectMenuItem; + property ParentBiDiMode; + property PixelsPerInch; + property PopupMenu; + property Position; + property PrintScale; + property Scaled; + property ScreenSnap default False; + property ShowHint; + property SnapBuffer default 10; + property VertScrollBar; + property Visible; + property Width; + property WindowState; + property WindowMenu; + property OnActivate; + property OnCanResize; + property OnClick; + property OnClose; + property OnCloseQuery; + property OnConstrainedResize; + property OnContextPopup; + property OnCreate; + property OnDblClick; + property OnDestroy; + property OnDeactivate; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnGetSiteInfo; + property OnHide; + property OnHelp; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMouseWheel; + property OnMouseWheelDown; + property OnMouseWheelUp; + property OnPaint; + property OnResize; + property OnShortCut; + property OnShow; + property OnStartDock; + property OnUnDock; + end; +{$METHODINFO OFF} +{$ENDIF} + +var + PHDelphiPExtension: TPHDelphiPExtension; + +implementation + +{$R *.DFM} + +procedure TPHDelphiPExtension.ClassCreateExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + +var + CN : string; + DC : TComponentClass; + PC : TPersistentClass; + obj : TComponent; +begin + CN := Parameters[0].ZendVariable.AsString; + if CN = '' then + begin + ReturnValue := 0; + Exit; + end; + + PC := FindClass(CN); + if PC.InheritsFrom(TComponent) then + DC := TComponentClass(PC) + else + begin + ReturnValue := 0; + Exit; + end; + //create Delphi class instance + + if DC <> nil then + begin + obj := DC.Create(nil); + obj.Name := Parameters[1].ZendVariable.AsString; + ReturnValue := integer(Obj); + end + else + ReturnValue := 0; +end; + +procedure TPHDelphiPExtension.GetPropertyExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + Obj : TObject; + PN : String; +begin + obj := TObject(Parameters[0].ZendVariable.AsInteger); + PN := Parameters[1].ZendVariable.AsString; + ReturnValue := GetPropValue(Obj, PN, true); +end; + +procedure TPHDelphiPExtension.ClassFreeExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + TObject(Parameters[0].ZendVariable.AsInteger).Free; +end; + +procedure TPHDelphiPExtension.SetPropertyExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + Obj : TObject; + PN : String; +begin + obj := TObject(Parameters[0].ZendVariable.AsInteger); + PN := Parameters[1].ZendVariable.AsString; + SetPropValue(Obj, PN, Parameters[2].Value ); +end; + +procedure TPHDelphiPExtension.FormCreateExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + CN : string; + PC : TPersistentClass; + obj : TComponent; +begin + CN := Parameters[0].ZendVariable.AsString; + if CN = '' then + begin + ReturnValue := 0; + Exit; + end; + + PC := FindClass(CN); + if not PC.InheritsFrom(TCustomForm) then + begin + ReturnValue := 0; + Exit; + end; + //create Delphi class instance + + if PC <> nil then + begin + obj := TCustomFormClass(PC).CreateNew(nil); + obj.Name := Parameters[1].ZendVariable.AsString; + ReturnValue := integer(Obj); + end + else + ReturnValue := 0; +end; + +procedure TPHDelphiPExtension.DelphiMessageExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ShowMessage(Parameters[0].ZendVariable.AsString); +end; + +procedure TPHDelphiPExtension.PHPExtensionCreate(Sender: TObject); +begin + {$IFDEF VERSION7} + RegisterClass(TButton); + RegisterClass(TPHPButton); + RegisterClass(TPHPForm); + {$ENDIF} +end; + +{$IFDEF VERSION7} +{ TPHPButton } + +function TPHPButton.GetClassName: String; +begin + Result := ClassName; +end; + + +procedure TPHPButton.Click; +begin + inherited; + if FScriptText <> '' then + begin + zend_eval_string(PChar(FScriptText), nil, 'delphi', ts_resource(0)); + end; +end; + +procedure TPHPButton.SetScriptText(const Value: string); +var + L : integer; +begin + if FScriptText <> Value then + begin + L := Length(Value); + SetLength(FScriptText, L); + Move(Value[1], FScriptText[1], L); + end; +end; + +{ TPHPForm } + +procedure TPHPForm.Show; +begin + inherited Show; +end; + +function TPHPForm.ShowModal: Integer; +begin + Result := inherited ShowModal; +end; + +{$ENDIF} + +end. + + diff --git a/Demos/Extensions/Delphi Class 1/readme.txt b/Source/Demos/Extensions/Delphi Class 1/readme.txt similarity index 100% rename from Demos/Extensions/Delphi Class 1/readme.txt rename to Source/Demos/Extensions/Delphi Class 1/readme.txt diff --git a/Demos/Extensions/Delphi Class 2/delphi_class.php b/Source/Demos/Extensions/Delphi Class 2/delphi_class.php similarity index 94% rename from Demos/Extensions/Delphi Class 2/delphi_class.php rename to Source/Demos/Extensions/Delphi Class 2/delphi_class.php index 09355f3..a11c098 100644 --- a/Demos/Extensions/Delphi Class 2/delphi_class.php +++ b/Source/Demos/Extensions/Delphi Class 2/delphi_class.php @@ -1,42 +1,42 @@ -Caption = "Cancel"; -echo $b->caption; - -echo "\n"; - -echo $b->GetClassName(); - - -$f = delphi_form_create("TPHPForm", "MyForm"); -$form = register_delphi_object($f); -$form->Caption = "This is a Delphi form!"; -$form->BorderStyle = 3; -$form->Color = 333; -$form->Position = 4; -$b->Parent = $f; -$b->Left = 20; -$b->Top = 50; -$b->ScriptText = "delphi_message('Hello');"; -$form->ShowModal(); - -delphi_class_free($a); -delphi_class_free($f); - -?> - +Caption = "Cancel"; +echo $b->caption; + +echo "\n"; + +echo $b->GetClassName(); + + +$f = delphi_form_create("TPHPForm", "MyForm"); +$form = register_delphi_object($f); +$form->Caption = "This is a Delphi form!"; +$form->BorderStyle = 3; +$form->Color = 333; +$form->Position = 4; +$b->Parent = $f; +$b->Left = 20; +$b->Top = 50; +$b->ScriptText = "delphi_message('Hello');"; +$form->ShowModal(); + +delphi_class_free($a); +delphi_class_free($f); + +?> + diff --git a/Demos/Extensions/Delphi Class 2/delphi_class2.bdsproj b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.bdsproj similarity index 100% rename from Demos/Extensions/Delphi Class 2/delphi_class2.bdsproj rename to Source/Demos/Extensions/Delphi Class 2/delphi_class2.bdsproj diff --git a/Demos/Extensions/Delphi Class 2/delphi_class2.dpr b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr similarity index 96% rename from Demos/Extensions/Delphi Class 2/delphi_class2.dpr rename to Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr index 96005e8..bc1d2d8 100644 --- a/Demos/Extensions/Delphi Class 2/delphi_class2.dpr +++ b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr @@ -1,146 +1,146 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{$I php.inc} - -library delphi_class2; - -uses - Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI, DelphiFunctions; - - -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PAnsiChar('Delphi classes support'), PAnsiChar('enabled')); - php_info_print_table_end(); -end; - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RegisterInternalClasses(TSRMLS_DC); - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - - - -var - moduleEntry : Tzend_module_entry; - DelphiTable : array [0..12] of zend_function_entry; - - -procedure InitDelphiFunctions; -begin - PHP_FUNCTION(DelphiTable[0], 'delphi_date', @delphi_date); - PHP_FUNCTION(DelphiTable[1], 'delphi_extract_file_dir', @delphi_extract_file_dir); - PHP_FUNCTION(DelphiTable[2], 'delphi_extract_file_drive', @delphi_extract_file_drive); - PHP_FUNCTION(DelphiTable[3], 'delphi_extract_file_name', @delphi_extract_file_name); - - DelphiTable[4].fname := 'delphi_extract_file_ext'; - DelphiTable[4].handler := @delphi_extract_file_ext; - {$IFDEF PHP4} - DelphiTable[4].func_arg_types := nil; - {$ELSE} - DelphiTable[4].arg_info := nil; - {$ENDIF} - - DelphiTable[5].fname := 'delphi_show_message'; - DelphiTable[5].handler := @delphi_show_message; - {$IFDEF PHP4} - DelphiTable[5].func_arg_types := nil; - {$ELSE} - DelphiTable[5].arg_info := nil; - {$ENDIF} - - DelphiTable[6].fname := 'register_delphi_object'; - delphitable[6].handler := @register_delphi_object; - {$IFDEF PHP4} - DelphiTable[6].func_arg_types := nil; - {$ELSE} - DelphiTable[6].arg_info := nil; - {$ENDIF} - - DelphiTable[7].fname := 'delphi_get_author'; - DelphiTable[7].handler := @delphi_get_author; - {$IFDEF PHP4} - DelphiTable[7].func_arg_types := nil; - {$ELSE} - DelphiTable[7].arg_info := nil; - {$ENDIF} - - DelphiTable[8].fname := 'delphi_str_date'; - DelphiTable[8].handler := @delphi_str_date; - {$IFDEF PHP4} - DelphiTable[8].func_arg_types := nil; - {$ELSE} - DelphiTable[8].arg_info := nil; - {$ENDIF} - - - PHP_FUNCTION(DelphiTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); - - - PHP_FUNCTION(DelphiTable[10], 'delphi_input_box', @delphi_input_box); - PHP_FUNCTION(DelphiTable[11], 'register_delphi_component', @register_delphi_component); - DelphiTable[12].fname := nil; - DelphiTable[12].handler := nil; -end; - -function get_module : Pzend_module_entry; cdecl; -begin - if not PHPLoaded then - LoadPHP; - InitDelphiFunctions; - ModuleEntry.size := sizeof(Tzend_module_entry); - ModuleEntry.zend_api := ZEND_MODULE_API_NO; - ModuleEntry.zts := USING_ZTS; - ModuleEntry.Name := 'delphi_class2'; - ModuleEntry.version := '1.0'; - ModuleEntry.module_startup_func := @minit; - ModuleEntry.module_shutdown_func := @mshutdown; - ModuleEntry.request_startup_func := @rinit; - ModuleEntry.request_shutdown_func := @rshutdown; - ModuleEntry.info_func := @php_info_module; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} - ModuleEntry.functions := @DelphiTable[0]; - ModuleEntry._type := MODULE_PERSISTENT; - {$IFDEF PHP530} - {$IFNDEF COMPILER_VC9} - moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ELSE} - moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ENDIF} - {$ENDIF} - Result := @ModuleEntry; -end; - - - -exports - get_module; - -end. - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{$I php.inc} + +library delphi_class2; + +uses + Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI, DelphiFunctions; + + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('Delphi classes support'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RegisterInternalClasses(TSRMLS_DC); + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + + + +var + moduleEntry : Tzend_module_entry; + DelphiTable : array [0..12] of zend_function_entry; + + +procedure InitDelphiFunctions; +begin + PHP_FUNCTION(DelphiTable[0], 'delphi_date', @delphi_date); + PHP_FUNCTION(DelphiTable[1], 'delphi_extract_file_dir', @delphi_extract_file_dir); + PHP_FUNCTION(DelphiTable[2], 'delphi_extract_file_drive', @delphi_extract_file_drive); + PHP_FUNCTION(DelphiTable[3], 'delphi_extract_file_name', @delphi_extract_file_name); + + DelphiTable[4].fname := 'delphi_extract_file_ext'; + DelphiTable[4].handler := @delphi_extract_file_ext; + {$IFDEF PHP4} + DelphiTable[4].func_arg_types := nil; + {$ELSE} + DelphiTable[4].arg_info := nil; + {$ENDIF} + + DelphiTable[5].fname := 'delphi_show_message'; + DelphiTable[5].handler := @delphi_show_message; + {$IFDEF PHP4} + DelphiTable[5].func_arg_types := nil; + {$ELSE} + DelphiTable[5].arg_info := nil; + {$ENDIF} + + DelphiTable[6].fname := 'register_delphi_object'; + delphitable[6].handler := @register_delphi_object; + {$IFDEF PHP4} + DelphiTable[6].func_arg_types := nil; + {$ELSE} + DelphiTable[6].arg_info := nil; + {$ENDIF} + + DelphiTable[7].fname := 'delphi_get_author'; + DelphiTable[7].handler := @delphi_get_author; + {$IFDEF PHP4} + DelphiTable[7].func_arg_types := nil; + {$ELSE} + DelphiTable[7].arg_info := nil; + {$ENDIF} + + DelphiTable[8].fname := 'delphi_str_date'; + DelphiTable[8].handler := @delphi_str_date; + {$IFDEF PHP4} + DelphiTable[8].func_arg_types := nil; + {$ELSE} + DelphiTable[8].arg_info := nil; + {$ENDIF} + + + PHP_FUNCTION(DelphiTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); + + + PHP_FUNCTION(DelphiTable[10], 'delphi_input_box', @delphi_input_box); + PHP_FUNCTION(DelphiTable[11], 'register_delphi_component', @register_delphi_component); + DelphiTable[12].fname := nil; + DelphiTable[12].handler := nil; +end; + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + InitDelphiFunctions; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'delphi_class2'; + ModuleEntry.version := '1.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @DelphiTable[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos/Extensions/Delphi Class 2/delphi_class2.php b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.php similarity index 93% rename from Demos/Extensions/Delphi Class 2/delphi_class2.php rename to Source/Demos/Extensions/Delphi Class 2/delphi_class2.php index bbcc7fc..6c0f3a8 100644 --- a/Demos/Extensions/Delphi Class 2/delphi_class2.php +++ b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.php @@ -1,26 +1,26 @@ -caption = "Cancel"; -echo $b->caption; - -echo "\n"; - -delphi_class_free($a); - -?> - +caption = "Cancel"; +echo $b->caption; + +echo "\n"; + +delphi_class_free($a); + +?> + diff --git a/Demos/Extensions/Delphi Class 2/readme.txt b/Source/Demos/Extensions/Delphi Class 2/readme.txt similarity index 100% rename from Demos/Extensions/Delphi Class 2/readme.txt rename to Source/Demos/Extensions/Delphi Class 2/readme.txt diff --git a/Demos/Extensions/Math/delphi_math.bdsproj b/Source/Demos/Extensions/Math/delphi_math.bdsproj similarity index 100% rename from Demos/Extensions/Math/delphi_math.bdsproj rename to Source/Demos/Extensions/Math/delphi_math.bdsproj diff --git a/Demos/Extensions/Math/delphi_math.dpr b/Source/Demos/Extensions/Math/delphi_math.dpr similarity index 94% rename from Demos/Extensions/Math/delphi_math.dpr rename to Source/Demos/Extensions/Math/delphi_math.dpr index 27628fd..bbab1b8 100644 --- a/Demos/Extensions/Math/delphi_math.dpr +++ b/Source/Demos/Extensions/Math/delphi_math.dpr @@ -1,16 +1,16 @@ -library delphi_math; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - extmain in 'extmain.pas' {MathExtension: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TMathExtension, MathExtension); - Application.Run; +library delphi_math; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + extmain in 'extmain.pas' {MathExtension: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TMathExtension, MathExtension); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/Math/delphi_math.res b/Source/Demos/Extensions/Math/delphi_math.res similarity index 100% rename from Demos/Extensions/Math/delphi_math.res rename to Source/Demos/Extensions/Math/delphi_math.res diff --git a/Demos/Extensions/Math/extmain.ddp b/Source/Demos/Extensions/Math/extmain.ddp similarity index 100% rename from Demos/Extensions/Math/extmain.ddp rename to Source/Demos/Extensions/Math/extmain.ddp diff --git a/Demos/Extensions/Math/extmain.dfm b/Source/Demos/Extensions/Math/extmain.dfm similarity index 95% rename from Demos/Extensions/Math/extmain.dfm rename to Source/Demos/Extensions/Math/extmain.dfm index 8b9145d..0d81aa0 100644 --- a/Demos/Extensions/Math/extmain.dfm +++ b/Source/Demos/Extensions/Math/extmain.dfm @@ -1,50 +1,50 @@ -object MathExtension: TMathExtension - OldCreateOrder = False - Version = '1.0' - Functions = < - item - FunctionName = 'delphi_sin' - Tag = 0 - Parameters = < - item - Name = 'X' - ParamType = tpFloat - end> - OnExecute = SinExecute - end - item - FunctionName = 'delphi_cosh' - Tag = 0 - Parameters = < - item - Name = 'X' - ParamType = tpFloat - end> - OnExecute = CoshExecute - end - item - FunctionName = 'delphi_arcsin' - Tag = 0 - Parameters = < - item - Name = 'X' - ParamType = tpFloat - end> - OnExecute = ArcsinExecute - end - item - FunctionName = 'delphi_arccosh' - Tag = 0 - Parameters = < - item - Name = 'X' - ParamType = tpFloat - end> - OnExecute = ArccoshExecute - end> - ModuleName = 'delphi_math' - Left = 619 - Top = 344 - Height = 266 - Width = 269 -end +object MathExtension: TMathExtension + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'delphi_sin' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end> + OnExecute = SinExecute + end + item + FunctionName = 'delphi_cosh' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end> + OnExecute = CoshExecute + end + item + FunctionName = 'delphi_arcsin' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end> + OnExecute = ArcsinExecute + end + item + FunctionName = 'delphi_arccosh' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end> + OnExecute = ArccoshExecute + end> + ModuleName = 'delphi_math' + Left = 619 + Top = 344 + Height = 266 + Width = 269 +end diff --git a/Demos/Extensions/Math/extmain.dti b/Source/Demos/Extensions/Math/extmain.dti similarity index 92% rename from Demos/Extensions/Math/extmain.dti rename to Source/Demos/Extensions/Math/extmain.dti index 6e658e8..978bf1b 100644 --- a/Demos/Extensions/Math/extmain.dti +++ b/Source/Demos/Extensions/Math/extmain.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=285 -Top=161 -Width=741 -Height=479 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=MathExtension\MathExtension.Functions - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=MathExtension\MathExtension.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Extensions/Math/extmain.pas b/Source/Demos/Extensions/Math/extmain.pas similarity index 96% rename from Demos/Extensions/Math/extmain.pas rename to Source/Demos/Extensions/Math/extmain.pas index 764d387..ddb3402 100644 --- a/Demos/Extensions/Math/extmain.pas +++ b/Source/Demos/Extensions/Math/extmain.pas @@ -1,86 +1,86 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: extmain.pas,v 7.0 04/2007 delphi32 Exp $ } - -unit extmain; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules, - math; - -type - - TMathExtension = class(TPHPExtension) - procedure SinExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure CoshExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure ArcsinExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure ArccoshExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - MathExtension: TMathExtension; - -implementation - -{$R *.DFM} - -procedure TMathExtension.SinExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - ReturnValue := Sin(Parameters[0].ZendVariable.AsFloat); -end; - -procedure TMathExtension.CoshExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - ReturnValue := Cosh(Parameters[0].Value); -end; - -procedure TMathExtension.ArcsinExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - ReturnValue := ArcSin(Parameters[0].value); -end; - -procedure TMathExtension.ArccoshExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - ReturnValue := ArcCosh(Parameters[0].ZendVariable.AsFloat); -end; - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: extmain.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit extmain; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules, + math; + +type + + TMathExtension = class(TPHPExtension) + procedure SinExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure CoshExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure ArcsinExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure ArccoshExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + MathExtension: TMathExtension; + +implementation + +{$R *.DFM} + +procedure TMathExtension.SinExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue := Sin(Parameters[0].ZendVariable.AsFloat); +end; + +procedure TMathExtension.CoshExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue := Cosh(Parameters[0].Value); +end; + +procedure TMathExtension.ArcsinExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue := ArcSin(Parameters[0].value); +end; + +procedure TMathExtension.ArccoshExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ReturnValue := ArcCosh(Parameters[0].ZendVariable.AsFloat); +end; + end. \ No newline at end of file diff --git a/Demos/Extensions/Math/test_math.php b/Source/Demos/Extensions/Math/test_math.php similarity index 94% rename from Demos/Extensions/Math/test_math.php rename to Source/Demos/Extensions/Math/test_math.php index 00ca0a6..bbd4dfe 100644 --- a/Demos/Extensions/Math/test_math.php +++ b/Source/Demos/Extensions/Math/test_math.php @@ -1,30 +1,30 @@ -\n"; -foreach($functions as $func) { - echo $func."
\n"; -} - -?> +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} + +?> diff --git a/Demos/Extensions/Read array parameters/Unit1.ddp b/Source/Demos/Extensions/Read array parameters/Unit1.ddp similarity index 100% rename from Demos/Extensions/Read array parameters/Unit1.ddp rename to Source/Demos/Extensions/Read array parameters/Unit1.ddp diff --git a/Demos/Extensions/Read array parameters/Unit1.dfm b/Source/Demos/Extensions/Read array parameters/Unit1.dfm similarity index 100% rename from Demos/Extensions/Read array parameters/Unit1.dfm rename to Source/Demos/Extensions/Read array parameters/Unit1.dfm diff --git a/Demos/Extensions/Read array parameters/Unit1.pas b/Source/Demos/Extensions/Read array parameters/Unit1.pas similarity index 100% rename from Demos/Extensions/Read array parameters/Unit1.pas rename to Source/Demos/Extensions/Read array parameters/Unit1.pas diff --git a/Demos/Extensions/Read array parameters/rarp.bdsproj b/Source/Demos/Extensions/Read array parameters/rarp.bdsproj similarity index 100% rename from Demos/Extensions/Read array parameters/rarp.bdsproj rename to Source/Demos/Extensions/Read array parameters/rarp.bdsproj diff --git a/Demos/Extensions/Read array parameters/rarp.dpr b/Source/Demos/Extensions/Read array parameters/rarp.dpr similarity index 100% rename from Demos/Extensions/Read array parameters/rarp.dpr rename to Source/Demos/Extensions/Read array parameters/rarp.dpr diff --git a/Demos/Extensions/Read array parameters/rarp.res b/Source/Demos/Extensions/Read array parameters/rarp.res similarity index 100% rename from Demos/Extensions/Read array parameters/rarp.res rename to Source/Demos/Extensions/Read array parameters/rarp.res diff --git a/Demos/Extensions/Read array parameters/rarptest.php b/Source/Demos/Extensions/Read array parameters/rarptest.php similarity index 100% rename from Demos/Extensions/Read array parameters/rarptest.php rename to Source/Demos/Extensions/Read array parameters/rarptest.php diff --git a/Demos/Extensions/Resources/Unit1.ddp b/Source/Demos/Extensions/Resources/Unit1.ddp similarity index 100% rename from Demos/Extensions/Resources/Unit1.ddp rename to Source/Demos/Extensions/Resources/Unit1.ddp diff --git a/Demos/Extensions/Resources/Unit1.dfm b/Source/Demos/Extensions/Resources/Unit1.dfm similarity index 95% rename from Demos/Extensions/Resources/Unit1.dfm rename to Source/Demos/Extensions/Resources/Unit1.dfm index c04518d..a7b9ee7 100644 --- a/Demos/Extensions/Resources/Unit1.dfm +++ b/Source/Demos/Extensions/Resources/Unit1.dfm @@ -1,27 +1,27 @@ -object res_module: Tres_module - OldCreateOrder = False - Version = '0.0' - Functions = < - item - FunctionName = 'res_create' - Tag = 0 - Parameters = <> - OnExecute = PHPExtension1Functions0Execute - end - item - FunctionName = 'res_get' - Tag = 0 - Parameters = < - item - Name = 'Param1' - ParamType = tpInteger - end> - OnExecute = PHPExtension1Functions1Execute - end> - ModuleName = 'res_ext' - OnModuleInit = PHPExtensionModuleInit - Left = 192 - Top = 160 - Height = 150 - Width = 215 -end +object res_module: Tres_module + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'res_create' + Tag = 0 + Parameters = <> + OnExecute = PHPExtension1Functions0Execute + end + item + FunctionName = 'res_get' + Tag = 0 + Parameters = < + item + Name = 'Param1' + ParamType = tpInteger + end> + OnExecute = PHPExtension1Functions1Execute + end> + ModuleName = 'res_ext' + OnModuleInit = PHPExtensionModuleInit + Left = 192 + Top = 160 + Height = 150 + Width = 215 +end diff --git a/Demos/Extensions/phpDLL/Unit1.dti b/Source/Demos/Extensions/Resources/Unit1.dti similarity index 91% rename from Demos/Extensions/phpDLL/Unit1.dti rename to Source/Demos/Extensions/Resources/Unit1.dti index e053eae..aa0c5c1 100644 --- a/Demos/Extensions/phpDLL/Unit1.dti +++ b/Source/Demos/Extensions/Resources/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=285 -Top=161 -Width=741 -Height=479 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems= - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems= + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Extensions/Resources/Unit1.pas b/Source/Demos/Extensions/Resources/Unit1.pas similarity index 96% rename from Demos/Extensions/Resources/Unit1.pas rename to Source/Demos/Extensions/Resources/Unit1.pas index 35c3fba..09e4e0a 100644 --- a/Demos/Extensions/Resources/Unit1.pas +++ b/Source/Demos/Extensions/Resources/Unit1.pas @@ -1,94 +1,94 @@ -unit Unit1; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - Tres_module = class(TPHPExtension) - procedure PHPExtensionModuleInit(Sender: TObject; TSRMLS_DC: Pointer); - procedure PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - res_module: Tres_module; - -type - PMyResource = ^TMyResource; - TMyResource = record - resource_link : integer; - resource_string : PChar; - end; - -implementation - -{$R *.DFM} - -var - le_myresource : integer; - -const - le_myresource_name = 'My type of resource'; - -procedure my_destructor_handler(rsrc : PZend_rsrc_list_entry; TSRMLS_D : pointer); cdecl; -var - my_resource : PMyResource; -begin - my_resource := rsrc^.ptr; - my_resource.resource_string := nil; -end; - -procedure Tres_module.PHPExtensionModuleInit(Sender: TObject; - TSRMLS_DC: Pointer); -begin - le_myresource := zend_register_list_destructors_ex(@my_destructor_handler, nil, PChar(le_myresource_name), Application.ModuleNumber); -end; - -procedure Tres_module.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - rc : PMyResource; - rn : integer; -begin - rc := emalloc(sizeof(TMyResource)); - rc^.resource_link := 1; - rc^.resource_string := 'Hello'; - rn := zend_register_resource(ZendVar.AsZendVariable, rc, le_myresource); - ZVAL_RESOURCE(ZendVar.AsZendVariable, rn); -end; - -procedure Tres_module.PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - rc : PMyResource; - Z : PZVAL; -begin - Z := Parameters[0].ZendValue; - rc := zend_fetch_resource(@Z, TSRMLS_DC, -1, 'my resource', nil, 1, le_myresource); - ReturnValue := String(rc^.resource_string); -end; - -end. +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + Tres_module = class(TPHPExtension) + procedure PHPExtensionModuleInit(Sender: TObject; TSRMLS_DC: Pointer); + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + res_module: Tres_module; + +type + PMyResource = ^TMyResource; + TMyResource = record + resource_link : integer; + resource_string : PChar; + end; + +implementation + +{$R *.DFM} + +var + le_myresource : integer; + +const + le_myresource_name = 'My type of resource'; + +procedure my_destructor_handler(rsrc : PZend_rsrc_list_entry; TSRMLS_D : pointer); cdecl; +var + my_resource : PMyResource; +begin + my_resource := rsrc^.ptr; + my_resource.resource_string := nil; +end; + +procedure Tres_module.PHPExtensionModuleInit(Sender: TObject; + TSRMLS_DC: Pointer); +begin + le_myresource := zend_register_list_destructors_ex(@my_destructor_handler, nil, PChar(le_myresource_name), Application.ModuleNumber); +end; + +procedure Tres_module.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + rc : PMyResource; + rn : integer; +begin + rc := emalloc(sizeof(TMyResource)); + rc^.resource_link := 1; + rc^.resource_string := 'Hello'; + rn := zend_register_resource(ZendVar.AsZendVariable, rc, le_myresource); + ZVAL_RESOURCE(ZendVar.AsZendVariable, rn); +end; + +procedure Tres_module.PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + rc : PMyResource; + Z : PZVAL; +begin + Z := Parameters[0].ZendValue; + rc := zend_fetch_resource(@Z, TSRMLS_DC, -1, 'my resource', nil, 1, le_myresource); + ReturnValue := String(rc^.resource_string); +end; + +end. diff --git a/Demos/Extensions/Resources/res_ext.bdsproj b/Source/Demos/Extensions/Resources/res_ext.bdsproj similarity index 100% rename from Demos/Extensions/Resources/res_ext.bdsproj rename to Source/Demos/Extensions/Resources/res_ext.bdsproj diff --git a/Demos/Extensions/Resources/res_ext.dpr b/Source/Demos/Extensions/Resources/res_ext.dpr similarity index 94% rename from Demos/Extensions/Resources/res_ext.dpr rename to Source/Demos/Extensions/Resources/res_ext.dpr index 6015dd1..cb198ea 100644 --- a/Demos/Extensions/Resources/res_ext.dpr +++ b/Source/Demos/Extensions/Resources/res_ext.dpr @@ -1,16 +1,16 @@ -library res_ext; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {res_module: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(Tres_module, res_module); - Application.Run; +library res_ext; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {res_module: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(Tres_module, res_module); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/Resources/res_ext.res b/Source/Demos/Extensions/Resources/res_ext.res similarity index 100% rename from Demos/Extensions/Resources/res_ext.res rename to Source/Demos/Extensions/Resources/res_ext.res diff --git a/Demos/Extensions/Resources/test_resource.php b/Source/Demos/Extensions/Resources/test_resource.php similarity index 92% rename from Demos/Extensions/Resources/test_resource.php rename to Source/Demos/Extensions/Resources/test_resource.php index 10e924b..6313579 100644 --- a/Demos/Extensions/Resources/test_resource.php +++ b/Source/Demos/Extensions/Resources/test_resource.php @@ -1,21 +1,21 @@ - + diff --git a/Demos/Extensions/array result/Unit1.ddp b/Source/Demos/Extensions/array result/Unit1.ddp similarity index 100% rename from Demos/Extensions/array result/Unit1.ddp rename to Source/Demos/Extensions/array result/Unit1.ddp diff --git a/Demos/Extensions/array result/Unit1.dfm b/Source/Demos/Extensions/array result/Unit1.dfm similarity index 95% rename from Demos/Extensions/array result/Unit1.dfm rename to Source/Demos/Extensions/array result/Unit1.dfm index c19ced5..36000be 100644 --- a/Demos/Extensions/array result/Unit1.dfm +++ b/Source/Demos/Extensions/array result/Unit1.dfm @@ -1,22 +1,22 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - Version = '0.0' - Functions = < - item - FunctionName = 'get_month_names' - Tag = 0 - Parameters = <> - OnExecute = PHPExtension1Functions0Execute - end - item - FunctionName = 'get_year_info' - Tag = 0 - Parameters = <> - OnExecute = PHPExtension1Functions1Execute - end> - ModuleName = 'rarray' - Left = 311 - Top = 296 - Height = 500 - Width = 624 -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'get_month_names' + Tag = 0 + Parameters = <> + OnExecute = PHPExtension1Functions0Execute + end + item + FunctionName = 'get_year_info' + Tag = 0 + Parameters = <> + OnExecute = PHPExtension1Functions1Execute + end> + ModuleName = 'rarray' + Left = 311 + Top = 296 + Height = 500 + Width = 624 +end diff --git a/Demos/Extensions/array result/Unit1.pas b/Source/Demos/Extensions/array result/Unit1.pas similarity index 96% rename from Demos/Extensions/array result/Unit1.pas rename to Source/Demos/Extensions/array result/Unit1.pas index a87cfdc..6b1e46d 100644 --- a/Demos/Extensions/array result/Unit1.pas +++ b/Source/Demos/Extensions/array result/Unit1.pas @@ -1,112 +1,112 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -unit Unit1; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - TPHPExtension1 = class(TPHPExtension) - procedure PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - -procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - -var - pval : pzval; - cnt : integer; -begin - // Function get_my_array returns an array as result - // This demo shows how to use zend variable and work with complex - // PHP types - - pval := ZendVar.AsZendVariable; - if _array_init(pval, nil, 0) = FAILURE then - begin - php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); - ZVAL_FALSE(pval); - Exit; - end; - - for cnt := 1 to 12 do - begin - add_next_index_string(pval, PChar(LongMonthNames[cnt]), 1); - end; - -end; - -procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - pval : pzval; - cnt : integer; - months : pzval; - smonths : pzval; -begin - pval := ZendVar.AsZendVariable; - if _array_init(pval, nil, 0) = FAILURE then - begin - php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); - ZVAL_FALSE(pval); - Exit; - end; - - months := MAKE_STD_ZVAL; - smonths := MAKE_STD_ZVAL; - - _array_init(months, nil, 0); - _array_init(smonths, nil, 0); - - for cnt := 1 to 12 do - begin - add_next_index_string(months, PChar(LongMonthNames[cnt]), 1); - add_next_index_string(smonths, PChar(ShortMonthNames[cnt]), 1); - end; - - add_assoc_zval_ex(pval, 'months', strlen('months') + 1, months); - add_assoc_zval_ex(pval, 'abbrevmonths', strlen('abbrevmonths') + 1, smonths); - -end; - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + +var + pval : pzval; + cnt : integer; +begin + // Function get_my_array returns an array as result + // This demo shows how to use zend variable and work with complex + // PHP types + + pval := ZendVar.AsZendVariable; + if _array_init(pval, nil, 0) = FAILURE then + begin + php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); + ZVAL_FALSE(pval); + Exit; + end; + + for cnt := 1 to 12 do + begin + add_next_index_string(pval, PChar(LongMonthNames[cnt]), 1); + end; + +end; + +procedure TPHPExtension1.PHPExtension1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + pval : pzval; + cnt : integer; + months : pzval; + smonths : pzval; +begin + pval := ZendVar.AsZendVariable; + if _array_init(pval, nil, 0) = FAILURE then + begin + php_error_docref(nil , TSRMLS_DC, E_ERROR, 'Unable to initialize array'); + ZVAL_FALSE(pval); + Exit; + end; + + months := MAKE_STD_ZVAL; + smonths := MAKE_STD_ZVAL; + + _array_init(months, nil, 0); + _array_init(smonths, nil, 0); + + for cnt := 1 to 12 do + begin + add_next_index_string(months, PChar(LongMonthNames[cnt]), 1); + add_next_index_string(smonths, PChar(ShortMonthNames[cnt]), 1); + end; + + add_assoc_zval_ex(pval, 'months', strlen('months') + 1, months); + add_assoc_zval_ex(pval, 'abbrevmonths', strlen('abbrevmonths') + 1, smonths); + +end; + end. \ No newline at end of file diff --git a/Demos/Extensions/array result/rarray.bdsproj b/Source/Demos/Extensions/array result/rarray.bdsproj similarity index 100% rename from Demos/Extensions/array result/rarray.bdsproj rename to Source/Demos/Extensions/array result/rarray.bdsproj diff --git a/Demos/Extensions/array result/rarray.dpr b/Source/Demos/Extensions/array result/rarray.dpr similarity index 94% rename from Demos/Extensions/array result/rarray.dpr rename to Source/Demos/Extensions/array result/rarray.dpr index e73b64b..0590f3e 100644 --- a/Demos/Extensions/array result/rarray.dpr +++ b/Source/Demos/Extensions/array result/rarray.dpr @@ -1,16 +1,16 @@ -library rarray; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; +library rarray; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/array result/rarray.dproj b/Source/Demos/Extensions/array result/rarray.dproj similarity index 100% rename from Demos/Extensions/array result/rarray.dproj rename to Source/Demos/Extensions/array result/rarray.dproj diff --git a/Demos/Extensions/array result/rarray.dproj.local b/Source/Demos/Extensions/array result/rarray.dproj.local similarity index 100% rename from Demos/Extensions/array result/rarray.dproj.local rename to Source/Demos/Extensions/array result/rarray.dproj.local diff --git a/Demos/Extensions/array result/rarray.identcache b/Source/Demos/Extensions/array result/rarray.identcache similarity index 100% rename from Demos/Extensions/array result/rarray.identcache rename to Source/Demos/Extensions/array result/rarray.identcache diff --git a/Demos/Extensions/array result/rarray.php b/Source/Demos/Extensions/array result/rarray.php similarity index 93% rename from Demos/Extensions/array result/rarray.php rename to Source/Demos/Extensions/array result/rarray.php index d827d47..9920e28 100644 --- a/Demos/Extensions/array result/rarray.php +++ b/Source/Demos/Extensions/array result/rarray.php @@ -1,31 +1,31 @@ - - + + diff --git a/Demos/Extensions/array result/rarray.res b/Source/Demos/Extensions/array result/rarray.res similarity index 100% rename from Demos/Extensions/array result/rarray.res rename to Source/Demos/Extensions/array result/rarray.res diff --git a/Demos/Extensions/array result/rarray.stat b/Source/Demos/Extensions/array result/rarray.stat similarity index 100% rename from Demos/Extensions/array result/rarray.stat rename to Source/Demos/Extensions/array result/rarray.stat diff --git a/Demos/Extensions/array result/rarray_Icon.ico b/Source/Demos/Extensions/array result/rarray_Icon.ico similarity index 100% rename from Demos/Extensions/array result/rarray_Icon.ico rename to Source/Demos/Extensions/array result/rarray_Icon.ico diff --git a/Demos/Extensions/css/CREDITS b/Source/Demos/Extensions/css/CREDITS similarity index 100% rename from Demos/Extensions/css/CREDITS rename to Source/Demos/Extensions/css/CREDITS diff --git a/Demos/Extensions/css/EXPERIMENTAL b/Source/Demos/Extensions/css/EXPERIMENTAL similarity index 100% rename from Demos/Extensions/css/EXPERIMENTAL rename to Source/Demos/Extensions/css/EXPERIMENTAL diff --git a/Demos/Extensions/css/css.bdsproj b/Source/Demos/Extensions/css/css.bdsproj similarity index 100% rename from Demos/Extensions/css/css.bdsproj rename to Source/Demos/Extensions/css/css.bdsproj diff --git a/Demos/Extensions/css/css.dpr b/Source/Demos/Extensions/css/css.dpr similarity index 97% rename from Demos/Extensions/css/css.dpr rename to Source/Demos/Extensions/css/css.dpr index a128fc7..79f0d5a 100644 --- a/Demos/Extensions/css/css.dpr +++ b/Source/Demos/Extensions/css/css.dpr @@ -1,129 +1,129 @@ -(* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2002 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 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_02.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: Colin Viebrock | - +----------------------------------------------------------------------+ -*) - -{$I PHP.INC} - -library css; - -uses - Windows, SysUtils, ZendTypes, ZENDAPI, phpTypes, PHPAPI; - - -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PAnsiChar('Delphi CSS'), PAnsiChar('enabled')); - php_info_print_table_end(); -end; - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -procedure delphi_css(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; - -procedure Puts(Str : string); -begin - str := StringReplace(str, '\n', #13#10, [rfReplaceAll]); - php_body_write(PAnsiChar(str), Length(str), TSRMLS_DC); -end; - -begin - PUTS('body {background-color: #ffffff; color: #000000;}\n'); - PUTS('body, td, th, h1, h2 {font-family: sans-serif;}\n'); - PUTS('pre {margin: 0px; font-family: monospace;}\n'); - PUTS('a:link {color: #000099; text-decoration: none;}\n'); - PUTS('a:hover {text-decoration: underline;}\n'); - PUTS('table {border-collapse: collapse;}\n'); - PUTS('.center {text-align: center;}\n'); - PUTS('.center table { margin-left: auto; margin-right: auto; text-align: left;}\n'); - PUTS('.center th { text-align: center; !important }\n'); - PUTS('td, th { border: 1px solid #000000; font-size: 75%; vertical-align: baseline;}\n'); - PUTS('h1 {font-size: 150%;}\n'); - PUTS('h2 {font-size: 125%;}\n'); - PUTS('.p {text-align: left;}\n'); - PUTS('.e {background-color: #ccccff; font-weight: bold;}\n'); - PUTS('.h {background-color: #9999cc; font-weight: bold;}\n'); - PUTS('.v {background-color: #cccccc;}\n'); - PUTS('i {color: #666666;}\n'); - PUTS('img {float: right; border: 0px;}\n'); - PUTS('hr {width: 600px; align: center; background-color: #cccccc; border: 0px; height: 1px;}\n'); -end; - - -var - moduleEntry : Tzend_module_entry; - module_entry_table : array[0..1] of zend_function_entry; - - -function get_module : Pzend_module_entry; cdecl; -begin - if not PHPLoaded then - LoadPHP; - ModuleEntry.size := sizeof(Tzend_module_entry); - ModuleEntry.zend_api := ZEND_MODULE_API_NO; - ModuleEntry.zts := USING_ZTS; - ModuleEntry.Name := 'css'; - ModuleEntry.version := '0.0'; - ModuleEntry.module_startup_func := @minit; - ModuleEntry.module_shutdown_func := @mshutdown; - ModuleEntry.request_startup_func := @rinit; - ModuleEntry.request_shutdown_func := @rshutdown; - ModuleEntry.info_func := @php_info_module; - module_entry_table[0].fname := 'delphi_css'; - module_entry_table[0].handler := @delphi_css; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} - ModuleEntry.functions := @module_entry_table[0]; - ModuleEntry._type := MODULE_PERSISTENT; - {$IFDEF PHP530} - {$IFNDEF COMPILER_VC9} - moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ELSE} - moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ENDIF} - {$ENDIF} - Result := @ModuleEntry; -end; - -exports - get_module; - - -end. - - - +(* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2002 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 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_02.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: Colin Viebrock | + +----------------------------------------------------------------------+ +*) + +{$I PHP.INC} + +library css; + +uses + Windows, SysUtils, ZendTypes, ZENDAPI, phpTypes, PHPAPI; + + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('Delphi CSS'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +procedure delphi_css(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; + +procedure Puts(Str : string); +begin + str := StringReplace(str, '\n', #13#10, [rfReplaceAll]); + php_body_write(PAnsiChar(str), Length(str), TSRMLS_DC); +end; + +begin + PUTS('body {background-color: #ffffff; color: #000000;}\n'); + PUTS('body, td, th, h1, h2 {font-family: sans-serif;}\n'); + PUTS('pre {margin: 0px; font-family: monospace;}\n'); + PUTS('a:link {color: #000099; text-decoration: none;}\n'); + PUTS('a:hover {text-decoration: underline;}\n'); + PUTS('table {border-collapse: collapse;}\n'); + PUTS('.center {text-align: center;}\n'); + PUTS('.center table { margin-left: auto; margin-right: auto; text-align: left;}\n'); + PUTS('.center th { text-align: center; !important }\n'); + PUTS('td, th { border: 1px solid #000000; font-size: 75%; vertical-align: baseline;}\n'); + PUTS('h1 {font-size: 150%;}\n'); + PUTS('h2 {font-size: 125%;}\n'); + PUTS('.p {text-align: left;}\n'); + PUTS('.e {background-color: #ccccff; font-weight: bold;}\n'); + PUTS('.h {background-color: #9999cc; font-weight: bold;}\n'); + PUTS('.v {background-color: #cccccc;}\n'); + PUTS('i {color: #666666;}\n'); + PUTS('img {float: right; border: 0px;}\n'); + PUTS('hr {width: 600px; align: center; background-color: #cccccc; border: 0px; height: 1px;}\n'); +end; + + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..1] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'css'; + ModuleEntry.version := '0.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + module_entry_table[0].fname := 'delphi_css'; + module_entry_table[0].handler := @delphi_css; + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; +end; + +exports + get_module; + + +end. + + + diff --git a/Demos/Extensions/css/css.dproj b/Source/Demos/Extensions/css/css.dproj similarity index 100% rename from Demos/Extensions/css/css.dproj rename to Source/Demos/Extensions/css/css.dproj diff --git a/Demos/Extensions/css/css.dproj.local b/Source/Demos/Extensions/css/css.dproj.local similarity index 100% rename from Demos/Extensions/css/css.dproj.local rename to Source/Demos/Extensions/css/css.dproj.local diff --git a/Demos/Extensions/css/css.identcache b/Source/Demos/Extensions/css/css.identcache similarity index 100% rename from Demos/Extensions/css/css.identcache rename to Source/Demos/Extensions/css/css.identcache diff --git a/Demos/Extensions/css/css.res b/Source/Demos/Extensions/css/css.res similarity index 100% rename from Demos/Extensions/css/css.res rename to Source/Demos/Extensions/css/css.res diff --git a/Demos/Extensions/css/css.stat b/Source/Demos/Extensions/css/css.stat similarity index 100% rename from Demos/Extensions/css/css.stat rename to Source/Demos/Extensions/css/css.stat diff --git a/Demos/Extensions/killer/CREDITS b/Source/Demos/Extensions/killer/CREDITS similarity index 100% rename from Demos/Extensions/killer/CREDITS rename to Source/Demos/Extensions/killer/CREDITS diff --git a/Demos/Extensions/killer/ProcessViewer.pas b/Source/Demos/Extensions/killer/ProcessViewer.pas similarity index 96% rename from Demos/Extensions/killer/ProcessViewer.pas rename to Source/Demos/Extensions/killer/ProcessViewer.pas index 3029fa1..cfb44fa 100644 --- a/Demos/Extensions/killer/ProcessViewer.pas +++ b/Source/Demos/Extensions/killer/ProcessViewer.pas @@ -1,234 +1,234 @@ -{ - ProcessViewer Unit V1.0 - by Leo, March 2001 - - See the file ProcessViewer.txt for informations about the properties and methods. -} - -unit ProcessViewer; - -interface - -uses - Windows, SysUtils, Forms, Classes, ShellAPI, TLHelp32; - -const - SleepForReCheck = 5000; - -type - TProcessInfo = record - FileName : String; - Caption : String; - Visible : Boolean; - Handle : DWord; - PClass : String; - ThreadID : DWord; - PID : DWord; - end; - - -var - PI_DateiList, - PI_CaptionList, - PI_VisibleList, - PI_HandleList, - PI_ClassList, - PI_ThreadIdList, - PI_PIDList : TStringList; - ProcessInfo : Array of TProcessInfo; - -function EnumWindowsProc(hWnd: HWnd; lParam: LPARAM): Boolean; stdcall; -function GetFileNameFromHandle(Handle: HWnd): String; -procedure GetProcessList; -function IsFileActive(FileName: String): Boolean; -function KillProcessByFileName(FileName: String; KillAll: Boolean): Boolean; -function KillProcessByPID(PID: DWord): Boolean; - -implementation - -function EnumWindowsProc(hWnd: HWnd; lParam: LPARAM): Boolean; -var - Capt, - Cla : Array[0..255] of Char; - Datei : String; - ident : DWord; -begin - GetWindowText( hWnd, Capt, 255 ); - GetClassName( hwnd, Cla, 255 ); - PI_ThreadIdList.Add( IntToStr( GetWindowThreadProcessId( hwnd, nil ) ) ); - Datei := GetFileNameFromHandle( hwnd ); - PI_DateiList.Add( Datei ); - PI_HandleList.Add( IntToStr( HWnd ) ); - if IsWindowVisible( HWnd ) then - PI_VisibleList.Add( '1' ) - else - PI_VisibleList.Add( '0' ); - PI_ClassList.Add( Cla ); - PI_CaptionList.Add( Capt ); - GetWindowThreadProcessId( StrToInt( PI_HandleList[PI_HandleList.Count - 1] ), @ident ); - PI_PIDList.Add( IntToStr( ident ) ); - Result := True; -end; - -function GetFileNameFromHandle(Handle: HWnd): String; -var - PID : DWord; - aSnapShotHandle : THandle; - ContinueLoop : Boolean; - aProcessEntry32 : TProcessEntry32; -begin - GetWindowThreadProcessID( Handle, @PID ); - aSnapShotHandle := CreateToolHelp32SnapShot( TH32CS_SNAPPROCESS, 0 ); - try - aProcessEntry32.dwSize := Sizeof( aProcessEntry32 ); - ContinueLoop := Process32First( aSnapShotHandle, aProcessEntry32 ); - while Integer( ContinueLoop ) <> 0 do - begin - if aProcessEntry32.th32ProcessID = PID then - begin - Result := aProcessEntry32.szExeFile; - Break; - end; - ContinueLoop := Process32Next( aSnapShotHandle, aProcessEntry32 ); - end; - finally - CloseHandle( aSnapShotHandle ); - end; -end; - -procedure GetProcessList; -var - i, - Laenge : Integer; -begin - PI_DateiList.Clear; - PI_HandleList.Clear; - PI_ClassList.Clear; - PI_CaptionList.Clear; - PI_VisibleList.Clear; - PI_ThreadIdList.Clear; - PI_PIDList.Clear; - EnumWindows( @EnumWindowsProc, 0 ); - Laenge := PI_DateiList.Count; - SetLength( ProcessInfo,Laenge ); - for i := 0 to Laenge - 1 do - begin - PI_DateiList[i] := UpperCase( PI_DateiList[i] ); - with ProcessInfo[i] do - begin - FileName := PI_DateiList[i]; - Caption := PI_CaptionList[i]; - Visible := PI_VisibleList[i] = '1'; - Handle := StrToInt64( PI_HandleList[i] ); - PClass := PI_ClassList[i]; - ThreadID := StrToInt64( PI_ThreadIdList[i] ); - PID := StrToInt64( PI_PIDList[i] ); - end; - end; -end; - -function IsFileActive(FileName: String): Boolean; -var - i : Integer; -begin - Result := False; - if FileName = '' then - Exit; - GetProcessList; - FileName := UpperCase( ExtractFileName( FileName ) ); - for i := 0 to Length( ProcessInfo ) - 1 do - begin - if Pos( FileName, ProcessInfo[i].FileName ) > 0 then - begin - Result := True; - Break; - end; - end; -end; - -function KillProcessByFileName(FileName: String; KillAll: Boolean): Boolean; -var - i : Integer; - FileFound : Boolean; -begin - Result := False; - if FileName = '' then - Exit; - FileName := UpperCase( ExtractFileName( FileName ) ); - Result := True; - GetProcessList; - if KillAll then - begin - //Kill all - repeat - GetProcessList; - FileFound := False; - for i := 0 to PI_DateiList.Count - 1 do - begin - if Pos( Filename, PI_DateiList[i] ) > 0 then - begin - FileFound := True; - Break; - end; - end; - if i < PI_DateiList.Count then - begin - if not KillProcessByPID( StrToInt64( PI_PIDList[i] ) ) then - begin - Result := False; - Exit; - end; - end; - until not FileFound; - end - else - begin - //Kill one - for i := 0 to PI_DateiList.Count - 1 do - begin - if Pos( Filename, PI_DateiList[i] ) > 0 then - Break; - end; - if i < PI_DateiList.Count then - begin - if not KillProcessByPID( StrToInt64( PI_PIDList[i] ) ) then - begin - Result := False; - Exit; - end; - end; - end; -end; - -function KillProcessByPID(PID: DWord): Boolean; -var - myhandle : THandle; - i : Integer; -begin - myhandle := OpenProcess( PROCESS_TERMINATE, False, PID ); - TerminateProcess( myhandle, 0 ); - for i := 0 to SleepForReCheck do - Application.ProcessMessages; //Genug Zeit geben - GetProcessList; - Result := PI_PIDList.IndexOf( IntToStr( PID ) ) = -1; -end; - -initialization - PI_DateiList := TStringList.Create; - PI_HandleList := TStringList.Create; - PI_ClassList := TStringList.Create; - PI_CaptionList := TStringList.Create; - PI_VisibleList := TStringList.Create; - PI_ThreadIdList := TStringList.Create; - PI_PIDList := TStringList.Create; - -finalization - PI_DateiList.Free; - PI_HandleList.Free; - PI_ClassList.Free; - PI_CaptionList.Free; - PI_VisibleList.Free; - PI_ThreadIdList.Free; - PI_PIDList.Free; - -end. +{ + ProcessViewer Unit V1.0 + by Leo, March 2001 + + See the file ProcessViewer.txt for informations about the properties and methods. +} + +unit ProcessViewer; + +interface + +uses + Windows, SysUtils, Forms, Classes, ShellAPI, TLHelp32; + +const + SleepForReCheck = 5000; + +type + TProcessInfo = record + FileName : String; + Caption : String; + Visible : Boolean; + Handle : DWord; + PClass : String; + ThreadID : DWord; + PID : DWord; + end; + + +var + PI_DateiList, + PI_CaptionList, + PI_VisibleList, + PI_HandleList, + PI_ClassList, + PI_ThreadIdList, + PI_PIDList : TStringList; + ProcessInfo : Array of TProcessInfo; + +function EnumWindowsProc(hWnd: HWnd; lParam: LPARAM): Boolean; stdcall; +function GetFileNameFromHandle(Handle: HWnd): String; +procedure GetProcessList; +function IsFileActive(FileName: String): Boolean; +function KillProcessByFileName(FileName: String; KillAll: Boolean): Boolean; +function KillProcessByPID(PID: DWord): Boolean; + +implementation + +function EnumWindowsProc(hWnd: HWnd; lParam: LPARAM): Boolean; +var + Capt, + Cla : Array[0..255] of Char; + Datei : String; + ident : DWord; +begin + GetWindowText( hWnd, Capt, 255 ); + GetClassName( hwnd, Cla, 255 ); + PI_ThreadIdList.Add( IntToStr( GetWindowThreadProcessId( hwnd, nil ) ) ); + Datei := GetFileNameFromHandle( hwnd ); + PI_DateiList.Add( Datei ); + PI_HandleList.Add( IntToStr( HWnd ) ); + if IsWindowVisible( HWnd ) then + PI_VisibleList.Add( '1' ) + else + PI_VisibleList.Add( '0' ); + PI_ClassList.Add( Cla ); + PI_CaptionList.Add( Capt ); + GetWindowThreadProcessId( StrToInt( PI_HandleList[PI_HandleList.Count - 1] ), @ident ); + PI_PIDList.Add( IntToStr( ident ) ); + Result := True; +end; + +function GetFileNameFromHandle(Handle: HWnd): String; +var + PID : DWord; + aSnapShotHandle : THandle; + ContinueLoop : Boolean; + aProcessEntry32 : TProcessEntry32; +begin + GetWindowThreadProcessID( Handle, @PID ); + aSnapShotHandle := CreateToolHelp32SnapShot( TH32CS_SNAPPROCESS, 0 ); + try + aProcessEntry32.dwSize := Sizeof( aProcessEntry32 ); + ContinueLoop := Process32First( aSnapShotHandle, aProcessEntry32 ); + while Integer( ContinueLoop ) <> 0 do + begin + if aProcessEntry32.th32ProcessID = PID then + begin + Result := aProcessEntry32.szExeFile; + Break; + end; + ContinueLoop := Process32Next( aSnapShotHandle, aProcessEntry32 ); + end; + finally + CloseHandle( aSnapShotHandle ); + end; +end; + +procedure GetProcessList; +var + i, + Laenge : Integer; +begin + PI_DateiList.Clear; + PI_HandleList.Clear; + PI_ClassList.Clear; + PI_CaptionList.Clear; + PI_VisibleList.Clear; + PI_ThreadIdList.Clear; + PI_PIDList.Clear; + EnumWindows( @EnumWindowsProc, 0 ); + Laenge := PI_DateiList.Count; + SetLength( ProcessInfo,Laenge ); + for i := 0 to Laenge - 1 do + begin + PI_DateiList[i] := UpperCase( PI_DateiList[i] ); + with ProcessInfo[i] do + begin + FileName := PI_DateiList[i]; + Caption := PI_CaptionList[i]; + Visible := PI_VisibleList[i] = '1'; + Handle := StrToInt64( PI_HandleList[i] ); + PClass := PI_ClassList[i]; + ThreadID := StrToInt64( PI_ThreadIdList[i] ); + PID := StrToInt64( PI_PIDList[i] ); + end; + end; +end; + +function IsFileActive(FileName: String): Boolean; +var + i : Integer; +begin + Result := False; + if FileName = '' then + Exit; + GetProcessList; + FileName := UpperCase( ExtractFileName( FileName ) ); + for i := 0 to Length( ProcessInfo ) - 1 do + begin + if Pos( FileName, ProcessInfo[i].FileName ) > 0 then + begin + Result := True; + Break; + end; + end; +end; + +function KillProcessByFileName(FileName: String; KillAll: Boolean): Boolean; +var + i : Integer; + FileFound : Boolean; +begin + Result := False; + if FileName = '' then + Exit; + FileName := UpperCase( ExtractFileName( FileName ) ); + Result := True; + GetProcessList; + if KillAll then + begin + //Kill all + repeat + GetProcessList; + FileFound := False; + for i := 0 to PI_DateiList.Count - 1 do + begin + if Pos( Filename, PI_DateiList[i] ) > 0 then + begin + FileFound := True; + Break; + end; + end; + if i < PI_DateiList.Count then + begin + if not KillProcessByPID( StrToInt64( PI_PIDList[i] ) ) then + begin + Result := False; + Exit; + end; + end; + until not FileFound; + end + else + begin + //Kill one + for i := 0 to PI_DateiList.Count - 1 do + begin + if Pos( Filename, PI_DateiList[i] ) > 0 then + Break; + end; + if i < PI_DateiList.Count then + begin + if not KillProcessByPID( StrToInt64( PI_PIDList[i] ) ) then + begin + Result := False; + Exit; + end; + end; + end; +end; + +function KillProcessByPID(PID: DWord): Boolean; +var + myhandle : THandle; + i : Integer; +begin + myhandle := OpenProcess( PROCESS_TERMINATE, False, PID ); + TerminateProcess( myhandle, 0 ); + for i := 0 to SleepForReCheck do + Application.ProcessMessages; //Genug Zeit geben + GetProcessList; + Result := PI_PIDList.IndexOf( IntToStr( PID ) ) = -1; +end; + +initialization + PI_DateiList := TStringList.Create; + PI_HandleList := TStringList.Create; + PI_ClassList := TStringList.Create; + PI_CaptionList := TStringList.Create; + PI_VisibleList := TStringList.Create; + PI_ThreadIdList := TStringList.Create; + PI_PIDList := TStringList.Create; + +finalization + PI_DateiList.Free; + PI_HandleList.Free; + PI_ClassList.Free; + PI_CaptionList.Free; + PI_VisibleList.Free; + PI_ThreadIdList.Free; + PI_PIDList.Free; + +end. diff --git a/Demos/Extensions/killer/Unit1.dfm b/Source/Demos/Extensions/killer/Unit1.dfm similarity index 95% rename from Demos/Extensions/killer/Unit1.dfm rename to Source/Demos/Extensions/killer/Unit1.dfm index d8dfcea..773e21a 100644 --- a/Demos/Extensions/killer/Unit1.dfm +++ b/Source/Demos/Extensions/killer/Unit1.dfm @@ -1,20 +1,20 @@ -object killerExt: TkillerExt - OldCreateOrder = False - Version = '0.0' - Functions = < - item - FunctionName = 'killprocessbypid' - Tag = 0 - Parameters = < - item - Name = 'PID' - ParamType = tpInteger - end> - OnExecute = PHPExtension1Functions0Execute - end> - ModuleName = 'killer' - Left = 192 - Top = 198 - Height = 480 - Width = 696 -end +object killerExt: TkillerExt + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'killprocessbypid' + Tag = 0 + Parameters = < + item + Name = 'PID' + ParamType = tpInteger + end> + OnExecute = PHPExtension1Functions0Execute + end> + ModuleName = 'killer' + Left = 192 + Top = 198 + Height = 480 + Width = 696 +end diff --git a/Demos/Extensions/killer/Unit1.dti b/Source/Demos/Extensions/killer/Unit1.dti similarity index 91% rename from Demos/Extensions/killer/Unit1.dti rename to Source/Demos/Extensions/killer/Unit1.dti index e053eae..aa0c5c1 100644 --- a/Demos/Extensions/killer/Unit1.dti +++ b/Source/Demos/Extensions/killer/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=285 -Top=161 -Width=741 -Height=479 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems= - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems= + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Extensions/killer/Unit1.pas b/Source/Demos/Extensions/killer/Unit1.pas similarity index 95% rename from Demos/Extensions/killer/Unit1.pas rename to Source/Demos/Extensions/killer/Unit1.pas index 4522a0f..8cdd10d 100644 --- a/Demos/Extensions/killer/Unit1.pas +++ b/Source/Demos/Extensions/killer/Unit1.pas @@ -1,54 +1,54 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -unit Unit1; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - PHPFunctions, - PHPModules; - -type - - TkillerExt = class(TPHPExtension) - procedure PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ThisPtr: Pzval; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - killerExt: TkillerExt; - -implementation - -uses ProcessViewer; - -{$R *.DFM} - -procedure TkillerExt.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; - TSRMLS_DC: Pointer); -begin - ReturnValue := KillProcessByPID(Parameters.Items[0].Value); -end; - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + PHPFunctions, + PHPModules; + +type + + TkillerExt = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ThisPtr: Pzval; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + killerExt: TkillerExt; + +implementation + +uses ProcessViewer; + +{$R *.DFM} + +procedure TkillerExt.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ThisPtr: Pzval; + TSRMLS_DC: Pointer); +begin + ReturnValue := KillProcessByPID(Parameters.Items[0].Value); +end; + end. \ No newline at end of file diff --git a/Demos/Extensions/killer/killer.dpr b/Source/Demos/Extensions/killer/killer.dpr similarity index 94% rename from Demos/Extensions/killer/killer.dpr rename to Source/Demos/Extensions/killer/killer.dpr index ef7b48a..e9e39c9 100644 --- a/Demos/Extensions/killer/killer.dpr +++ b/Source/Demos/Extensions/killer/killer.dpr @@ -1,17 +1,17 @@ -library killer; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {killerExt: TPHPExtension}, - ProcessViewer in 'ProcessViewer.pas'; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TkillerExt, killerExt); - Application.Run; +library killer; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {killerExt: TPHPExtension}, + ProcessViewer in 'ProcessViewer.pas'; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TkillerExt, killerExt); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/killer/killer.res b/Source/Demos/Extensions/killer/killer.res similarity index 100% rename from Demos/Extensions/killer/killer.res rename to Source/Demos/Extensions/killer/killer.res diff --git a/Demos/Extensions/killer/tests/test_killer.php b/Source/Demos/Extensions/killer/tests/test_killer.php similarity index 94% rename from Demos/Extensions/killer/tests/test_killer.php rename to Source/Demos/Extensions/killer/tests/test_killer.php index f0727ed..b8e343d 100644 --- a/Demos/Extensions/killer/tests/test_killer.php +++ b/Source/Demos/Extensions/killer/tests/test_killer.php @@ -1,23 +1,23 @@ -\n"; -foreach($functions as $func) { - echo $func."
\n"; -} - -?> +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} + +?> diff --git a/Demos/Extensions/php class/php_class.bdsproj b/Source/Demos/Extensions/php class/php_class.bdsproj similarity index 100% rename from Demos/Extensions/php class/php_class.bdsproj rename to Source/Demos/Extensions/php class/php_class.bdsproj diff --git a/Demos/Extensions/php class/php_class.dpr b/Source/Demos/Extensions/php class/php_class.dpr similarity index 96% rename from Demos/Extensions/php class/php_class.dpr rename to Source/Demos/Extensions/php class/php_class.dpr index d123dbb..c0938e1 100644 --- a/Demos/Extensions/php class/php_class.dpr +++ b/Source/Demos/Extensions/php class/php_class.dpr @@ -1,167 +1,167 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP class demo extension } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: php_class.dpr,v 7.0 04/2007 delphi32 Exp $ } - -{$I PHP.INC} - -library php_class; - -uses - Windows, SysUtils, ZendTypes, ZENDAPI, phpTypes, PHPAPI; - -var - demo_class_functions : array[0..2] of zend_function_entry; - demo_class_entry : Tzend_class_entry; - ce : pzend_class_entry; - -{$IFDEF PHP510} -procedure demo_email (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure demo_email (ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - str : string; -begin - str := 'name@mail.com'; - ZVAL_STRING(return_value, PChar(str), true); -end; - -{$IFDEF PHP510} -procedure demo_homepage (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure demo_homepage (ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - str : string; -begin - str := 'http://www.demo.com'; - ZVAL_STRING(return_value, PChar(str), true); -end; - -procedure RegisterDemoClass(p : pointer); -begin - demo_class_functions[0].fname := 'demo_email'; - demo_class_functions[0].handler := @demo_email; - demo_class_functions[1].fname := 'demo_homepage'; - demo_class_functions[1].handler := @demo_homepage; - INIT_CLASS_ENTRY(demo_class_entry, 'php_demo_class', @demo_class_functions); - ce := zend_register_internal_class(@demo_class_entry, p); -end; - -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PChar('PHP Demo Class'), PChar('enabled')); - php_info_print_table_end(); -end; - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RegisterDemoClass(TSRMLS_DC); - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -{$IFDEF PHP510} -procedure get_demo_class (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure get_demo_class (ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - properties : array[0..2] of pchar; -begin - properties[0] := 'name'; - properties[1] := 'tool'; - properties[2] := 'height'; - {$IFDEF PHP4} - _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); - {$ELSE} - object_init(return_value, ce, TSRMLS_DC ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1); - {$ELSE} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1, TSRMLS_DC); - {$ENDIF} - - {$IFDEF PHP4} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); - {$ELSE} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); - {$ENDIF} -end; - - -var - moduleEntry : Tzend_module_entry; - module_entry_table : array[0..1] of zend_function_entry; - - -function get_module : Pzend_module_entry; cdecl; -begin - if not PHPLoaded then - LoadPHP; - ModuleEntry.size := sizeof(Tzend_module_entry); - ModuleEntry.zend_api := ZEND_MODULE_API_NO; - ModuleEntry.zts := USING_ZTS; - ModuleEntry.Name := 'php_class'; - ModuleEntry.version := '0.2'; - ModuleEntry.module_startup_func := @minit; - ModuleEntry.module_shutdown_func := @mshutdown; - ModuleEntry.request_startup_func := @rinit; - ModuleEntry.request_shutdown_func := @rshutdown; - ModuleEntry.info_func := @php_info_module; - module_entry_table[0].fname := 'get_demo_class'; - module_entry_table[0].handler := @get_demo_class; - {$IFDEF PHP4} - module_entry_table[0].func_arg_types := nil; - {$ENDIF} - ModuleEntry.functions := @module_entry_table[0]; - ModuleEntry._type := MODULE_PERSISTENT; - {$IFDEF PHP530} - {$IFNDEF COMPILER_VC9} - moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ELSE} - moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ENDIF} - {$ENDIF} - Result := @ModuleEntry; -end; - - - -exports - get_module; - -end. - +{*******************************************************} +{ PHP4Delphi } +{ PHP class demo extension } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: php_class.dpr,v 7.0 04/2007 delphi32 Exp $ } + +{$I PHP.INC} + +library php_class; + +uses + Windows, SysUtils, ZendTypes, ZENDAPI, phpTypes, PHPAPI; + +var + demo_class_functions : array[0..2] of zend_function_entry; + demo_class_entry : Tzend_class_entry; + ce : pzend_class_entry; + +{$IFDEF PHP510} +procedure demo_email (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure demo_email (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + str : string; +begin + str := 'name@mail.com'; + ZVAL_STRING(return_value, PChar(str), true); +end; + +{$IFDEF PHP510} +procedure demo_homepage (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure demo_homepage (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + str : string; +begin + str := 'http://www.demo.com'; + ZVAL_STRING(return_value, PChar(str), true); +end; + +procedure RegisterDemoClass(p : pointer); +begin + demo_class_functions[0].fname := 'demo_email'; + demo_class_functions[0].handler := @demo_email; + demo_class_functions[1].fname := 'demo_homepage'; + demo_class_functions[1].handler := @demo_homepage; + INIT_CLASS_ENTRY(demo_class_entry, 'php_demo_class', @demo_class_functions); + ce := zend_register_internal_class(@demo_class_entry, p); +end; + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PChar('PHP Demo Class'), PChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RegisterDemoClass(TSRMLS_DC); + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +{$IFDEF PHP510} +procedure get_demo_class (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure get_demo_class (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + properties : array[0..2] of pchar; +begin + properties[0] := 'name'; + properties[1] := 'tool'; + properties[2] := 'height'; + {$IFDEF PHP4} + _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); + {$ELSE} + object_init(return_value, ce, TSRMLS_DC ); + {$ENDIF} + + {$IFDEF PHP4} + add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); + add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1); + {$ELSE} + add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); + add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1, TSRMLS_DC); + {$ENDIF} + + {$IFDEF PHP4} + add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); + {$ELSE} + add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); + {$ENDIF} +end; + + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..1] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'php_class'; + ModuleEntry.version := '0.2'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + module_entry_table[0].fname := 'get_demo_class'; + module_entry_table[0].handler := @get_demo_class; + {$IFDEF PHP4} + module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos/Extensions/php class/test_class.php b/Source/Demos/Extensions/php class/test_class.php similarity index 91% rename from Demos/Extensions/php class/test_class.php rename to Source/Demos/Extensions/php class/test_class.php index 0de102c..f626e59 100644 --- a/Demos/Extensions/php class/test_class.php +++ b/Source/Demos/Extensions/php class/test_class.php @@ -1,15 +1,15 @@ -demo_email(); - -echo "\n"; - -$b = get_demo_class(); -echo $b->tool; - -?> - +demo_email(); + +echo "\n"; + +$b = get_demo_class(); +echo $b->tool; + +?> + diff --git a/Demos/Extensions/phpDLL/Unit1.ddp b/Source/Demos/Extensions/phpDLL/Unit1.ddp similarity index 100% rename from Demos/Extensions/phpDLL/Unit1.ddp rename to Source/Demos/Extensions/phpDLL/Unit1.ddp diff --git a/Demos/Extensions/phpDLL/Unit1.dfm b/Source/Demos/Extensions/phpDLL/Unit1.dfm similarity index 95% rename from Demos/Extensions/phpDLL/Unit1.dfm rename to Source/Demos/Extensions/phpDLL/Unit1.dfm index 74b7e3c..7b00eef 100644 --- a/Demos/Extensions/phpDLL/Unit1.dfm +++ b/Source/Demos/Extensions/phpDLL/Unit1.dfm @@ -1,20 +1,20 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - Version = '0.0' - Functions = < - item - FunctionName = 'mygettext' - Tag = 0 - Parameters = < - item - Name = 'AText' - ParamType = tpString - end> - OnExecute = PHPExtension1Functions0Execute - end> - ModuleName = 'some_functions' - Left = 411 - Top = 314 - Height = 150 - Width = 215 -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'mygettext' + Tag = 0 + Parameters = < + item + Name = 'AText' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions0Execute + end> + ModuleName = 'some_functions' + Left = 411 + Top = 314 + Height = 150 + Width = 215 +end diff --git a/Demos/Extensions/Resources/Unit1.dti b/Source/Demos/Extensions/phpDLL/Unit1.dti similarity index 91% rename from Demos/Extensions/Resources/Unit1.dti rename to Source/Demos/Extensions/phpDLL/Unit1.dti index e053eae..aa0c5c1 100644 --- a/Demos/Extensions/Resources/Unit1.dti +++ b/Source/Demos/Extensions/phpDLL/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=285 -Top=161 -Width=741 -Height=479 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems= - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=285 +Top=161 +Width=741 +Height=479 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems= + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Extensions/phpDLL/Unit1.pas b/Source/Demos/Extensions/phpDLL/Unit1.pas similarity index 95% rename from Demos/Extensions/phpDLL/Unit1.pas rename to Source/Demos/Extensions/phpDLL/Unit1.pas index b2bbb36..919c87d 100644 --- a/Demos/Extensions/phpDLL/Unit1.pas +++ b/Source/Demos/Extensions/phpDLL/Unit1.pas @@ -1,56 +1,56 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -unit Unit1; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - TPHPExtension1 = class(TPHPExtension) - procedure PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - -procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - -begin - ReturnValue := Parameters[0].Value + ' from DLL'; -end; - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + +begin + ReturnValue := Parameters[0].Value + ' from DLL'; +end; + end. \ No newline at end of file diff --git a/Demos/Extensions/phpDLL/phpDLL.bdsproj b/Source/Demos/Extensions/phpDLL/phpDLL.bdsproj similarity index 100% rename from Demos/Extensions/phpDLL/phpDLL.bdsproj rename to Source/Demos/Extensions/phpDLL/phpDLL.bdsproj diff --git a/Demos/Extensions/phpDLL/phpDLL.dpr b/Source/Demos/Extensions/phpDLL/phpDLL.dpr similarity index 94% rename from Demos/Extensions/phpDLL/phpDLL.dpr rename to Source/Demos/Extensions/phpDLL/phpDLL.dpr index 02e5dc0..4462aac 100644 --- a/Demos/Extensions/phpDLL/phpDLL.dpr +++ b/Source/Demos/Extensions/phpDLL/phpDLL.dpr @@ -1,16 +1,16 @@ -library phpDLL; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; +library phpDLL; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/phpDLL/phpDLL.res b/Source/Demos/Extensions/phpDLL/phpDLL.res similarity index 100% rename from Demos/Extensions/phpDLL/phpDLL.res rename to Source/Demos/Extensions/phpDLL/phpDLL.res diff --git a/Demos/Extensions/phpDLL/testdll.php b/Source/Demos/Extensions/phpDLL/testdll.php similarity index 95% rename from Demos/Extensions/phpDLL/testdll.php rename to Source/Demos/Extensions/phpDLL/testdll.php index 31b1d0b..a616618 100644 --- a/Demos/Extensions/phpDLL/testdll.php +++ b/Source/Demos/Extensions/phpDLL/testdll.php @@ -1,24 +1,24 @@ -"; - -$functions = get_extension_funcs($module); -echo "Functions available in the $module extension:
\n"; -foreach($functions as $func) { - echo $func."
"; -} - -$str = MyGetText("Hello!"); //This Delphi function is : ... ReturnValue:='Hello From DLL'; - -echo "Delphi ret -->$str
"; - -?> +"; + +$functions = get_extension_funcs($module); +echo "Functions available in the $module extension:
\n"; +foreach($functions as $func) { + echo $func."
"; +} + +$str = MyGetText("Hello!"); //This Delphi function is : ... ReturnValue:='Hello From DLL'; + +echo "Delphi ret -->$str
"; + +?> diff --git a/Demos/Extensions/reference/Unit1.ddp b/Source/Demos/Extensions/reference/Unit1.ddp similarity index 100% rename from Demos/Extensions/reference/Unit1.ddp rename to Source/Demos/Extensions/reference/Unit1.ddp diff --git a/Demos/Extensions/reference/Unit1.dfm b/Source/Demos/Extensions/reference/Unit1.dfm similarity index 95% rename from Demos/Extensions/reference/Unit1.dfm rename to Source/Demos/Extensions/reference/Unit1.dfm index 2766761..928797f 100644 --- a/Demos/Extensions/reference/Unit1.dfm +++ b/Source/Demos/Extensions/reference/Unit1.dfm @@ -1,24 +1,24 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - Version = '0.0' - Functions = < - item - FunctionName = 'helloworld' - Tag = 0 - Parameters = < - item - Name = 'Param1' - ParamType = tpString - end - item - Name = 'Param2' - ParamType = tpString - end> - OnExecute = PHPExtension1Functions0Execute - end> - ModuleName = 'php_ref' - Left = 192 - Top = 114 - Height = 150 - Width = 215 -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '0.0' + Functions = < + item + FunctionName = 'helloworld' + Tag = 0 + Parameters = < + item + Name = 'Param1' + ParamType = tpString + end + item + Name = 'Param2' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions0Execute + end> + ModuleName = 'php_ref' + Left = 192 + Top = 114 + Height = 150 + Width = 215 +end diff --git a/Demos/Extensions/reference/Unit1.pas b/Source/Demos/Extensions/reference/Unit1.pas similarity index 95% rename from Demos/Extensions/reference/Unit1.pas rename to Source/Demos/Extensions/reference/Unit1.pas index 740ddbb..3207ba9 100644 --- a/Demos/Extensions/reference/Unit1.pas +++ b/Source/Demos/Extensions/reference/Unit1.pas @@ -1,45 +1,45 @@ -unit Unit1; - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - TPHPExtension1 = class(TPHPExtension) - procedure PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - -procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - ZVAL_STRING(Parameters[0].ZendValue, 'hello', true); - ZVAL_STRING(Parameters[1].ZendValue, 'world', true); -end; - +unit Unit1; + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + ZVAL_STRING(Parameters[0].ZendValue, 'hello', true); + ZVAL_STRING(Parameters[1].ZendValue, 'world', true); +end; + end. \ No newline at end of file diff --git a/Demos/Extensions/reference/php_ref.bdsproj b/Source/Demos/Extensions/reference/php_ref.bdsproj similarity index 100% rename from Demos/Extensions/reference/php_ref.bdsproj rename to Source/Demos/Extensions/reference/php_ref.bdsproj diff --git a/Demos/Extensions/reference/php_ref.dpr b/Source/Demos/Extensions/reference/php_ref.dpr similarity index 94% rename from Demos/Extensions/reference/php_ref.dpr rename to Source/Demos/Extensions/reference/php_ref.dpr index 9221ead..b9cf9f3 100644 --- a/Demos/Extensions/reference/php_ref.dpr +++ b/Source/Demos/Extensions/reference/php_ref.dpr @@ -1,16 +1,16 @@ -library php_ref; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; +library php_ref; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Extensions/reference/php_ref.res b/Source/Demos/Extensions/reference/php_ref.res similarity index 100% rename from Demos/Extensions/reference/php_ref.res rename to Source/Demos/Extensions/reference/php_ref.res diff --git a/Demos/Extensions/reference/testref.php b/Source/Demos/Extensions/reference/testref.php similarity index 94% rename from Demos/Extensions/reference/testref.php rename to Source/Demos/Extensions/reference/testref.php index 46c20cf..071d7bf 100644 --- a/Demos/Extensions/reference/testref.php +++ b/Source/Demos/Extensions/reference/testref.php @@ -1,28 +1,28 @@ -"; - -$functions = get_extension_funcs($module); -echo "Functions available in the $module extension:
\n"; -foreach($functions as $func) { - echo $func."
"; -} - -$a = ""; -$b = ""; - -helloworld($a, $b); - -echo $a." ".$b; - -?> +"; + +$functions = get_extension_funcs($module); +echo "Functions available in the $module extension:
\n"; +foreach($functions as $func) { + echo $func."
"; +} + +$a = ""; +$b = ""; + +helloworld($a, $b); + +echo $a." ".$b; + +?> diff --git a/Demos/Extensions/skeleton/CREDITS b/Source/Demos/Extensions/skeleton/CREDITS similarity index 100% rename from Demos/Extensions/skeleton/CREDITS rename to Source/Demos/Extensions/skeleton/CREDITS diff --git a/Demos/Extensions/skeleton/EXPERIMENTAL b/Source/Demos/Extensions/skeleton/EXPERIMENTAL similarity index 100% rename from Demos/Extensions/skeleton/EXPERIMENTAL rename to Source/Demos/Extensions/skeleton/EXPERIMENTAL diff --git a/Demos/Extensions/skeleton/skeleton.bdsproj b/Source/Demos/Extensions/skeleton/skeleton.bdsproj similarity index 100% rename from Demos/Extensions/skeleton/skeleton.bdsproj rename to Source/Demos/Extensions/skeleton/skeleton.bdsproj diff --git a/Demos/Extensions/skeleton/skeleton.dpr b/Source/Demos/Extensions/skeleton/skeleton.dpr similarity index 96% rename from Demos/Extensions/skeleton/skeleton.dpr rename to Source/Demos/Extensions/skeleton/skeleton.dpr index 8448493..b2c3c91 100644 --- a/Demos/Extensions/skeleton/skeleton.dpr +++ b/Source/Demos/Extensions/skeleton/skeleton.dpr @@ -1,127 +1,127 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.telenet.be/ws36637 } -{ http://delphi32.blogspot.com } -{*******************************************************} - -{ $Id: skeleton.dpr,v 7.4 10/2009 delphi32 Exp $ } - -{$I php.inc} - -library skeleton; - -uses - Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI; - - -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; -begin - php_info_print_table_start(); - php_info_print_table_row(2, PAnsiChar('extname support'), PAnsiChar('enabled')); - php_info_print_table_end(); -end; - -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -{$IFDEF PHP510} -procedure confirm_extname_compiled (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure confirm_extname_compiled (ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var -arg : PAnsiChar; -str : string; -param : pzval_array; -begin - {$IFDEF PHP510} - if return_value_ptr = nil then - begin - end; - {$ENDIF} - - if ht = 0 then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - arg := param[0]^.value.str.val; - str := Format('Congratulations! Module %.78s is now compiled into PHP.', [arg]); - ZVAL_STRING(return_value, PAnsiChar(str), true); - dispose_pzval_array(param); -end; - - -var - moduleEntry : Tzend_module_entry; - module_entry_table : array[0..1] of zend_function_entry; - - -function get_module : Pzend_module_entry; cdecl; -begin - if not PHPLoaded then - LoadPHP; - ModuleEntry.size := sizeof(Tzend_module_entry); - ModuleEntry.zend_api := ZEND_MODULE_API_NO; - ModuleEntry.zts := USING_ZTS; - ModuleEntry.Name := 'extname'; - ModuleEntry.version := '0.0'; - ModuleEntry.module_startup_func := @minit; - ModuleEntry.module_shutdown_func := @mshutdown; - ModuleEntry.request_startup_func := @rinit; - ModuleEntry.request_shutdown_func := @rshutdown; - ModuleEntry.info_func := @php_info_module; - Module_entry_table[0].fname := 'confirm_extname_compiled'; - Module_entry_table[0].handler := @confirm_extname_compiled; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} - ModuleEntry.functions := @module_entry_table[0]; - ModuleEntry._type := MODULE_PERSISTENT; - {$IFDEF PHP530} - {$IFNDEF COMPILER_VC9} - moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ELSE} - moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); - {$ENDIF} - {$ENDIF} - Result := @ModuleEntry; -end; - - - -exports - get_module; - -end. - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.telenet.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} + +{ $Id: skeleton.dpr,v 7.4 10/2009 delphi32 Exp $ } + +{$I php.inc} + +library skeleton; + +uses + Windows, SysUtils, zendTypes, ZENDAPI, phpTypes, PHPAPI; + + +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl; +begin + php_info_print_table_start(); + php_info_print_table_row(2, PAnsiChar('extname support'), PAnsiChar('enabled')); + php_info_print_table_end(); +end; + +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +{$IFDEF PHP510} +procedure confirm_extname_compiled (ht : integer; return_value : pzval; return_value_ptr : pointer; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure confirm_extname_compiled (ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var +arg : PAnsiChar; +str : string; +param : pzval_array; +begin + {$IFDEF PHP510} + if return_value_ptr = nil then + begin + end; + {$ENDIF} + + if ht = 0 then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + arg := param[0]^.value.str.val; + str := Format('Congratulations! Module %.78s is now compiled into PHP.', [arg]); + ZVAL_STRING(return_value, PAnsiChar(str), true); + dispose_pzval_array(param); +end; + + +var + moduleEntry : Tzend_module_entry; + module_entry_table : array[0..1] of zend_function_entry; + + +function get_module : Pzend_module_entry; cdecl; +begin + if not PHPLoaded then + LoadPHP; + ModuleEntry.size := sizeof(Tzend_module_entry); + ModuleEntry.zend_api := ZEND_MODULE_API_NO; + ModuleEntry.zts := USING_ZTS; + ModuleEntry.Name := 'extname'; + ModuleEntry.version := '0.0'; + ModuleEntry.module_startup_func := @minit; + ModuleEntry.module_shutdown_func := @mshutdown; + ModuleEntry.request_startup_func := @rinit; + ModuleEntry.request_shutdown_func := @rshutdown; + ModuleEntry.info_func := @php_info_module; + Module_entry_table[0].fname := 'confirm_extname_compiled'; + Module_entry_table[0].handler := @confirm_extname_compiled; + {$IFDEF PHP4} + Module_entry_table[0].func_arg_types := nil; + {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; + ModuleEntry._type := MODULE_PERSISTENT; + {$IFDEF PHP530} + {$IFNDEF COMPILER_VC9} + moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + moduleEntry.build_id := StrNew(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} + {$ENDIF} + Result := @ModuleEntry; +end; + + + +exports + get_module; + +end. + diff --git a/Demos/Extensions/skeleton/skeleton.dproj b/Source/Demos/Extensions/skeleton/skeleton.dproj similarity index 100% rename from Demos/Extensions/skeleton/skeleton.dproj rename to Source/Demos/Extensions/skeleton/skeleton.dproj diff --git a/Demos/Extensions/skeleton/tests/skeleton.php b/Source/Demos/Extensions/skeleton/tests/skeleton.php similarity index 95% rename from Demos/Extensions/skeleton/tests/skeleton.php rename to Source/Demos/Extensions/skeleton/tests/skeleton.php index bb40048..1866534 100644 --- a/Demos/Extensions/skeleton/tests/skeleton.php +++ b/Source/Demos/Extensions/skeleton/tests/skeleton.php @@ -1,19 +1,19 @@ -\n"; -foreach($functions as $func) { - echo $func."
\n"; -} -echo "
\n"; -$function = 'confirm_' . $module . '_compiled'; -if (extension_loaded($module)) { - $str = $function($module); -} else { - $str = "Module $module is not compiled into PHP"; -} -echo "$str\n"; -?> +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} +echo "
\n"; +$function = 'confirm_' . $module . '_compiled'; +if (extension_loaded($module)) { + $str = $function($module); +} else { + $str = "Module $module is not compiled into PHP"; +} +echo "$str\n"; +?> diff --git a/Demos/Extensions/skeleton/tests/test_skeleton.php b/Source/Demos/Extensions/skeleton/tests/test_skeleton.php similarity index 94% rename from Demos/Extensions/skeleton/tests/test_skeleton.php rename to Source/Demos/Extensions/skeleton/tests/test_skeleton.php index c1c78a0..c189599 100644 --- a/Demos/Extensions/skeleton/tests/test_skeleton.php +++ b/Source/Demos/Extensions/skeleton/tests/test_skeleton.php @@ -1,25 +1,25 @@ -\n"; -foreach($functions as $func) { - echo $func."
\n"; -} - -?> +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} + +?> diff --git a/Demos/Tutorial/Step.02/Project1.dpr b/Source/Demos/Tutorial/Step.01/Project1.dpr similarity index 94% rename from Demos/Tutorial/Step.02/Project1.dpr rename to Source/Demos/Tutorial/Step.01/Project1.dpr index 0c8b444..598d21f 100644 --- a/Demos/Tutorial/Step.02/Project1.dpr +++ b/Source/Demos/Tutorial/Step.01/Project1.dpr @@ -1,16 +1,16 @@ -library Project1; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.01/Project1.res b/Source/Demos/Tutorial/Step.01/Project1.res similarity index 100% rename from Demos/Tutorial/Step.01/Project1.res rename to Source/Demos/Tutorial/Step.01/Project1.res diff --git a/Demos/Tutorial/Step.01/Unit1.ddp b/Source/Demos/Tutorial/Step.01/Unit1.ddp similarity index 100% rename from Demos/Tutorial/Step.01/Unit1.ddp rename to Source/Demos/Tutorial/Step.01/Unit1.ddp diff --git a/Demos/Tutorial/Step.01/Unit1.dfm b/Source/Demos/Tutorial/Step.01/Unit1.dfm similarity index 94% rename from Demos/Tutorial/Step.01/Unit1.dfm rename to Source/Demos/Tutorial/Step.01/Unit1.dfm index 50aaa09..1f4f79b 100644 --- a/Demos/Tutorial/Step.01/Unit1.dfm +++ b/Source/Demos/Tutorial/Step.01/Unit1.dfm @@ -1,9 +1,9 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - Version = '0.0' - Functions = <> - Left = 512 - Top = 312 - Height = 331 - Width = 444 -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '0.0' + Functions = <> + Left = 512 + Top = 312 + Height = 331 + Width = 444 +end diff --git a/Demos/Tutorial/Step.01/Unit1.dti b/Source/Demos/Tutorial/Step.01/Unit1.dti similarity index 91% rename from Demos/Tutorial/Step.01/Unit1.dti rename to Source/Demos/Tutorial/Step.01/Unit1.dti index 332c5f1..25ebfd4 100644 --- a/Demos/Tutorial/Step.01/Unit1.dti +++ b/Source/Demos/Tutorial/Step.01/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=267 -Top=308 -Width=696 -Height=480 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=PHPExtension1 - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=267 +Top=308 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1 + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Tutorial/Step.01/Unit1.pas b/Source/Demos/Tutorial/Step.01/Unit1.pas similarity index 95% rename from Demos/Tutorial/Step.01/Unit1.pas rename to Source/Demos/Tutorial/Step.01/Unit1.pas index ecbc59f..1fcf616 100644 --- a/Demos/Tutorial/Step.01/Unit1.pas +++ b/Source/Demos/Tutorial/Step.01/Unit1.pas @@ -1,45 +1,45 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -unit Unit1; - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - TPHPExtension1 = class(TPHPExtension) - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.03/Project1.dpr b/Source/Demos/Tutorial/Step.02/Project1.dpr similarity index 94% rename from Demos/Tutorial/Step.03/Project1.dpr rename to Source/Demos/Tutorial/Step.02/Project1.dpr index 0c8b444..598d21f 100644 --- a/Demos/Tutorial/Step.03/Project1.dpr +++ b/Source/Demos/Tutorial/Step.02/Project1.dpr @@ -1,16 +1,16 @@ -library Project1; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.02/Project1.res b/Source/Demos/Tutorial/Step.02/Project1.res similarity index 100% rename from Demos/Tutorial/Step.02/Project1.res rename to Source/Demos/Tutorial/Step.02/Project1.res diff --git a/Demos/Tutorial/Step.02/Unit1.ddp b/Source/Demos/Tutorial/Step.02/Unit1.ddp similarity index 100% rename from Demos/Tutorial/Step.02/Unit1.ddp rename to Source/Demos/Tutorial/Step.02/Unit1.ddp diff --git a/Demos/Tutorial/Step.02/Unit1.dfm b/Source/Demos/Tutorial/Step.02/Unit1.dfm similarity index 94% rename from Demos/Tutorial/Step.02/Unit1.dfm rename to Source/Demos/Tutorial/Step.02/Unit1.dfm index 111df55..19fa4f3 100644 --- a/Demos/Tutorial/Step.02/Unit1.dfm +++ b/Source/Demos/Tutorial/Step.02/Unit1.dfm @@ -1,10 +1,10 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - Version = '1.0' - Functions = <> - ModuleName = 'mymodule' - Left = 541 - Top = 282 - Height = 376 - Width = 406 -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '1.0' + Functions = <> + ModuleName = 'mymodule' + Left = 541 + Top = 282 + Height = 376 + Width = 406 +end diff --git a/Demos/Tutorial/Step.02/Unit1.dti b/Source/Demos/Tutorial/Step.02/Unit1.dti similarity index 91% rename from Demos/Tutorial/Step.02/Unit1.dti rename to Source/Demos/Tutorial/Step.02/Unit1.dti index 049680b..17f5861 100644 --- a/Demos/Tutorial/Step.02/Unit1.dti +++ b/Source/Demos/Tutorial/Step.02/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=192 -Top=130 -Width=696 -Height=480 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=PHPExtension1 - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=192 +Top=130 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1 + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Tutorial/Step.04/Unit1.pas b/Source/Demos/Tutorial/Step.02/Unit1.pas similarity index 95% rename from Demos/Tutorial/Step.04/Unit1.pas rename to Source/Demos/Tutorial/Step.02/Unit1.pas index ecbc59f..1fcf616 100644 --- a/Demos/Tutorial/Step.04/Unit1.pas +++ b/Source/Demos/Tutorial/Step.02/Unit1.pas @@ -1,45 +1,45 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -unit Unit1; - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - TPHPExtension1 = class(TPHPExtension) - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.04/Project1.dpr b/Source/Demos/Tutorial/Step.03/Project1.dpr similarity index 94% rename from Demos/Tutorial/Step.04/Project1.dpr rename to Source/Demos/Tutorial/Step.03/Project1.dpr index 0c8b444..598d21f 100644 --- a/Demos/Tutorial/Step.04/Project1.dpr +++ b/Source/Demos/Tutorial/Step.03/Project1.dpr @@ -1,16 +1,16 @@ -library Project1; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.03/Project1.res b/Source/Demos/Tutorial/Step.03/Project1.res similarity index 100% rename from Demos/Tutorial/Step.03/Project1.res rename to Source/Demos/Tutorial/Step.03/Project1.res diff --git a/Demos/Tutorial/Step.03/Unit1.ddp b/Source/Demos/Tutorial/Step.03/Unit1.ddp similarity index 100% rename from Demos/Tutorial/Step.03/Unit1.ddp rename to Source/Demos/Tutorial/Step.03/Unit1.ddp diff --git a/Demos/Tutorial/Step.03/Unit1.dfm b/Source/Demos/Tutorial/Step.03/Unit1.dfm similarity index 94% rename from Demos/Tutorial/Step.03/Unit1.dfm rename to Source/Demos/Tutorial/Step.03/Unit1.dfm index 8e031ca..03f8fa1 100644 --- a/Demos/Tutorial/Step.03/Unit1.dfm +++ b/Source/Demos/Tutorial/Step.03/Unit1.dfm @@ -1,15 +1,15 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - Version = '1.0' - Functions = < - item - FunctionName = 'myfunction' - Tag = 0 - Parameters = <> - end> - ModuleName = 'mymodule' - Left = 499 - Top = 235 - Height = 443 - Width = 508 -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'myfunction' + Tag = 0 + Parameters = <> + end> + ModuleName = 'mymodule' + Left = 499 + Top = 235 + Height = 443 + Width = 508 +end diff --git a/Demos/Tutorial/Step.03/Unit1.dti b/Source/Demos/Tutorial/Step.03/Unit1.dti similarity index 92% rename from Demos/Tutorial/Step.03/Unit1.dti rename to Source/Demos/Tutorial/Step.03/Unit1.dti index a545ff6..3af6432 100644 --- a/Demos/Tutorial/Step.03/Unit1.dti +++ b/Source/Demos/Tutorial/Step.03/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=192 -Top=130 -Width=696 -Height=480 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=PHPExtension1\PHPExtension1.Functions - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=192 +Top=130 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1\PHPExtension1.Functions + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Tutorial/Step.03/Unit1.pas b/Source/Demos/Tutorial/Step.03/Unit1.pas similarity index 95% rename from Demos/Tutorial/Step.03/Unit1.pas rename to Source/Demos/Tutorial/Step.03/Unit1.pas index 01f2126..00bf20a 100644 --- a/Demos/Tutorial/Step.03/Unit1.pas +++ b/Source/Demos/Tutorial/Step.03/Unit1.pas @@ -1,45 +1,45 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -unit Unit1; - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - TPHPExtension1 = class(TPHPExtension) - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.01/Project1.dpr b/Source/Demos/Tutorial/Step.04/Project1.dpr similarity index 94% rename from Demos/Tutorial/Step.01/Project1.dpr rename to Source/Demos/Tutorial/Step.04/Project1.dpr index 0c8b444..598d21f 100644 --- a/Demos/Tutorial/Step.01/Project1.dpr +++ b/Source/Demos/Tutorial/Step.04/Project1.dpr @@ -1,16 +1,16 @@ -library Project1; - -uses - Windows, - SysUtils, - phpApp, - phpModules, - Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TPHPExtension1, PHPExtension1); - Application.Run; +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.04/Project1.res b/Source/Demos/Tutorial/Step.04/Project1.res similarity index 100% rename from Demos/Tutorial/Step.04/Project1.res rename to Source/Demos/Tutorial/Step.04/Project1.res diff --git a/Demos/Tutorial/Step.04/Unit1.ddp b/Source/Demos/Tutorial/Step.04/Unit1.ddp similarity index 100% rename from Demos/Tutorial/Step.04/Unit1.ddp rename to Source/Demos/Tutorial/Step.04/Unit1.ddp diff --git a/Demos/Tutorial/Step.04/Unit1.dfm b/Source/Demos/Tutorial/Step.04/Unit1.dfm similarity index 94% rename from Demos/Tutorial/Step.04/Unit1.dfm rename to Source/Demos/Tutorial/Step.04/Unit1.dfm index e7da054..7f21115 100644 --- a/Demos/Tutorial/Step.04/Unit1.dfm +++ b/Source/Demos/Tutorial/Step.04/Unit1.dfm @@ -1,19 +1,19 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - Version = '1.0' - Functions = < - item - FunctionName = 'myfunction' - Tag = 0 - Parameters = < - item - Name = 'myparameter' - ParamType = tpString - end> - end> - ModuleName = 'mymodule' - Left = 397 - Top = 234 - Height = 497 - Width = 591 -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'myfunction' + Tag = 0 + Parameters = < + item + Name = 'myparameter' + ParamType = tpString + end> + end> + ModuleName = 'mymodule' + Left = 397 + Top = 234 + Height = 497 + Width = 591 +end diff --git a/Demos/Tutorial/Step.05/Unit1.dti b/Source/Demos/Tutorial/Step.04/Unit1.dti similarity index 92% rename from Demos/Tutorial/Step.05/Unit1.dti rename to Source/Demos/Tutorial/Step.04/Unit1.dti index 7c4bc17..9090a91 100644 --- a/Demos/Tutorial/Step.05/Unit1.dti +++ b/Source/Demos/Tutorial/Step.04/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=192 -Top=130 -Width=696 -Height=480 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=PHPExtension1\PHPExtension1.Functions\PHPExtension1.Functions[0]\TFunctionParams - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=192 +Top=130 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1\PHPExtension1.Functions\PHPExtension1.Functions[0]\TFunctionParams + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Tutorial/Step.02/Unit1.pas b/Source/Demos/Tutorial/Step.04/Unit1.pas similarity index 95% rename from Demos/Tutorial/Step.02/Unit1.pas rename to Source/Demos/Tutorial/Step.04/Unit1.pas index ecbc59f..1fcf616 100644 --- a/Demos/Tutorial/Step.02/Unit1.pas +++ b/Source/Demos/Tutorial/Step.04/Unit1.pas @@ -1,45 +1,45 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -unit Unit1; - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - TPHPExtension1 = class(TPHPExtension) - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + end. \ No newline at end of file diff --git a/Source/Demos/Tutorial/Step.05/Project1.dpr b/Source/Demos/Tutorial/Step.05/Project1.dpr new file mode 100644 index 0000000..598d21f --- /dev/null +++ b/Source/Demos/Tutorial/Step.05/Project1.dpr @@ -0,0 +1,16 @@ +library Project1; + +uses + Windows, + SysUtils, + phpApp, + phpModules, + Unit1 in 'Unit1.pas' {PHPExtension1: TPHPExtension}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TPHPExtension1, PHPExtension1); + Application.Run; +end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.05/Project1.dproj b/Source/Demos/Tutorial/Step.05/Project1.dproj similarity index 100% rename from Demos/Tutorial/Step.05/Project1.dproj rename to Source/Demos/Tutorial/Step.05/Project1.dproj diff --git a/Demos/Tutorial/Step.05/Project1.res b/Source/Demos/Tutorial/Step.05/Project1.res similarity index 100% rename from Demos/Tutorial/Step.05/Project1.res rename to Source/Demos/Tutorial/Step.05/Project1.res diff --git a/Demos/Tutorial/Step.05/Unit1.ddp b/Source/Demos/Tutorial/Step.05/Unit1.ddp similarity index 100% rename from Demos/Tutorial/Step.05/Unit1.ddp rename to Source/Demos/Tutorial/Step.05/Unit1.ddp diff --git a/Demos/Tutorial/Step.05/Unit1.dfm b/Source/Demos/Tutorial/Step.05/Unit1.dfm similarity index 95% rename from Demos/Tutorial/Step.05/Unit1.dfm rename to Source/Demos/Tutorial/Step.05/Unit1.dfm index b394487..8e8c523 100644 --- a/Demos/Tutorial/Step.05/Unit1.dfm +++ b/Source/Demos/Tutorial/Step.05/Unit1.dfm @@ -1,20 +1,20 @@ -object PHPExtension1: TPHPExtension1 - OldCreateOrder = False - Version = '1.0' - Functions = < - item - FunctionName = 'myfunction' - Tag = 0 - Parameters = < - item - Name = 'myparameter' - ParamType = tpString - end> - OnExecute = PHPExtension1Functions0Execute - end> - ModuleName = 'mymodule' - Left = 414 - Top = 262 - Height = 359 - Width = 478 -end +object PHPExtension1: TPHPExtension1 + OldCreateOrder = False + Version = '1.0' + Functions = < + item + FunctionName = 'myfunction' + Tag = 0 + Parameters = < + item + Name = 'myparameter' + ParamType = tpString + end> + OnExecute = PHPExtension1Functions0Execute + end> + ModuleName = 'mymodule' + Left = 414 + Top = 262 + Height = 359 + Width = 478 +end diff --git a/Demos/Tutorial/Step.04/Unit1.dti b/Source/Demos/Tutorial/Step.05/Unit1.dti similarity index 92% rename from Demos/Tutorial/Step.04/Unit1.dti rename to Source/Demos/Tutorial/Step.05/Unit1.dti index 7c4bc17..9090a91 100644 --- a/Demos/Tutorial/Step.04/Unit1.dti +++ b/Source/Demos/Tutorial/Step.05/Unit1.dti @@ -1,41 +1,41 @@ -[Designer] -Version=1 -Left=192 -Top=130 -Width=696 -Height=480 -Splitter=185 -SelectedTab=Components - -[Components] -Version=1 -Left=0 -Top=0 - -[TreeView] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -PrintSelected=0 -PrintVisible=0 -ExpandedItems=PHPExtension1\PHPExtension1.Functions\PHPExtension1.Functions[0]\TFunctionParams - -[DataDiagrams] -Version=1 -PrintHeader=1 -PrintToSingle=1 -PrintToFile=0 -PrintBorders=1 -Left=0 -Top=0 -ModeSelected=SelectionMode -Count=1 - -[DataDiagrams.Diagram.0] -Islands= -Comments= -Bridges= -Alludes= - +[Designer] +Version=1 +Left=192 +Top=130 +Width=696 +Height=480 +Splitter=185 +SelectedTab=Components + +[Components] +Version=1 +Left=0 +Top=0 + +[TreeView] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +PrintSelected=0 +PrintVisible=0 +ExpandedItems=PHPExtension1\PHPExtension1.Functions\PHPExtension1.Functions[0]\TFunctionParams + +[DataDiagrams] +Version=1 +PrintHeader=1 +PrintToSingle=1 +PrintToFile=0 +PrintBorders=1 +Left=0 +Top=0 +ModeSelected=SelectionMode +Count=1 + +[DataDiagrams.Diagram.0] +Islands= +Comments= +Bridges= +Alludes= + diff --git a/Demos/Tutorial/Step.05/Unit1.pas b/Source/Demos/Tutorial/Step.05/Unit1.pas similarity index 95% rename from Demos/Tutorial/Step.05/Unit1.pas rename to Source/Demos/Tutorial/Step.05/Unit1.pas index 24c784a..292a871 100644 --- a/Demos/Tutorial/Step.05/Unit1.pas +++ b/Source/Demos/Tutorial/Step.05/Unit1.pas @@ -1,57 +1,57 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -unit Unit1; - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -interface - -uses - Windows, - Messages, - SysUtils, - Classes, - Forms, - zendTypes, - zendAPI, - phpTypes, - phpAPI, - phpFunctions, - PHPModules; - -type - - TPHPExtension1 = class(TPHPExtension) - procedure PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - PHPExtension1: TPHPExtension1; - -implementation - -{$R *.DFM} - -procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); - -begin - //just returns the received value back - ReturnValue := Parameters[0].Value; -end; - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, + Messages, + SysUtils, + Classes, + Forms, + zendTypes, + zendAPI, + phpTypes, + phpAPI, + phpFunctions, + PHPModules; + +type + + TPHPExtension1 = class(TPHPExtension) + procedure PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + PHPExtension1: TPHPExtension1; + +implementation + +{$R *.DFM} + +procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); + +begin + //just returns the received value back + ReturnValue := Parameters[0].Value; +end; + end. \ No newline at end of file diff --git a/Demos/Tutorial/Step.06/test_script.php b/Source/Demos/Tutorial/Step.06/test_script.php similarity index 94% rename from Demos/Tutorial/Step.06/test_script.php rename to Source/Demos/Tutorial/Step.06/test_script.php index e97564a..e4c40cb 100644 --- a/Demos/Tutorial/Step.06/test_script.php +++ b/Source/Demos/Tutorial/Step.06/test_script.php @@ -1,22 +1,22 @@ -\n"; -foreach($functions as $func) { - echo $func."
\n"; -} - -?> +\n"; +foreach($functions as $func) { + echo $func."
\n"; +} + +?> diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/App.ico b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/App.ico similarity index 100% rename from Demos/php4Applications/C#/PHP4DelphiDemo/App.ico rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/App.ico diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs similarity index 97% rename from Demos/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs index 177a4f0..9f89a32 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs +++ b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/AssemblyInfo.cs @@ -1,58 +1,58 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs similarity index 97% rename from Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs index 4a471eb..5e71f07 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs +++ b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.cs @@ -1,223 +1,223 @@ -using System; -using System.Drawing; -using System.Collections; -using System.ComponentModel; -using System.Windows.Forms; -using System.Text; -using System.Data; -using System.Runtime.InteropServices; - - - -namespace PHP4DelphiDemo -{ - ///

- /// Summary description for Form1. - /// - public class Form1 : System.Windows.Forms.Form - { - private System.Windows.Forms.TextBox textBox1; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private Panel panel1; - private Button btnExecuteScript; - private Button btnExecuteCode; - /// - /// Required designer variable. - /// - private System.ComponentModel.Container components = null; - - public Form1() - { - // - // Required for Windows Form Designer support - // - InitializeComponent(); - - // - // TODO: Add any constructor code after InitializeComponent call - // - } - - /// - /// Clean up any resources being used. - /// - protected override void Dispose( bool disposing ) - { - if( disposing ) - { - if (components != null) - { - components.Dispose(); - } - } - base.Dispose( disposing ); - } - - #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.textBox1 = new System.Windows.Forms.TextBox(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.panel1 = new System.Windows.Forms.Panel(); - this.btnExecuteScript = new System.Windows.Forms.Button(); - this.btnExecuteCode = new System.Windows.Forms.Button(); - this.panel1.SuspendLayout(); - this.SuspendLayout(); - // - // textBox1 - // - this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBox1.Location = new System.Drawing.Point(0, 0); - this.textBox1.Multiline = true; - this.textBox1.Name = "textBox1"; - this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBox1.Size = new System.Drawing.Size(326, 197); - this.textBox1.TabIndex = 0; - // - // openFileDialog1 - // - this.openFileDialog1.Filter = "PHP files|*.php"; - // - // panel1 - // - this.panel1.Controls.Add(this.btnExecuteCode); - this.panel1.Controls.Add(this.btnExecuteScript); - this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; - this.panel1.Location = new System.Drawing.Point(0, 197); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(326, 49); - this.panel1.TabIndex = 2; - // - // btnExecuteScript - // - this.btnExecuteScript.Location = new System.Drawing.Point(12, 12); - this.btnExecuteScript.Name = "btnExecuteScript"; - this.btnExecuteScript.Size = new System.Drawing.Size(94, 23); - this.btnExecuteScript.TabIndex = 2; - this.btnExecuteScript.Text = "Execute Script"; - // - // btnExecuteCode - // - this.btnExecuteCode.Location = new System.Drawing.Point(112, 12); - this.btnExecuteCode.Name = "btnExecuteCode"; - this.btnExecuteCode.Size = new System.Drawing.Size(96, 23); - this.btnExecuteCode.TabIndex = 3; - this.btnExecuteCode.Text = "Execute Code"; - this.btnExecuteCode.UseVisualStyleBackColor = true; - this.btnExecuteCode.Click += new System.EventHandler(this.btnExecuteCode_Click); - // - // Form1 - // - this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); - this.ClientSize = new System.Drawing.Size(326, 246); - this.Controls.Add(this.textBox1); - this.Controls.Add(this.panel1); - this.Name = "Form1"; - this.Text = "PHP"; - this.panel1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - #endregion - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.Run(new Form1()); - } - - private void button1_Click(object sender, System.EventArgs e) - { - int l = 0; - int RequestID = 0; - StringBuilder builder = new StringBuilder(); - - if(openFileDialog1.ShowDialog() == DialogResult.OK) - { - RequestID = InitRequest(); - string fn = openFileDialog1.FileName; - ExecutePHP(RequestID, fn); - l = GetResultBufferSize(RequestID); - builder.Capacity = l; - l = GetResultText(RequestID, builder, builder.Capacity + 1); - textBox1.Text = builder.ToString(); - DoneRequest(RequestID); - } - - - } - - - [DllImport("PHP4App.dll")] - public static extern int InitRequest(); - - /// - /// Execute PHP script - /// - [DllImport("PHP4App.dll")] - public static extern int ExecutePHP(int RequestID, string FileName); - - [DllImport("PHP4App.dll", SetLastError=true)] - public static extern void DoneRequest(int RequestID); - - [DllImport("PHP4App.dll", SetLastError=true)] - public static extern int GetResultText(int RequestID, StringBuilder Buf, int BufLen); - - [DllImport("PHP4App.dll")] - public static extern void RegisterVariable(int RequestID, string AName, string AValue); - - [DllImport("PHP4App.dll")] - public static extern int ExecuteCode(int RequestID, string ACode); - - [DllImport("PHP4App.dll")] - public static extern int GetVariable(int RequestID, string AName, StringBuilder Buffer, int BufLen); - - [DllImport("PHP4App.dll")] - public static extern int SaveToFile(int RequestID, string AFileName); - - [DllImport("PHP4App.dll")] - public static extern int GetVariableSize(int RequestID, string AName); - - [DllImport("PHP4App.dll")] - public static extern int GetResultBufferSize(int RequestID); - - private void btnExecuteCode_Click(object sender, EventArgs e) - { - int l = 0; - int RequestID = 0; - StringBuilder builder = new StringBuilder(); - StringBuilder varbuilder = new StringBuilder(); - - RequestID = InitRequest(); - RegisterVariable(RequestID, "x","2"); - RegisterVariable(RequestID, "y","3"); - RegisterVariable(RequestID, "z","0"); - ExecuteCode(RequestID, "$z = $x + $y; echo \"Result \"; echo $z;"); - l = GetResultBufferSize(RequestID); - if (l > 0) - { - builder.Capacity = l; - GetResultText(RequestID, builder, builder.Capacity + 1); - textBox1.Text = builder.ToString(); - } - - l = GetVariableSize(RequestID, "z"); - if (l > 0) - { - varbuilder.Capacity = l; - GetVariable(RequestID, "z", varbuilder, varbuilder.Capacity + 1); - MessageBox.Show(String.Concat("After execution z=", varbuilder.ToString())); - } - DoneRequest(RequestID); - } - - } -} +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Text; +using System.Data; +using System.Runtime.InteropServices; + + + +namespace PHP4DelphiDemo +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private Panel panel1; + private Button btnExecuteScript; + private Button btnExecuteCode; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.panel1 = new System.Windows.Forms.Panel(); + this.btnExecuteScript = new System.Windows.Forms.Button(); + this.btnExecuteCode = new System.Windows.Forms.Button(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox1.Location = new System.Drawing.Point(0, 0); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBox1.Size = new System.Drawing.Size(326, 197); + this.textBox1.TabIndex = 0; + // + // openFileDialog1 + // + this.openFileDialog1.Filter = "PHP files|*.php"; + // + // panel1 + // + this.panel1.Controls.Add(this.btnExecuteCode); + this.panel1.Controls.Add(this.btnExecuteScript); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Location = new System.Drawing.Point(0, 197); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(326, 49); + this.panel1.TabIndex = 2; + // + // btnExecuteScript + // + this.btnExecuteScript.Location = new System.Drawing.Point(12, 12); + this.btnExecuteScript.Name = "btnExecuteScript"; + this.btnExecuteScript.Size = new System.Drawing.Size(94, 23); + this.btnExecuteScript.TabIndex = 2; + this.btnExecuteScript.Text = "Execute Script"; + // + // btnExecuteCode + // + this.btnExecuteCode.Location = new System.Drawing.Point(112, 12); + this.btnExecuteCode.Name = "btnExecuteCode"; + this.btnExecuteCode.Size = new System.Drawing.Size(96, 23); + this.btnExecuteCode.TabIndex = 3; + this.btnExecuteCode.Text = "Execute Code"; + this.btnExecuteCode.UseVisualStyleBackColor = true; + this.btnExecuteCode.Click += new System.EventHandler(this.btnExecuteCode_Click); + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(326, 246); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.panel1); + this.Name = "Form1"; + this.Text = "PHP"; + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.Run(new Form1()); + } + + private void button1_Click(object sender, System.EventArgs e) + { + int l = 0; + int RequestID = 0; + StringBuilder builder = new StringBuilder(); + + if(openFileDialog1.ShowDialog() == DialogResult.OK) + { + RequestID = InitRequest(); + string fn = openFileDialog1.FileName; + ExecutePHP(RequestID, fn); + l = GetResultBufferSize(RequestID); + builder.Capacity = l; + l = GetResultText(RequestID, builder, builder.Capacity + 1); + textBox1.Text = builder.ToString(); + DoneRequest(RequestID); + } + + + } + + + [DllImport("PHP4App.dll")] + public static extern int InitRequest(); + + /// + /// Execute PHP script + /// + [DllImport("PHP4App.dll")] + public static extern int ExecutePHP(int RequestID, string FileName); + + [DllImport("PHP4App.dll", SetLastError=true)] + public static extern void DoneRequest(int RequestID); + + [DllImport("PHP4App.dll", SetLastError=true)] + public static extern int GetResultText(int RequestID, StringBuilder Buf, int BufLen); + + [DllImport("PHP4App.dll")] + public static extern void RegisterVariable(int RequestID, string AName, string AValue); + + [DllImport("PHP4App.dll")] + public static extern int ExecuteCode(int RequestID, string ACode); + + [DllImport("PHP4App.dll")] + public static extern int GetVariable(int RequestID, string AName, StringBuilder Buffer, int BufLen); + + [DllImport("PHP4App.dll")] + public static extern int SaveToFile(int RequestID, string AFileName); + + [DllImport("PHP4App.dll")] + public static extern int GetVariableSize(int RequestID, string AName); + + [DllImport("PHP4App.dll")] + public static extern int GetResultBufferSize(int RequestID); + + private void btnExecuteCode_Click(object sender, EventArgs e) + { + int l = 0; + int RequestID = 0; + StringBuilder builder = new StringBuilder(); + StringBuilder varbuilder = new StringBuilder(); + + RequestID = InitRequest(); + RegisterVariable(RequestID, "x","2"); + RegisterVariable(RequestID, "y","3"); + RegisterVariable(RequestID, "z","0"); + ExecuteCode(RequestID, "$z = $x + $y; echo \"Result \"; echo $z;"); + l = GetResultBufferSize(RequestID); + if (l > 0) + { + builder.Capacity = l; + GetResultText(RequestID, builder, builder.Capacity + 1); + textBox1.Text = builder.ToString(); + } + + l = GetVariableSize(RequestID, "z"); + if (l > 0) + { + varbuilder.Capacity = l; + GetVariable(RequestID, "z", varbuilder, varbuilder.Capacity + 1); + MessageBox.Show(String.Concat("After execution z=", varbuilder.ToString())); + } + DoneRequest(RequestID); + } + + } +} diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx similarity index 97% rename from Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx index 8dc6b17..6e58fa8 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx +++ b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/Form1.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj similarity index 97% rename from Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj index ffc86c8..05de69b 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj +++ b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj @@ -1,112 +1,112 @@ - - - Local - 8.0.50727 - 2.0 - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA} - Debug - AnyCPU - App.ico - - - PHP4DelphiDemo - - - JScript - Grid - IE50 - false - WinExe - PHP4DelphiDemo - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - System - - - System.Data - - - System.Drawing - - - System.Windows.Forms - - - System.XML - - - - - - - Code - - - Form - - - Form1.cs - - - - - - - - - + + + Local + 8.0.50727 + 2.0 + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA} + Debug + AnyCPU + App.ico + + + PHP4DelphiDemo + + + JScript + Grid + IE50 + false + WinExe + PHP4DelphiDemo + OnBuildSuccess + + + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + + + Code + + + Form + + + Form1.cs + + + + + + + + + \ No newline at end of file diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user similarity index 97% rename from Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user index 5c913b9..5414047 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user +++ b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.csproj.user @@ -1,58 +1,58 @@ - - - 7.10.3077 - Debug - AnyCPU - - - - - - - 0 - ProjectFiles - 0 - - - false - false - false - false - false - - - Project - - - - - - - - - - - false - - - false - false - false - false - false - - - Project - - - - - - - - - - - true - + + + 7.10.3077 + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + \ No newline at end of file diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln similarity index 97% rename from Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln index dd398bc..9758dfe 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln +++ b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/PHP4DelphiDemo.sln @@ -1,19 +1,19 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PHP4DelphiDemo", "PHP4DelphiDemo.csproj", "{0DA732DE-42B5-436C-8BD0-9036B7D79EAA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PHP4DelphiDemo", "PHP4DelphiDemo.csproj", "{0DA732DE-42B5-436C-8BD0-9036B7D79EAA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0DA732DE-42B5-436C-8BD0-9036B7D79EAA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/app.config b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/app.config similarity index 95% rename from Demos/php4Applications/C#/PHP4DelphiDemo/app.config rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/app.config index 8055384..b7d8d1d 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/app.config +++ b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/app.config @@ -1,4 +1,4 @@ - - - - + + + + diff --git a/Demos/php4Applications/MS Word/test.php b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/test.php similarity index 89% rename from Demos/php4Applications/MS Word/test.php rename to Source/Demos/php4Applications/C#/PHP4DelphiDemo/test.php index 852e574..d3fccb8 100644 --- a/Demos/php4Applications/MS Word/test.php +++ b/Source/Demos/php4Applications/C#/PHP4DelphiDemo/test.php @@ -1,4 +1,4 @@ - + diff --git a/Demos/php4Applications/C++ VS 2005/StdAfx.cpp b/Source/Demos/php4Applications/C++ VS 2005/StdAfx.cpp similarity index 97% rename from Demos/php4Applications/C++ VS 2005/StdAfx.cpp rename to Source/Demos/php4Applications/C++ VS 2005/StdAfx.cpp index 5679876..976384e 100644 --- a/Demos/php4Applications/C++ VS 2005/StdAfx.cpp +++ b/Source/Demos/php4Applications/C++ VS 2005/StdAfx.cpp @@ -1,8 +1,8 @@ -// stdafx.cpp : source file that includes just the standard includes -// cdemo.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file +// stdafx.cpp : source file that includes just the standard includes +// cdemo.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/Demos/php4Applications/C++ VS 2005/StdAfx.h b/Source/Demos/php4Applications/C++ VS 2005/StdAfx.h similarity index 96% rename from Demos/php4Applications/C++ VS 2005/StdAfx.h rename to Source/Demos/php4Applications/C++ VS 2005/StdAfx.h index d193529..1b40500 100644 --- a/Demos/php4Applications/C++ VS 2005/StdAfx.h +++ b/Source/Demos/php4Applications/C++ VS 2005/StdAfx.h @@ -1,19 +1,19 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) -#define AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - - - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) +#define AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) diff --git a/Demos/php4Applications/C++ VS 2005/cdemo.cpp b/Source/Demos/php4Applications/C++ VS 2005/cdemo.cpp similarity index 97% rename from Demos/php4Applications/C++ VS 2005/cdemo.cpp rename to Source/Demos/php4Applications/C++ VS 2005/cdemo.cpp index 3ec10e9..02f788a 100644 --- a/Demos/php4Applications/C++ VS 2005/cdemo.cpp +++ b/Source/Demos/php4Applications/C++ VS 2005/cdemo.cpp @@ -1,101 +1,101 @@ -// cdemo.cpp : Defines the entry point for the console application. -// - - -# include "stdafx.h" -# include -# include -# include -# include - - -typedef int (WINAPI * ExecutePHP)(int request_id, char * filename); -typedef int (WINAPI * ExecuteCode)(int request_id, char * acode); -typedef void (WINAPI * RegisterVariable)(int request_id, char * aname, char * avalue); -typedef int (WINAPI * InitRequest)(void); -typedef void (WINAPI * DoneRequest)(int request_id); -typedef int (WINAPI * GetResultText)(int request_id, char *buf, int buflen); -typedef int (WINAPI * GetVariableSize)(int request_id, char *aname); -typedef int (WINAPI * GetVariable)(int request_id, char *aname, char *buf, int buflen); -typedef void (WINAPI * SaveToFile)(int request_id, char *filename); -typedef int (WINAPI * GetResultBufferSize)(int request_id); - -int main(int argc, char* argv[]) -{ - ExecutePHP lpfnExecutePHP; - RegisterVariable lpfnRegisterVariable; - ExecuteCode lpfnExecuteCode; - InitRequest lpfnInitRequest; - DoneRequest lpfnDoneRequest; - GetResultText lpfnGetResultText; - GetVariableSize lpfnGetVariableSize; - GetVariable lpfnGetVariable; - SaveToFile lpfnSaveToFile; - GetResultBufferSize lpfnGetResultBufferSize; - - HMODULE handle; - char *array; - int request_id; - int len; - - handle = LoadLibrary("php4app.dll"); - if( handle == NULL ) - return FALSE ; - - lpfnRegisterVariable = (RegisterVariable) GetProcAddress(handle, "RegisterVariable"); - lpfnExecutePHP = (ExecutePHP) GetProcAddress(handle, "ExecutePHP"); - lpfnExecuteCode = (ExecuteCode)GetProcAddress(handle, "ExecuteCode"); - lpfnInitRequest = (InitRequest)GetProcAddress(handle, "InitRequest"); - lpfnDoneRequest = (DoneRequest)GetProcAddress(handle, "DoneRequest"); - lpfnGetResultText = (GetResultText)GetProcAddress(handle, "GetResultText"); - lpfnGetVariableSize = (GetVariableSize)GetProcAddress(handle, "GetVariableSize"); - lpfnGetVariable = (GetVariable)GetProcAddress(handle, "GetVariable"); - lpfnSaveToFile = (SaveToFile)GetProcAddress(handle, "SaveToFile"); - lpfnGetResultBufferSize = (GetResultBufferSize)GetProcAddress(handle, "GetResultBufferSize"); - - if(lpfnRegisterVariable == NULL || - lpfnExecutePHP == NULL || - lpfnExecuteCode == NULL ) - { - FreeLibrary( handle ) ; - return FALSE ; - } - - request_id = lpfnInitRequest(); - lpfnRegisterVariable(request_id, "x", "2"); - lpfnRegisterVariable(request_id, "y", "3"); - lpfnRegisterVariable(request_id, "z", "0"); - - lpfnExecutePHP(request_id, "test.php"); - - len = lpfnGetResultText(request_id, NULL, 0); - array = (char *)malloc(len); - lpfnGetResultText(request_id, array, len); - printf("\n"); - printf("%s\n",array); - free(array); - - //get variable value after execution - len = lpfnGetVariableSize(request_id, "z"); - if (len > 0) { - array = (char *)malloc(len); - lpfnGetVariable(request_id, "z", array, len); - printf("after execution variable z = %s\n", array); - free(array); - } - lpfnDoneRequest(request_id); - - request_id = lpfnInitRequest(); - lpfnExecuteCode(request_id, "echo \"embedded script demo\\n\";"); - len = lpfnGetResultText(request_id, NULL, 0); - array = (char *)malloc(len); - lpfnGetResultText(request_id, array, len); - printf("\n"); - printf("%s\n",array); - free(array); - lpfnDoneRequest(request_id); - - FreeLibrary(handle); - - return 0; -} +// cdemo.cpp : Defines the entry point for the console application. +// + + +# include "stdafx.h" +# include +# include +# include +# include + + +typedef int (WINAPI * ExecutePHP)(int request_id, char * filename); +typedef int (WINAPI * ExecuteCode)(int request_id, char * acode); +typedef void (WINAPI * RegisterVariable)(int request_id, char * aname, char * avalue); +typedef int (WINAPI * InitRequest)(void); +typedef void (WINAPI * DoneRequest)(int request_id); +typedef int (WINAPI * GetResultText)(int request_id, char *buf, int buflen); +typedef int (WINAPI * GetVariableSize)(int request_id, char *aname); +typedef int (WINAPI * GetVariable)(int request_id, char *aname, char *buf, int buflen); +typedef void (WINAPI * SaveToFile)(int request_id, char *filename); +typedef int (WINAPI * GetResultBufferSize)(int request_id); + +int main(int argc, char* argv[]) +{ + ExecutePHP lpfnExecutePHP; + RegisterVariable lpfnRegisterVariable; + ExecuteCode lpfnExecuteCode; + InitRequest lpfnInitRequest; + DoneRequest lpfnDoneRequest; + GetResultText lpfnGetResultText; + GetVariableSize lpfnGetVariableSize; + GetVariable lpfnGetVariable; + SaveToFile lpfnSaveToFile; + GetResultBufferSize lpfnGetResultBufferSize; + + HMODULE handle; + char *array; + int request_id; + int len; + + handle = LoadLibrary("php4app.dll"); + if( handle == NULL ) + return FALSE ; + + lpfnRegisterVariable = (RegisterVariable) GetProcAddress(handle, "RegisterVariable"); + lpfnExecutePHP = (ExecutePHP) GetProcAddress(handle, "ExecutePHP"); + lpfnExecuteCode = (ExecuteCode)GetProcAddress(handle, "ExecuteCode"); + lpfnInitRequest = (InitRequest)GetProcAddress(handle, "InitRequest"); + lpfnDoneRequest = (DoneRequest)GetProcAddress(handle, "DoneRequest"); + lpfnGetResultText = (GetResultText)GetProcAddress(handle, "GetResultText"); + lpfnGetVariableSize = (GetVariableSize)GetProcAddress(handle, "GetVariableSize"); + lpfnGetVariable = (GetVariable)GetProcAddress(handle, "GetVariable"); + lpfnSaveToFile = (SaveToFile)GetProcAddress(handle, "SaveToFile"); + lpfnGetResultBufferSize = (GetResultBufferSize)GetProcAddress(handle, "GetResultBufferSize"); + + if(lpfnRegisterVariable == NULL || + lpfnExecutePHP == NULL || + lpfnExecuteCode == NULL ) + { + FreeLibrary( handle ) ; + return FALSE ; + } + + request_id = lpfnInitRequest(); + lpfnRegisterVariable(request_id, "x", "2"); + lpfnRegisterVariable(request_id, "y", "3"); + lpfnRegisterVariable(request_id, "z", "0"); + + lpfnExecutePHP(request_id, "test.php"); + + len = lpfnGetResultText(request_id, NULL, 0); + array = (char *)malloc(len); + lpfnGetResultText(request_id, array, len); + printf("\n"); + printf("%s\n",array); + free(array); + + //get variable value after execution + len = lpfnGetVariableSize(request_id, "z"); + if (len > 0) { + array = (char *)malloc(len); + lpfnGetVariable(request_id, "z", array, len); + printf("after execution variable z = %s\n", array); + free(array); + } + lpfnDoneRequest(request_id); + + request_id = lpfnInitRequest(); + lpfnExecuteCode(request_id, "echo \"embedded script demo\\n\";"); + len = lpfnGetResultText(request_id, NULL, 0); + array = (char *)malloc(len); + lpfnGetResultText(request_id, array, len); + printf("\n"); + printf("%s\n",array); + free(array); + lpfnDoneRequest(request_id); + + FreeLibrary(handle); + + return 0; +} diff --git a/Demos/php4Applications/C++ VS 6.0/cdemo.dsp b/Source/Demos/php4Applications/C++ VS 2005/cdemo.dsp similarity index 97% rename from Demos/php4Applications/C++ VS 6.0/cdemo.dsp rename to Source/Demos/php4Applications/C++ VS 2005/cdemo.dsp index a9ff39d..a6c53b0 100644 --- a/Demos/php4Applications/C++ VS 6.0/cdemo.dsp +++ b/Source/Demos/php4Applications/C++ VS 2005/cdemo.dsp @@ -1,113 +1,113 @@ -# Microsoft Developer Studio Project File - Name="cdemo" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=cdemo - 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 "cdemo.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 "cdemo.mak" CFG="cdemo - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "cdemo - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "cdemo - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "cdemo - Win32 Release" -# Name "cdemo - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\cdemo.cpp -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.cpp -# ADD CPP /Yc"stdafx.h" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\StdAfx.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="cdemo" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=cdemo - 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 "cdemo.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 "cdemo.mak" CFG="cdemo - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "cdemo - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "cdemo - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "cdemo - Win32 Release" +# Name "cdemo - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\cdemo.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/Demos/php4Applications/C++ VS 6.0/cdemo.dsw b/Source/Demos/php4Applications/C++ VS 2005/cdemo.dsw similarity index 94% rename from Demos/php4Applications/C++ VS 6.0/cdemo.dsw rename to Source/Demos/php4Applications/C++ VS 2005/cdemo.dsw index a7b42f3..883b7e0 100644 --- a/Demos/php4Applications/C++ VS 6.0/cdemo.dsw +++ b/Source/Demos/php4Applications/C++ VS 2005/cdemo.dsw @@ -1,29 +1,29 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "cdemo"=.\cdemo.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "cdemo"=.\cdemo.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Demos/php4Applications/C++ VS 2005/cdemo.sln b/Source/Demos/php4Applications/C++ VS 2005/cdemo.sln similarity index 97% rename from Demos/php4Applications/C++ VS 2005/cdemo.sln rename to Source/Demos/php4Applications/C++ VS 2005/cdemo.sln index 9ca35a3..7d26c36 100644 --- a/Demos/php4Applications/C++ VS 2005/cdemo.sln +++ b/Source/Demos/php4Applications/C++ VS 2005/cdemo.sln @@ -1,20 +1,20 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cdemo", "cdemo.vcproj", "{30D7BBD6-5766-4A88-818A-47AC1520B484}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {30D7BBD6-5766-4A88-818A-47AC1520B484}.Debug|Win32.ActiveCfg = Debug|Win32 - {30D7BBD6-5766-4A88-818A-47AC1520B484}.Debug|Win32.Build.0 = Debug|Win32 - {30D7BBD6-5766-4A88-818A-47AC1520B484}.Release|Win32.ActiveCfg = Release|Win32 - {30D7BBD6-5766-4A88-818A-47AC1520B484}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cdemo", "cdemo.vcproj", "{30D7BBD6-5766-4A88-818A-47AC1520B484}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {30D7BBD6-5766-4A88-818A-47AC1520B484}.Debug|Win32.ActiveCfg = Debug|Win32 + {30D7BBD6-5766-4A88-818A-47AC1520B484}.Debug|Win32.Build.0 = Debug|Win32 + {30D7BBD6-5766-4A88-818A-47AC1520B484}.Release|Win32.ActiveCfg = Release|Win32 + {30D7BBD6-5766-4A88-818A-47AC1520B484}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Demos/php4Applications/C++ VS 2005/cdemo.vcproj b/Source/Demos/php4Applications/C++ VS 2005/cdemo.vcproj similarity index 95% rename from Demos/php4Applications/C++ VS 2005/cdemo.vcproj rename to Source/Demos/php4Applications/C++ VS 2005/cdemo.vcproj index 735e786..f5d0004 100644 --- a/Demos/php4Applications/C++ VS 2005/cdemo.vcproj +++ b/Source/Demos/php4Applications/C++ VS 2005/cdemo.vcproj @@ -1,268 +1,268 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demos/php4Applications/Delphi/test.php b/Source/Demos/php4Applications/C++ VS 2005/test.php similarity index 90% rename from Demos/php4Applications/Delphi/test.php rename to Source/Demos/php4Applications/C++ VS 2005/test.php index 04b297f..54b255b 100644 --- a/Demos/php4Applications/Delphi/test.php +++ b/Source/Demos/php4Applications/C++ VS 2005/test.php @@ -1,5 +1,5 @@ - + diff --git a/Demos/php4Applications/C++ VS 6.0/StdAfx.cpp b/Source/Demos/php4Applications/C++ VS 6.0/StdAfx.cpp similarity index 97% rename from Demos/php4Applications/C++ VS 6.0/StdAfx.cpp rename to Source/Demos/php4Applications/C++ VS 6.0/StdAfx.cpp index 5679876..976384e 100644 --- a/Demos/php4Applications/C++ VS 6.0/StdAfx.cpp +++ b/Source/Demos/php4Applications/C++ VS 6.0/StdAfx.cpp @@ -1,8 +1,8 @@ -// stdafx.cpp : source file that includes just the standard includes -// cdemo.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file +// stdafx.cpp : source file that includes just the standard includes +// cdemo.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/Demos/php4Applications/C++ VS 6.0/StdAfx.h b/Source/Demos/php4Applications/C++ VS 6.0/StdAfx.h similarity index 96% rename from Demos/php4Applications/C++ VS 6.0/StdAfx.h rename to Source/Demos/php4Applications/C++ VS 6.0/StdAfx.h index d193529..1b40500 100644 --- a/Demos/php4Applications/C++ VS 6.0/StdAfx.h +++ b/Source/Demos/php4Applications/C++ VS 6.0/StdAfx.h @@ -1,19 +1,19 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) -#define AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - - - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) +#define AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__B8E472A2_BB1C_46B3_B1A1_8D3133C82D8D__INCLUDED_) diff --git a/Demos/php4Applications/C++ VS 6.0/cdemo.cpp b/Source/Demos/php4Applications/C++ VS 6.0/cdemo.cpp similarity index 97% rename from Demos/php4Applications/C++ VS 6.0/cdemo.cpp rename to Source/Demos/php4Applications/C++ VS 6.0/cdemo.cpp index 3ec10e9..02f788a 100644 --- a/Demos/php4Applications/C++ VS 6.0/cdemo.cpp +++ b/Source/Demos/php4Applications/C++ VS 6.0/cdemo.cpp @@ -1,101 +1,101 @@ -// cdemo.cpp : Defines the entry point for the console application. -// - - -# include "stdafx.h" -# include -# include -# include -# include - - -typedef int (WINAPI * ExecutePHP)(int request_id, char * filename); -typedef int (WINAPI * ExecuteCode)(int request_id, char * acode); -typedef void (WINAPI * RegisterVariable)(int request_id, char * aname, char * avalue); -typedef int (WINAPI * InitRequest)(void); -typedef void (WINAPI * DoneRequest)(int request_id); -typedef int (WINAPI * GetResultText)(int request_id, char *buf, int buflen); -typedef int (WINAPI * GetVariableSize)(int request_id, char *aname); -typedef int (WINAPI * GetVariable)(int request_id, char *aname, char *buf, int buflen); -typedef void (WINAPI * SaveToFile)(int request_id, char *filename); -typedef int (WINAPI * GetResultBufferSize)(int request_id); - -int main(int argc, char* argv[]) -{ - ExecutePHP lpfnExecutePHP; - RegisterVariable lpfnRegisterVariable; - ExecuteCode lpfnExecuteCode; - InitRequest lpfnInitRequest; - DoneRequest lpfnDoneRequest; - GetResultText lpfnGetResultText; - GetVariableSize lpfnGetVariableSize; - GetVariable lpfnGetVariable; - SaveToFile lpfnSaveToFile; - GetResultBufferSize lpfnGetResultBufferSize; - - HMODULE handle; - char *array; - int request_id; - int len; - - handle = LoadLibrary("php4app.dll"); - if( handle == NULL ) - return FALSE ; - - lpfnRegisterVariable = (RegisterVariable) GetProcAddress(handle, "RegisterVariable"); - lpfnExecutePHP = (ExecutePHP) GetProcAddress(handle, "ExecutePHP"); - lpfnExecuteCode = (ExecuteCode)GetProcAddress(handle, "ExecuteCode"); - lpfnInitRequest = (InitRequest)GetProcAddress(handle, "InitRequest"); - lpfnDoneRequest = (DoneRequest)GetProcAddress(handle, "DoneRequest"); - lpfnGetResultText = (GetResultText)GetProcAddress(handle, "GetResultText"); - lpfnGetVariableSize = (GetVariableSize)GetProcAddress(handle, "GetVariableSize"); - lpfnGetVariable = (GetVariable)GetProcAddress(handle, "GetVariable"); - lpfnSaveToFile = (SaveToFile)GetProcAddress(handle, "SaveToFile"); - lpfnGetResultBufferSize = (GetResultBufferSize)GetProcAddress(handle, "GetResultBufferSize"); - - if(lpfnRegisterVariable == NULL || - lpfnExecutePHP == NULL || - lpfnExecuteCode == NULL ) - { - FreeLibrary( handle ) ; - return FALSE ; - } - - request_id = lpfnInitRequest(); - lpfnRegisterVariable(request_id, "x", "2"); - lpfnRegisterVariable(request_id, "y", "3"); - lpfnRegisterVariable(request_id, "z", "0"); - - lpfnExecutePHP(request_id, "test.php"); - - len = lpfnGetResultText(request_id, NULL, 0); - array = (char *)malloc(len); - lpfnGetResultText(request_id, array, len); - printf("\n"); - printf("%s\n",array); - free(array); - - //get variable value after execution - len = lpfnGetVariableSize(request_id, "z"); - if (len > 0) { - array = (char *)malloc(len); - lpfnGetVariable(request_id, "z", array, len); - printf("after execution variable z = %s\n", array); - free(array); - } - lpfnDoneRequest(request_id); - - request_id = lpfnInitRequest(); - lpfnExecuteCode(request_id, "echo \"embedded script demo\\n\";"); - len = lpfnGetResultText(request_id, NULL, 0); - array = (char *)malloc(len); - lpfnGetResultText(request_id, array, len); - printf("\n"); - printf("%s\n",array); - free(array); - lpfnDoneRequest(request_id); - - FreeLibrary(handle); - - return 0; -} +// cdemo.cpp : Defines the entry point for the console application. +// + + +# include "stdafx.h" +# include +# include +# include +# include + + +typedef int (WINAPI * ExecutePHP)(int request_id, char * filename); +typedef int (WINAPI * ExecuteCode)(int request_id, char * acode); +typedef void (WINAPI * RegisterVariable)(int request_id, char * aname, char * avalue); +typedef int (WINAPI * InitRequest)(void); +typedef void (WINAPI * DoneRequest)(int request_id); +typedef int (WINAPI * GetResultText)(int request_id, char *buf, int buflen); +typedef int (WINAPI * GetVariableSize)(int request_id, char *aname); +typedef int (WINAPI * GetVariable)(int request_id, char *aname, char *buf, int buflen); +typedef void (WINAPI * SaveToFile)(int request_id, char *filename); +typedef int (WINAPI * GetResultBufferSize)(int request_id); + +int main(int argc, char* argv[]) +{ + ExecutePHP lpfnExecutePHP; + RegisterVariable lpfnRegisterVariable; + ExecuteCode lpfnExecuteCode; + InitRequest lpfnInitRequest; + DoneRequest lpfnDoneRequest; + GetResultText lpfnGetResultText; + GetVariableSize lpfnGetVariableSize; + GetVariable lpfnGetVariable; + SaveToFile lpfnSaveToFile; + GetResultBufferSize lpfnGetResultBufferSize; + + HMODULE handle; + char *array; + int request_id; + int len; + + handle = LoadLibrary("php4app.dll"); + if( handle == NULL ) + return FALSE ; + + lpfnRegisterVariable = (RegisterVariable) GetProcAddress(handle, "RegisterVariable"); + lpfnExecutePHP = (ExecutePHP) GetProcAddress(handle, "ExecutePHP"); + lpfnExecuteCode = (ExecuteCode)GetProcAddress(handle, "ExecuteCode"); + lpfnInitRequest = (InitRequest)GetProcAddress(handle, "InitRequest"); + lpfnDoneRequest = (DoneRequest)GetProcAddress(handle, "DoneRequest"); + lpfnGetResultText = (GetResultText)GetProcAddress(handle, "GetResultText"); + lpfnGetVariableSize = (GetVariableSize)GetProcAddress(handle, "GetVariableSize"); + lpfnGetVariable = (GetVariable)GetProcAddress(handle, "GetVariable"); + lpfnSaveToFile = (SaveToFile)GetProcAddress(handle, "SaveToFile"); + lpfnGetResultBufferSize = (GetResultBufferSize)GetProcAddress(handle, "GetResultBufferSize"); + + if(lpfnRegisterVariable == NULL || + lpfnExecutePHP == NULL || + lpfnExecuteCode == NULL ) + { + FreeLibrary( handle ) ; + return FALSE ; + } + + request_id = lpfnInitRequest(); + lpfnRegisterVariable(request_id, "x", "2"); + lpfnRegisterVariable(request_id, "y", "3"); + lpfnRegisterVariable(request_id, "z", "0"); + + lpfnExecutePHP(request_id, "test.php"); + + len = lpfnGetResultText(request_id, NULL, 0); + array = (char *)malloc(len); + lpfnGetResultText(request_id, array, len); + printf("\n"); + printf("%s\n",array); + free(array); + + //get variable value after execution + len = lpfnGetVariableSize(request_id, "z"); + if (len > 0) { + array = (char *)malloc(len); + lpfnGetVariable(request_id, "z", array, len); + printf("after execution variable z = %s\n", array); + free(array); + } + lpfnDoneRequest(request_id); + + request_id = lpfnInitRequest(); + lpfnExecuteCode(request_id, "echo \"embedded script demo\\n\";"); + len = lpfnGetResultText(request_id, NULL, 0); + array = (char *)malloc(len); + lpfnGetResultText(request_id, array, len); + printf("\n"); + printf("%s\n",array); + free(array); + lpfnDoneRequest(request_id); + + FreeLibrary(handle); + + return 0; +} diff --git a/Demos/php4Applications/C++ VS 2005/cdemo.dsp b/Source/Demos/php4Applications/C++ VS 6.0/cdemo.dsp similarity index 97% rename from Demos/php4Applications/C++ VS 2005/cdemo.dsp rename to Source/Demos/php4Applications/C++ VS 6.0/cdemo.dsp index a9ff39d..a6c53b0 100644 --- a/Demos/php4Applications/C++ VS 2005/cdemo.dsp +++ b/Source/Demos/php4Applications/C++ VS 6.0/cdemo.dsp @@ -1,113 +1,113 @@ -# Microsoft Developer Studio Project File - Name="cdemo" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=cdemo - 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 "cdemo.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 "cdemo.mak" CFG="cdemo - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "cdemo - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "cdemo - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "cdemo - Win32 Release" -# Name "cdemo - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\cdemo.cpp -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.cpp -# ADD CPP /Yc"stdafx.h" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\StdAfx.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="cdemo" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=cdemo - 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 "cdemo.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 "cdemo.mak" CFG="cdemo - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "cdemo - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "cdemo - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "cdemo - 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 "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "cdemo - Win32 Release" +# Name "cdemo - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\cdemo.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/Demos/php4Applications/C++ VS 2005/cdemo.dsw b/Source/Demos/php4Applications/C++ VS 6.0/cdemo.dsw similarity index 94% rename from Demos/php4Applications/C++ VS 2005/cdemo.dsw rename to Source/Demos/php4Applications/C++ VS 6.0/cdemo.dsw index a7b42f3..883b7e0 100644 --- a/Demos/php4Applications/C++ VS 2005/cdemo.dsw +++ b/Source/Demos/php4Applications/C++ VS 6.0/cdemo.dsw @@ -1,29 +1,29 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "cdemo"=.\cdemo.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "cdemo"=.\cdemo.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Demos/php4Applications/C++ VS 2005/test.php b/Source/Demos/php4Applications/C++ VS 6.0/test.php similarity index 90% rename from Demos/php4Applications/C++ VS 2005/test.php rename to Source/Demos/php4Applications/C++ VS 6.0/test.php index 04b297f..54b255b 100644 --- a/Demos/php4Applications/C++ VS 2005/test.php +++ b/Source/Demos/php4Applications/C++ VS 6.0/test.php @@ -1,5 +1,5 @@ - + diff --git a/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.pas b/Source/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.pas similarity index 96% rename from Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.pas rename to Source/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.pas index 97ebced..d503729 100644 --- a/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.pas +++ b/Source/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.pas @@ -1,142 +1,142 @@ -unit php4Delphi.MainForm; - -interface - -uses - System.Drawing, System.Collections, System.ComponentModel, - System.Windows.Forms, System.Data, System.Text, System.Runtime.InteropServices; - -type - TWinForm = class(System.Windows.Forms.Form) - {$REGION 'Designer Managed Code'} - strict private - /// - /// Required designer variable. - /// - Components: System.ComponentModel.Container; - TextBox1: System.Windows.Forms.TextBox; - Button1: System.Windows.Forms.Button; - OpenFileDialog1: System.Windows.Forms.OpenFileDialog; - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - procedure InitializeComponent; - procedure Button1_Click(sender: System.Object; e: System.EventArgs); - {$ENDREGION} - strict protected - /// - /// Clean up any resources being used. - /// - procedure Dispose(Disposing: Boolean); override; - private - { Private Declarations } - public - constructor Create; - end; - - [assembly: RuntimeRequiredAttribute(TypeOf(TWinForm))] - -implementation - -uses php4Delphi.Standard; - -{$AUTOBOX ON} - -{$REGION 'Windows Form Designer generated code'} -/// -/// Required method for Designer support -- do not modify -/// the contents of this method with the code editor. -/// -procedure TWinForm.InitializeComponent; -begin - Self.TextBox1 := System.Windows.Forms.TextBox.Create; - Self.Button1 := System.Windows.Forms.Button.Create; - Self.OpenFileDialog1 := System.Windows.Forms.OpenFileDialog.Create; - Self.SuspendLayout; - // - // TextBox1 - // - Self.TextBox1.Location := System.Drawing.Point.Create(8, 16); - Self.TextBox1.Multiline := True; - Self.TextBox1.Name := 'TextBox1'; - Self.TextBox1.ScrollBars := System.Windows.Forms.ScrollBars.Both; - Self.TextBox1.Size := System.Drawing.Size.Create(272, 180); - Self.TextBox1.TabIndex := 0; - Self.TextBox1.Text := ''; - // - // Button1 - // - Self.Button1.Location := System.Drawing.Point.Create(12, 224); - Self.Button1.Name := 'Button1'; - Self.Button1.TabIndex := 1; - Self.Button1.Text := 'Execute'; - Include(Self.Button1.Click, Self.Button1_Click); - // - // OpenFileDialog1 - // - Self.OpenFileDialog1.Filter := 'PHP files|*.php'; - // - // TWinForm - // - Self.AutoScaleBaseSize := System.Drawing.Size.Create(5, 13); - Self.ClientSize := System.Drawing.Size.Create(292, 266); - Self.Controls.Add(Self.Button1); - Self.Controls.Add(Self.TextBox1); - Self.FormBorderStyle := System.Windows.Forms.FormBorderStyle.FixedDialog; - Self.MaximizeBox := False; - Self.MinimizeBox := False; - Self.Name := 'TWinForm'; - Self.StartPosition := System.Windows.Forms.FormStartPosition.CenterScreen; - Self.Text := 'php4delphi'; - Self.ResumeLayout(False); -end; -{$ENDREGION} - -procedure TWinForm.Dispose(Disposing: Boolean); -begin - if Disposing then - begin - if Components <> nil then - Components.Dispose(); - end; - inherited Dispose(Disposing); -end; - -constructor TWinForm.Create; -begin - inherited Create; - // - // Required for Windows Form Designer support - // - InitializeComponent; - // - // TODO: Add any constructor code after InitializeComponent call - // -end; - -procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs); -var - RequestID : integer; - L : integer; - builder : StringBuilder; -begin - if OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK then - begin - RequestID := InitRequest; - ExecutePHP(RequestID, OpenFileDialog1.FileName); - L := GetResultBufferSize(RequestID); - if L > 0 then - begin - builder := StringBuilder.Create; - builder.Capacity := L; - GetResultText(RequestID, builder, L +1); - TextBox1.Text := builder.ToString; - DoneRequest(RequestID); - builder.Free; - end; - end; - -end; - -end. +unit php4Delphi.MainForm; + +interface + +uses + System.Drawing, System.Collections, System.ComponentModel, + System.Windows.Forms, System.Data, System.Text, System.Runtime.InteropServices; + +type + TWinForm = class(System.Windows.Forms.Form) + {$REGION 'Designer Managed Code'} + strict private + /// + /// Required designer variable. + /// + Components: System.ComponentModel.Container; + TextBox1: System.Windows.Forms.TextBox; + Button1: System.Windows.Forms.Button; + OpenFileDialog1: System.Windows.Forms.OpenFileDialog; + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + procedure InitializeComponent; + procedure Button1_Click(sender: System.Object; e: System.EventArgs); + {$ENDREGION} + strict protected + /// + /// Clean up any resources being used. + /// + procedure Dispose(Disposing: Boolean); override; + private + { Private Declarations } + public + constructor Create; + end; + + [assembly: RuntimeRequiredAttribute(TypeOf(TWinForm))] + +implementation + +uses php4Delphi.Standard; + +{$AUTOBOX ON} + +{$REGION 'Windows Form Designer generated code'} +/// +/// Required method for Designer support -- do not modify +/// the contents of this method with the code editor. +/// +procedure TWinForm.InitializeComponent; +begin + Self.TextBox1 := System.Windows.Forms.TextBox.Create; + Self.Button1 := System.Windows.Forms.Button.Create; + Self.OpenFileDialog1 := System.Windows.Forms.OpenFileDialog.Create; + Self.SuspendLayout; + // + // TextBox1 + // + Self.TextBox1.Location := System.Drawing.Point.Create(8, 16); + Self.TextBox1.Multiline := True; + Self.TextBox1.Name := 'TextBox1'; + Self.TextBox1.ScrollBars := System.Windows.Forms.ScrollBars.Both; + Self.TextBox1.Size := System.Drawing.Size.Create(272, 180); + Self.TextBox1.TabIndex := 0; + Self.TextBox1.Text := ''; + // + // Button1 + // + Self.Button1.Location := System.Drawing.Point.Create(12, 224); + Self.Button1.Name := 'Button1'; + Self.Button1.TabIndex := 1; + Self.Button1.Text := 'Execute'; + Include(Self.Button1.Click, Self.Button1_Click); + // + // OpenFileDialog1 + // + Self.OpenFileDialog1.Filter := 'PHP files|*.php'; + // + // TWinForm + // + Self.AutoScaleBaseSize := System.Drawing.Size.Create(5, 13); + Self.ClientSize := System.Drawing.Size.Create(292, 266); + Self.Controls.Add(Self.Button1); + Self.Controls.Add(Self.TextBox1); + Self.FormBorderStyle := System.Windows.Forms.FormBorderStyle.FixedDialog; + Self.MaximizeBox := False; + Self.MinimizeBox := False; + Self.Name := 'TWinForm'; + Self.StartPosition := System.Windows.Forms.FormStartPosition.CenterScreen; + Self.Text := 'php4delphi'; + Self.ResumeLayout(False); +end; +{$ENDREGION} + +procedure TWinForm.Dispose(Disposing: Boolean); +begin + if Disposing then + begin + if Components <> nil then + Components.Dispose(); + end; + inherited Dispose(Disposing); +end; + +constructor TWinForm.Create; +begin + inherited Create; + // + // Required for Windows Form Designer support + // + InitializeComponent; + // + // TODO: Add any constructor code after InitializeComponent call + // +end; + +procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs); +var + RequestID : integer; + L : integer; + builder : StringBuilder; +begin + if OpenFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK then + begin + RequestID := InitRequest; + ExecutePHP(RequestID, OpenFileDialog1.FileName); + L := GetResultBufferSize(RequestID); + if L > 0 then + begin + builder := StringBuilder.Create; + builder.Capacity := L; + GetResultText(RequestID, builder, L +1); + TextBox1.Text := builder.ToString; + DoneRequest(RequestID); + builder.Free; + end; + end; + +end; + +end. diff --git a/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.resx b/Source/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.resx similarity index 98% rename from Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.resx rename to Source/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.resx index bee20ba..acc72bf 100644 --- a/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.resx +++ b/Source/Demos/php4Applications/Delphi .NET/php4Delphi.MainForm.resx @@ -1,142 +1,142 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - False - - - Private - - - Private - - - 17, 17 - - - False - - - (Default) - - - False - - - False - - - 4, 4 - - - True - - - 80 - - - True - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + Private + + + False + + + Private + + + Private + + + 17, 17 + + + False + + + (Default) + + + False + + + False + + + 4, 4 + + + True + + + 80 + + + True + + diff --git a/Demos/php4Applications/Delphi .NET/php4Delphi.Standard.pas b/Source/Demos/php4Applications/Delphi .NET/php4Delphi.Standard.pas similarity index 97% rename from Demos/php4Applications/Delphi .NET/php4Delphi.Standard.pas rename to Source/Demos/php4Applications/Delphi .NET/php4Delphi.Standard.pas index a89000d..207997d 100644 --- a/Demos/php4Applications/Delphi .NET/php4Delphi.Standard.pas +++ b/Source/Demos/php4Applications/Delphi .NET/php4Delphi.Standard.pas @@ -1,52 +1,52 @@ -unit php4Delphi.Standard; - -interface -uses - Types, System.Text, System.Runtime.InteropServices; - -function InitRequest : integer; -procedure DoneRequest(RequestID : integer); -procedure RegisterVariable(RequestID : integer; AName : string; AValue : string); -function ExecutePHP(RequestID : integer; FileName : string) : integer; -function ExecuteCode(RequestID : integer; ACode : string) : integer; -function GetResultText(RequestID : integer; Buffer : StringBuilder; BufLen : integer) : integer; -function GetVariable(RequestID : integer; AName : string; Buffer : StringBuilder; BufLen : integer) : integer; -procedure SaveToFile(RequestID : integer; AFileName : string); -function GetVariableSize(RequestID : integer; AName : string) : integer; -function GetResultBufferSize(RequestID : integer) : integer; - -implementation -uses - System.Security; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -function InitRequest; external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -procedure DoneRequest; external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -procedure RegisterVariable;external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -function ExecutePHP;external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -function ExecuteCode;external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -function GetResultText;external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -function GetVariable;external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -procedure SaveToFile;external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -function GetVariableSize;external; - -[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] -function GetResultBufferSize;external; - -end. +unit php4Delphi.Standard; + +interface +uses + Types, System.Text, System.Runtime.InteropServices; + +function InitRequest : integer; +procedure DoneRequest(RequestID : integer); +procedure RegisterVariable(RequestID : integer; AName : string; AValue : string); +function ExecutePHP(RequestID : integer; FileName : string) : integer; +function ExecuteCode(RequestID : integer; ACode : string) : integer; +function GetResultText(RequestID : integer; Buffer : StringBuilder; BufLen : integer) : integer; +function GetVariable(RequestID : integer; AName : string; Buffer : StringBuilder; BufLen : integer) : integer; +procedure SaveToFile(RequestID : integer; AFileName : string); +function GetVariableSize(RequestID : integer; AName : string) : integer; +function GetResultBufferSize(RequestID : integer) : integer; + +implementation +uses + System.Security; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function InitRequest; external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +procedure DoneRequest; external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +procedure RegisterVariable;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function ExecutePHP;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function ExecuteCode;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function GetResultText;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function GetVariable;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +procedure SaveToFile;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function GetVariableSize;external; + +[SuppressUnmanagedCodeSecurity, DllImport('php4app.dll', CharSet = CharSet.Ansi, SetLastError = True)] +function GetResultBufferSize;external; + +end. diff --git a/Demos/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources b/Source/Demos/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources similarity index 100% rename from Demos/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources rename to Source/Demos/php4Applications/Delphi .NET/php4Delphi.TWinForm.resources diff --git a/Demos/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj b/Source/Demos/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj similarity index 97% rename from Demos/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj rename to Source/Demos/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj index 07d266a..12c9a32 100644 --- a/Demos/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj +++ b/Source/Demos/php4Applications/Delphi .NET/php4DelphiDemo.bdsproj @@ -1,235 +1,235 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - php4DelphiDemo.dpr - - - 7.0 - - - 0 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - True - True - WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - - - - 0 - 0 - False - 1 - True - False - False - 4096 - 1048576 - 4194304 - - - - - - - - c:\windows\microsoft.net\framework\v1.1.4322 - c:\windows\microsoft.net\framework\v1.1.4322\System.XML.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Data.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.dll - - - True - - - - - - False - - - True - False - - - - $00000000 - - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 2067 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + php4DelphiDemo.dpr + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + True + False + False + 4096 + 1048576 + 4194304 + + + + + + + + c:\windows\microsoft.net\framework\v1.1.4322 + c:\windows\microsoft.net\framework\v1.1.4322\System.XML.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Drawing.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.Data.dll;c:\windows\microsoft.net\framework\v1.1.4322\System.dll + + + True + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2067 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demos/php4Applications/Delphi .NET/php4DelphiDemo.dpr b/Source/Demos/php4Applications/Delphi .NET/php4DelphiDemo.dpr similarity index 97% rename from Demos/php4Applications/Delphi .NET/php4DelphiDemo.dpr rename to Source/Demos/php4Applications/Delphi .NET/php4DelphiDemo.dpr index 9f5784b..d37c1ac 100644 --- a/Demos/php4Applications/Delphi .NET/php4DelphiDemo.dpr +++ b/Source/Demos/php4Applications/Delphi .NET/php4DelphiDemo.dpr @@ -1,100 +1,100 @@ -program php4DelphiDemo; - -{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.dll'} -{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Data.dll'} -{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Drawing.dll'} -{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll'} -{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.XML.dll'} -{$R 'php4Delphi.TWinForm.resources' 'php4Delphi.MainForm.resx'} - -uses - System.Reflection, - System.Runtime.CompilerServices, - System.Runtime.InteropServices, - System.Windows.Forms, - php4Delphi.MainForm in 'php4Delphi.MainForm.pas' {php4Delphi.MainForm.TWinForm: System.Windows.Forms.Form}, - php4Delphi.Standard in 'php4Delphi.Standard.pas'; - -{$R *.res} - -{$REGION 'Program/Assembly Information'} -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyDescription('')] -[assembly: AssemblyConfiguration('')] -[assembly: AssemblyCompany('')] -[assembly: AssemblyProduct('')] -[assembly: AssemblyCopyright('')] -[assembly: AssemblyTrademark('')] -[assembly: AssemblyCulture('')] - -// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. -// You can set this in the IDE via the Project Options. -// Manually setting the AssemblyTitle attribute below will override the IDE -// setting. -// [assembly: AssemblyTitle('')] - - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion('1.0.*')] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output -// directory is the project directory (the default). -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile('')] -[assembly: AssemblyKeyName('')] - - -// -// Use the attributes below to control the COM visibility of your assembly. By -// default the entire assembly is visible to COM. Setting ComVisible to false -// is the recommended default for your assembly. To then expose a class and interface -// to COM set ComVisible to true on each one. It is also recommended to add a -// Guid attribute. -// - -[assembly: ComVisible(False)] -//[assembly: Guid('')] -//[assembly: TypeLibVersion(1, 0)] -{$ENDREGION} - -[STAThread] -begin - Application.Run(TWinForm.Create); -end. +program php4DelphiDemo; + +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Data.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Drawing.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll'} +{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.XML.dll'} +{$R 'php4Delphi.TWinForm.resources' 'php4Delphi.MainForm.resx'} + +uses + System.Reflection, + System.Runtime.CompilerServices, + System.Runtime.InteropServices, + System.Windows.Forms, + php4Delphi.MainForm in 'php4Delphi.MainForm.pas' {php4Delphi.MainForm.TWinForm: System.Windows.Forms.Form}, + php4Delphi.Standard in 'php4Delphi.Standard.pas'; + +{$R *.res} + +{$REGION 'Program/Assembly Information'} +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] +{$ENDREGION} + +[STAThread] +begin + Application.Run(TWinForm.Create); +end. diff --git a/Demos/php4Applications/Delphi .NET/php4DelphiDemo.res b/Source/Demos/php4Applications/Delphi .NET/php4DelphiDemo.res similarity index 100% rename from Demos/php4Applications/Delphi .NET/php4DelphiDemo.res rename to Source/Demos/php4Applications/Delphi .NET/php4DelphiDemo.res diff --git a/Demos/php4Applications/Delphi/Project1.bdsproj b/Source/Demos/php4Applications/Delphi/Project1.bdsproj similarity index 100% rename from Demos/php4Applications/Delphi/Project1.bdsproj rename to Source/Demos/php4Applications/Delphi/Project1.bdsproj diff --git a/Demos/php4Applications/Delphi/Project1.dpr b/Source/Demos/php4Applications/Delphi/Project1.dpr similarity index 93% rename from Demos/php4Applications/Delphi/Project1.dpr rename to Source/Demos/php4Applications/Delphi/Project1.dpr index 79c301d..dfa3f13 100644 --- a/Demos/php4Applications/Delphi/Project1.dpr +++ b/Source/Demos/php4Applications/Delphi/Project1.dpr @@ -1,13 +1,13 @@ -program Project1; - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/php4Applications/Delphi/Project1.res b/Source/Demos/php4Applications/Delphi/Project1.res similarity index 100% rename from Demos/php4Applications/Delphi/Project1.res rename to Source/Demos/php4Applications/Delphi/Project1.res diff --git a/Demos/php4Applications/Delphi/Unit1.ddp b/Source/Demos/php4Applications/Delphi/Unit1.ddp similarity index 100% rename from Demos/php4Applications/Delphi/Unit1.ddp rename to Source/Demos/php4Applications/Delphi/Unit1.ddp diff --git a/Demos/php4Applications/Delphi/Unit1.dfm b/Source/Demos/php4Applications/Delphi/Unit1.dfm similarity index 95% rename from Demos/php4Applications/Delphi/Unit1.dfm rename to Source/Demos/php4Applications/Delphi/Unit1.dfm index 039b5cf..b1b2df7 100644 --- a/Demos/php4Applications/Delphi/Unit1.dfm +++ b/Source/Demos/php4Applications/Delphi/Unit1.dfm @@ -1,62 +1,62 @@ -object Form1: TForm1 - Left = 259 - Top = 321 - BorderStyle = bsDialog - Caption = 'Form1' - ClientHeight = 296 - ClientWidth = 609 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - PixelsPerInch = 96 - TextHeight = 13 - object Memo1: TMemo - Left = 16 - Top = 12 - Width = 581 - Height = 241 - Lines.Strings = ( - '$z = $x + $y; echo "Result "; echo $z;') - TabOrder = 0 - end - object btnExecuteScript: TButton - Left = 16 - Top = 264 - Width = 101 - Height = 25 - Caption = 'Execute script' - TabOrder = 1 - OnClick = btnExecuteScriptClick - end - object btnExecuteCode: TButton - Left = 124 - Top = 264 - Width = 109 - Height = 25 - Caption = 'Execute Code' - TabOrder = 2 - OnClick = btnExecuteCodeClick - end - object btnClose: TButton - Left = 524 - Top = 264 - Width = 75 - Height = 25 - Caption = 'Close' - TabOrder = 3 - OnClick = btnCloseClick - end - object btnExecuteAndSave: TButton - Left = 240 - Top = 264 - Width = 145 - Height = 25 - Caption = 'Execute and Save' - TabOrder = 4 - OnClick = btnExecuteAndSaveClick - end -end +object Form1: TForm1 + Left = 259 + Top = 321 + BorderStyle = bsDialog + Caption = 'Form1' + ClientHeight = 296 + ClientWidth = 609 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Memo1: TMemo + Left = 16 + Top = 12 + Width = 581 + Height = 241 + Lines.Strings = ( + '$z = $x + $y; echo "Result "; echo $z;') + TabOrder = 0 + end + object btnExecuteScript: TButton + Left = 16 + Top = 264 + Width = 101 + Height = 25 + Caption = 'Execute script' + TabOrder = 1 + OnClick = btnExecuteScriptClick + end + object btnExecuteCode: TButton + Left = 124 + Top = 264 + Width = 109 + Height = 25 + Caption = 'Execute Code' + TabOrder = 2 + OnClick = btnExecuteCodeClick + end + object btnClose: TButton + Left = 524 + Top = 264 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 3 + OnClick = btnCloseClick + end + object btnExecuteAndSave: TButton + Left = 240 + Top = 264 + Width = 145 + Height = 25 + Caption = 'Execute and Save' + TabOrder = 4 + OnClick = btnExecuteAndSaveClick + end +end diff --git a/Demos/php4Applications/Delphi/Unit1.pas b/Source/Demos/php4Applications/Delphi/Unit1.pas similarity index 96% rename from Demos/php4Applications/Delphi/Unit1.pas rename to Source/Demos/php4Applications/Delphi/Unit1.pas index f78d31d..bbf6e65 100644 --- a/Demos/php4Applications/Delphi/Unit1.pas +++ b/Source/Demos/php4Applications/Delphi/Unit1.pas @@ -1,127 +1,127 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -unit Unit1; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, PHP4AppIntf; - -type - TForm1 = class(TForm) - Memo1: TMemo; - btnExecuteScript: TButton; - btnExecuteCode: TButton; - btnClose: TButton; - btnExecuteAndSave: TButton; - procedure btnExecuteScriptClick(Sender: TObject); - procedure btnCloseClick(Sender: TObject); - procedure btnExecuteCodeClick(Sender: TObject); - procedure btnExecuteAndSaveClick(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - RequestID : integer; - end; - -var - Form1: TForm1; - - -implementation - -{$R *.DFM} - -procedure TForm1.btnExecuteScriptClick(Sender: TObject); -var - S : String; - L : integer; - FileName : string; - FilePath : string; -begin - Memo1.Lines.Clear; - RequestID := InitRequest; - RegisterVariable(RequestID, 'x','2'); - RegisterVariable(RequestID, 'y','3'); - RegisterVariable(RequestID, 'z','0'); - - FilePath := ExtractFilePath(ParamStr(0)); - FileName := IncludeTrailingBackslash(FilePath) + 'test.php'; - - ExecutePHP(RequestID, PAnsiChar(FileName)); - - L := GetResultText(RequestID, nil, 0); - if L > 0 then - begin - SetLength(S, L); - GetResultText(RequestID, PChar(S), L); - end; - memo1.Lines.Text := S; - L := GetVariableSize(RequestID, 'z'); - if L > 0 then - begin - SetLength(S, L); - GetVariable(RequestID, 'z', PChar(S), L); - ShowMessage('After execution z = ' + S); - end; - DoneRequest(RequestID); -end; - -procedure TForm1.btnCloseClick(Sender: TObject); -begin - Close; -end; - -procedure TForm1.btnExecuteCodeClick(Sender: TObject); -var - S : String; - L : integer; -begin - Memo1.Lines.Clear; - RequestID := InitRequest; - RegisterVariable(RequestID, 'x','2'); - RegisterVariable(RequestID, 'y','3'); - RegisterVariable(RequestID, 'z','0'); - ExecuteCode(RequestID, '$z = $x + $y; echo "Result "; echo $z;'); - L := GetResultBufferSize(RequestID); - if L > 0 then - begin - SetLength(S, L); - GetResultText(RequestID, PChar(S), L); - end; - memo1.Lines.Text := S; - L := GetVariableSize(RequestID, 'z'); - if L > 0 then - begin - SetLength(S, L); - GetVariable(RequestID, 'z', PChar(S), L); - ShowMessage('After execution z = ' + S); - end; - DoneRequest(RequestID); -end; - -procedure TForm1.btnExecuteAndSaveClick(Sender: TObject); -begin - Memo1.Lines.Clear; - RequestID := InitRequest; - RegisterVariable(RequestID, 'x','2'); - RegisterVariable(RequestID, 'y','3'); - RegisterVariable(RequestID, 'z','0'); - ExecuteCode(RequestID, '$z = $x + $y; echo "Result "; echo $z;'); - SaveToFile(RequestID, 'result.txt'); - memo1.Lines.LoadFromFile('result.txt'); - DoneRequest(RequestID); -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, PHP4AppIntf; + +type + TForm1 = class(TForm) + Memo1: TMemo; + btnExecuteScript: TButton; + btnExecuteCode: TButton; + btnClose: TButton; + btnExecuteAndSave: TButton; + procedure btnExecuteScriptClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure btnExecuteCodeClick(Sender: TObject); + procedure btnExecuteAndSaveClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + RequestID : integer; + end; + +var + Form1: TForm1; + + +implementation + +{$R *.DFM} + +procedure TForm1.btnExecuteScriptClick(Sender: TObject); +var + S : String; + L : integer; + FileName : string; + FilePath : string; +begin + Memo1.Lines.Clear; + RequestID := InitRequest; + RegisterVariable(RequestID, 'x','2'); + RegisterVariable(RequestID, 'y','3'); + RegisterVariable(RequestID, 'z','0'); + + FilePath := ExtractFilePath(ParamStr(0)); + FileName := IncludeTrailingBackslash(FilePath) + 'test.php'; + + ExecutePHP(RequestID, PAnsiChar(FileName)); + + L := GetResultText(RequestID, nil, 0); + if L > 0 then + begin + SetLength(S, L); + GetResultText(RequestID, PChar(S), L); + end; + memo1.Lines.Text := S; + L := GetVariableSize(RequestID, 'z'); + if L > 0 then + begin + SetLength(S, L); + GetVariable(RequestID, 'z', PChar(S), L); + ShowMessage('After execution z = ' + S); + end; + DoneRequest(RequestID); +end; + +procedure TForm1.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TForm1.btnExecuteCodeClick(Sender: TObject); +var + S : String; + L : integer; +begin + Memo1.Lines.Clear; + RequestID := InitRequest; + RegisterVariable(RequestID, 'x','2'); + RegisterVariable(RequestID, 'y','3'); + RegisterVariable(RequestID, 'z','0'); + ExecuteCode(RequestID, '$z = $x + $y; echo "Result "; echo $z;'); + L := GetResultBufferSize(RequestID); + if L > 0 then + begin + SetLength(S, L); + GetResultText(RequestID, PChar(S), L); + end; + memo1.Lines.Text := S; + L := GetVariableSize(RequestID, 'z'); + if L > 0 then + begin + SetLength(S, L); + GetVariable(RequestID, 'z', PChar(S), L); + ShowMessage('After execution z = ' + S); + end; + DoneRequest(RequestID); +end; + +procedure TForm1.btnExecuteAndSaveClick(Sender: TObject); +begin + Memo1.Lines.Clear; + RequestID := InitRequest; + RegisterVariable(RequestID, 'x','2'); + RegisterVariable(RequestID, 'y','3'); + RegisterVariable(RequestID, 'z','0'); + ExecuteCode(RequestID, '$z = $x + $y; echo "Result "; echo $z;'); + SaveToFile(RequestID, 'result.txt'); + memo1.Lines.LoadFromFile('result.txt'); + DoneRequest(RequestID); +end; + +end. diff --git a/Demos/php4Applications/Delphi/result.txt b/Source/Demos/php4Applications/Delphi/result.txt similarity index 100% rename from Demos/php4Applications/Delphi/result.txt rename to Source/Demos/php4Applications/Delphi/result.txt diff --git a/Demos/php4Applications/C++ VS 6.0/test.php b/Source/Demos/php4Applications/Delphi/test.php similarity index 90% rename from Demos/php4Applications/C++ VS 6.0/test.php rename to Source/Demos/php4Applications/Delphi/test.php index 04b297f..54b255b 100644 --- a/Demos/php4Applications/C++ VS 6.0/test.php +++ b/Source/Demos/php4Applications/Delphi/test.php @@ -1,5 +1,5 @@ - + diff --git a/Demos/php4Applications/MS Word/Doc1.doc b/Source/Demos/php4Applications/MS Word/Doc1.doc similarity index 100% rename from Demos/php4Applications/MS Word/Doc1.doc rename to Source/Demos/php4Applications/MS Word/Doc1.doc diff --git a/Demos/php4Applications/C#/PHP4DelphiDemo/test.php b/Source/Demos/php4Applications/MS Word/test.php similarity index 89% rename from Demos/php4Applications/C#/PHP4DelphiDemo/test.php rename to Source/Demos/php4Applications/MS Word/test.php index 852e574..d3fccb8 100644 --- a/Demos/php4Applications/C#/PHP4DelphiDemo/test.php +++ b/Source/Demos/php4Applications/MS Word/test.php @@ -1,4 +1,4 @@ - + diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi.sln b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi.sln similarity index 97% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi.sln rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi.sln index ff74d51..5eb86b4 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi.sln +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi.sln @@ -1,20 +1,20 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "php4delphi", "php4delphi\php4delphi.vbproj", "{98A25626-5C96-46EB-8A80-2D2C7236D025}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {98A25626-5C96-46EB-8A80-2D2C7236D025}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {98A25626-5C96-46EB-8A80-2D2C7236D025}.Debug|Any CPU.Build.0 = Debug|Any CPU - {98A25626-5C96-46EB-8A80-2D2C7236D025}.Release|Any CPU.ActiveCfg = Release|Any CPU - {98A25626-5C96-46EB-8A80-2D2C7236D025}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "php4delphi", "php4delphi\php4delphi.vbproj", "{98A25626-5C96-46EB-8A80-2D2C7236D025}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {98A25626-5C96-46EB-8A80-2D2C7236D025}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98A25626-5C96-46EB-8A80-2D2C7236D025}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98A25626-5C96-46EB-8A80-2D2C7236D025}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98A25626-5C96-46EB-8A80-2D2C7236D025}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb similarity index 97% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb index 8d713bd..3dc6448 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/ApplicationEvents.vb @@ -1,15 +1,15 @@ -Namespace My - - ' The following events are availble for MyApplication: - ' - ' Startup: Raised when the application starts, before the startup form is created. - ' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally. - ' UnhandledException: Raised if the application encounters an unhandled exception. - ' StartupNextInstance: Raised when launching a single-instance application and the application is already active. - ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected. - Partial Friend Class MyApplication - - End Class - -End Namespace - +Namespace My + + ' The following events are availble for MyApplication: + ' + ' Startup: Raised when the application starts, before the startup form is created. + ' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally. + ' UnhandledException: Raised if the application encounters an unhandled exception. + ' StartupNextInstance: Raised when launching a single-instance application and the application is already active. + ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected. + Partial Friend Class MyApplication + + End Class + +End Namespace + diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb similarity index 97% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb index d4d90e7..3adb089 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.Designer.vb @@ -1,71 +1,71 @@ - _ -Partial Class Form1 - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - MyBase.Dispose(disposing) - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - _ - Private Sub InitializeComponent() - Me.TextBox1 = New System.Windows.Forms.TextBox - Me.Button1 = New System.Windows.Forms.Button - Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog - Me.SuspendLayout() - ' - 'TextBox1 - ' - Me.TextBox1.Location = New System.Drawing.Point(10, 16) - Me.TextBox1.Multiline = True - Me.TextBox1.Name = "TextBox1" - Me.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both - Me.TextBox1.Size = New System.Drawing.Size(588, 177) - Me.TextBox1.TabIndex = 0 - ' - 'Button1 - ' - Me.Button1.Location = New System.Drawing.Point(13, 223) - Me.Button1.Name = "Button1" - Me.Button1.Size = New System.Drawing.Size(75, 23) - Me.Button1.TabIndex = 1 - Me.Button1.Text = "Execute" - Me.Button1.UseVisualStyleBackColor = True - ' - 'OpenFileDialog1 - ' - Me.OpenFileDialog1.Filter = "PHP files|*.php" - Me.OpenFileDialog1.Title = "Select script to execute" - ' - 'Form1 - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(610, 266) - Me.Controls.Add(Me.Button1) - Me.Controls.Add(Me.TextBox1) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "Form1" - Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen - Me.Text = "php4delphi" - Me.ResumeLayout(False) - Me.PerformLayout() - - End Sub - Friend WithEvents TextBox1 As System.Windows.Forms.TextBox - Friend WithEvents Button1 As System.Windows.Forms.Button - Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog - -End Class + _ +Partial Class Form1 + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + MyBase.Dispose(disposing) + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.TextBox1 = New System.Windows.Forms.TextBox + Me.Button1 = New System.Windows.Forms.Button + Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog + Me.SuspendLayout() + ' + 'TextBox1 + ' + Me.TextBox1.Location = New System.Drawing.Point(10, 16) + Me.TextBox1.Multiline = True + Me.TextBox1.Name = "TextBox1" + Me.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both + Me.TextBox1.Size = New System.Drawing.Size(588, 177) + Me.TextBox1.TabIndex = 0 + ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(13, 223) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(75, 23) + Me.Button1.TabIndex = 1 + Me.Button1.Text = "Execute" + Me.Button1.UseVisualStyleBackColor = True + ' + 'OpenFileDialog1 + ' + Me.OpenFileDialog1.Filter = "PHP files|*.php" + Me.OpenFileDialog1.Title = "Select script to execute" + ' + 'Form1 + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(610, 266) + Me.Controls.Add(Me.Button1) + Me.Controls.Add(Me.TextBox1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "Form1" + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen + Me.Text = "php4delphi" + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents TextBox1 As System.Windows.Forms.TextBox + Friend WithEvents Button1 As System.Windows.Forms.Button + Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog + +End Class diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx similarity index 97% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx index 5d4a9b8..710a648 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb similarity index 98% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb index 69e31f6..06fe6d4 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/Form1.vb @@ -1,32 +1,32 @@ -Imports System.Runtime.InteropServices - -Public Class Form1 - - Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click - Dim L As Integer - Dim builder As StringBuilder = New StringBuilder - Dim RequestID As Integer - Dim fn As String - If OpenFileDialog1.ShowDialog Then - RequestID = InitRequest() - fn = OpenFileDialog1.FileName - ExecutePHP(RequestID, fn) - L = GetResultText(RequestID, builder, 0) - builder.Capacity = L - L = GetResultText(RequestID, builder, builder.Capacity + 1) - TextBox1.Text = builder.ToString() - DoneRequest(RequestID) - End If - End Sub - Public Declare Ansi Function ExecutePHP Lib "php4app.dll" (ByVal RequestID As Integer, ByVal FileName As String) As Integer - Public Declare Ansi Function InitRequest Lib "php4app.dll" () As Integer - Public Declare Ansi Sub DoneRequest Lib "php4app.dll" (ByVal RequestID As Integer) - Public Declare Ansi Function GetResultText Lib "php4app.dll" (ByVal RequestID As Integer, ByVal Buf As StringBuilder, ByVal Buflen As Integer) As Integer - Public Declare Ansi Sub RegisterVariable Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String, ByVal AValue As String) - Public Declare Ansi Function ExecuteCode Lib "php4app.dll" (ByVal RequestID As Integer, ByVal ACode As String) As Integer - Public Declare Ansi Function GetVariable Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String, ByVal Buffer As StringBuilder, ByVal BufLen As Integer) As Integer - Public Declare Ansi Sub SaveToFile Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AFileName As String) - Public Declare Ansi Function GetVariableSize Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String) As Integer - Public Declare Ansi Function GetResultBufferSize Lib "php4app.dll" (ByVal RequestID As Integer) As Integer - -End Class +Imports System.Runtime.InteropServices + +Public Class Form1 + + Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click + Dim L As Integer + Dim builder As StringBuilder = New StringBuilder + Dim RequestID As Integer + Dim fn As String + If OpenFileDialog1.ShowDialog Then + RequestID = InitRequest() + fn = OpenFileDialog1.FileName + ExecutePHP(RequestID, fn) + L = GetResultText(RequestID, builder, 0) + builder.Capacity = L + L = GetResultText(RequestID, builder, builder.Capacity + 1) + TextBox1.Text = builder.ToString() + DoneRequest(RequestID) + End If + End Sub + Public Declare Ansi Function ExecutePHP Lib "php4app.dll" (ByVal RequestID As Integer, ByVal FileName As String) As Integer + Public Declare Ansi Function InitRequest Lib "php4app.dll" () As Integer + Public Declare Ansi Sub DoneRequest Lib "php4app.dll" (ByVal RequestID As Integer) + Public Declare Ansi Function GetResultText Lib "php4app.dll" (ByVal RequestID As Integer, ByVal Buf As StringBuilder, ByVal Buflen As Integer) As Integer + Public Declare Ansi Sub RegisterVariable Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String, ByVal AValue As String) + Public Declare Ansi Function ExecuteCode Lib "php4app.dll" (ByVal RequestID As Integer, ByVal ACode As String) As Integer + Public Declare Ansi Function GetVariable Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String, ByVal Buffer As StringBuilder, ByVal BufLen As Integer) As Integer + Public Declare Ansi Sub SaveToFile Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AFileName As String) + Public Declare Ansi Function GetVariableSize Lib "php4app.dll" (ByVal RequestID As Integer, ByVal AName As String) As Integer + Public Declare Ansi Function GetResultBufferSize Lib "php4app.dll" (ByVal RequestID As Integer) As Integer + +End Class diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb similarity index 97% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb index 214503f..83b31ad 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.Designer.vb @@ -1,38 +1,38 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - 'NOTE: This file is auto-generated; do not modify it directly. To make changes, - ' or if you encounter build errors in this file, go to the Project Designer - ' (go to Project Properties or double-click the My Project node in - ' Solution Explorer), and make changes on the Application tab. - ' - Partial Friend Class MyApplication - - _ - Public Sub New() - MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) - Me.IsSingleInstance = false - Me.EnableVisualStyles = true - Me.SaveMySettingsOnExit = true - Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses - End Sub - - _ - Protected Overrides Sub OnCreateMainForm() - Me.MainForm = Global.php4delphi.Form1 - End Sub - End Class -End Namespace +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:2.0.50727.42 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'NOTE: This file is auto-generated; do not modify it directly. To make changes, + ' or if you encounter build errors in this file, go to the Project Designer + ' (go to Project Properties or double-click the My Project node in + ' Solution Explorer), and make changes on the Application tab. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.php4delphi.Form1 + End Sub + End Class +End Namespace diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp similarity index 98% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp index 458ea32..c0f7fef 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/My Project/Application.myapp @@ -1,10 +1,10 @@ - - - true - Form1 - false - 0 - true - 0 - true + + + true + Form1 + false + 0 + true + 0 + true \ No newline at end of file diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj similarity index 97% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj index 569c587..c09f7d4 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj @@ -1,88 +1,88 @@ - - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {98A25626-5C96-46EB-8A80-2D2C7236D025} - WinExe - php4delphi.My.MyApplication - php4delphi - php4delphi - WindowsForms - - - true - full - true - true - bin\Debug\ - php4delphi.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - pdbonly - false - true - true - bin\Release\ - php4delphi.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - - - - - - - - - - - - - - - - - - - - - - Form - - - Form1.vb - Form - - - True - Application.myapp - - - - - Designer - Form1.vb - - - - - - - MyApplicationCodeGenerator - Application.Designer.vb - - - - + + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {98A25626-5C96-46EB-8A80-2D2C7236D025} + WinExe + php4delphi.My.MyApplication + php4delphi + php4delphi + WindowsForms + + + true + full + true + true + bin\Debug\ + php4delphi.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\Release\ + php4delphi.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + + + + + + + + + + + + + + + + + + + + + + Form + + + Form1.vb + Form + + + True + Application.myapp + + + + + Designer + Form1.vb + + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + + \ No newline at end of file diff --git a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user similarity index 97% rename from Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user rename to Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user index 9c0b2d9..c8dfea1 100644 --- a/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user +++ b/Source/Demos/php4Applications/VB .NET/php4delphi/php4delphi/php4delphi.vbproj.user @@ -1,16 +1,16 @@ - - - publish\ - - - - - - - - - 0 - en-US - false - + + + publish\ + + + + + + + + + 0 + en-US + false + \ No newline at end of file diff --git a/Demos/php4Applications/Visual Basic/Form1.frm b/Source/Demos/php4Applications/Visual Basic/Form1.frm similarity index 96% rename from Demos/php4Applications/Visual Basic/Form1.frm rename to Source/Demos/php4Applications/Visual Basic/Form1.frm index f8dd426..c42d183 100644 --- a/Demos/php4Applications/Visual Basic/Form1.frm +++ b/Source/Demos/php4Applications/Visual Basic/Form1.frm @@ -1,50 +1,50 @@ -VERSION 5.00 -Begin VB.Form Form1 - Caption = "Form1" - ClientHeight = 6870 - ClientLeft = 60 - ClientTop = 345 - ClientWidth = 8790 - LinkTopic = "Form1" - ScaleHeight = 6870 - ScaleWidth = 8790 - StartUpPosition = 3 'Windows Default - Begin VB.CommandButton ButtonExecute - Caption = "Execute" - Height = 375 - Left = 7560 - TabIndex = 1 - Top = 360 - Width = 1095 - End - Begin VB.TextBox Text1 - Height = 6495 - Left = 240 - MultiLine = -1 'True - TabIndex = 0 - Top = 240 - Width = 7215 - End -End -Attribute VB_Name = "Form1" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Private Sub ButtonExecute_Click() -Dim code As Long -Dim RequestID As Long -Dim L As Long -Dim Res As String - - Res = "" - RequestID = InitRequest() - code = ExecutePHP(RequestID, "c:\php5\test.php") - L = GetResultText(RequestID, Res, 0) - Res = Space(L + 1) - - L = GetResultText(RequestID, Res, L) - DoneRequest (RequestID) - Text1.Text = Res - -End Sub +VERSION 5.00 +Begin VB.Form Form1 + Caption = "Form1" + ClientHeight = 6870 + ClientLeft = 60 + ClientTop = 345 + ClientWidth = 8790 + LinkTopic = "Form1" + ScaleHeight = 6870 + ScaleWidth = 8790 + StartUpPosition = 3 'Windows Default + Begin VB.CommandButton ButtonExecute + Caption = "Execute" + Height = 375 + Left = 7560 + TabIndex = 1 + Top = 360 + Width = 1095 + End + Begin VB.TextBox Text1 + Height = 6495 + Left = 240 + MultiLine = -1 'True + TabIndex = 0 + Top = 240 + Width = 7215 + End +End +Attribute VB_Name = "Form1" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Private Sub ButtonExecute_Click() +Dim code As Long +Dim RequestID As Long +Dim L As Long +Dim Res As String + + Res = "" + RequestID = InitRequest() + code = ExecutePHP(RequestID, "c:\php5\test.php") + L = GetResultText(RequestID, Res, 0) + Res = Space(L + 1) + + L = GetResultText(RequestID, Res, L) + DoneRequest (RequestID) + Text1.Text = Res + +End Sub diff --git a/Demos/php4Applications/Visual Basic/MSSCCPRJ.SCC b/Source/Demos/php4Applications/Visual Basic/MSSCCPRJ.SCC similarity index 97% rename from Demos/php4Applications/Visual Basic/MSSCCPRJ.SCC rename to Source/Demos/php4Applications/Visual Basic/MSSCCPRJ.SCC index fb38a99..57528cb 100644 --- a/Demos/php4Applications/Visual Basic/MSSCCPRJ.SCC +++ b/Source/Demos/php4Applications/Visual Basic/MSSCCPRJ.SCC @@ -1,5 +1,5 @@ -[SCC] -SCC=This is a source code control file -[php_VB.vbp] -SCC_Project_Name=this project is not under source code control -SCC_Aux_Path= +[SCC] +SCC=This is a source code control file +[php_VB.vbp] +SCC_Project_Name=this project is not under source code control +SCC_Aux_Path= diff --git a/Demos/php4Applications/Visual Basic/php_VB.vbp b/Source/Demos/php4Applications/Visual Basic/php_VB.vbp similarity index 95% rename from Demos/php4Applications/Visual Basic/php_VB.vbp rename to Source/Demos/php4Applications/Visual Basic/php_VB.vbp index 3c4772a..99d5b15 100644 --- a/Demos/php4Applications/Visual Basic/php_VB.vbp +++ b/Source/Demos/php4Applications/Visual Basic/php_VB.vbp @@ -1,32 +1,32 @@ -Type=Exe -Form=Form1.frm -Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\StdOle2.Tlb#OLE Automation -Module=php_module; php_module.bas -IconForm="Form1" -Startup="Form1" -ExeName32="php_VB.exe" -Command32="" -Name="php_VB" -HelpContextID="0" -CompatibleMode="0" -MajorVer=1 -MinorVer=0 -RevisionVer=0 -AutoIncrementVer=0 -ServerSupportFiles=0 -VersionCompanyName="Fedpol" -CompilationType=0 -OptimizationType=0 -FavorPentiumPro(tm)=0 -CodeViewDebugInfo=0 -NoAliasing=0 -BoundsCheck=0 -OverflowCheck=0 -FlPointCheck=0 -FDIVCheck=0 -UnroundedFP=0 -StartMode=0 -Unattended=0 -Retained=0 -ThreadPerObject=0 -MaxNumberOfThreads=1 +Type=Exe +Form=Form1.frm +Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\StdOle2.Tlb#OLE Automation +Module=php_module; php_module.bas +IconForm="Form1" +Startup="Form1" +ExeName32="php_VB.exe" +Command32="" +Name="php_VB" +HelpContextID="0" +CompatibleMode="0" +MajorVer=1 +MinorVer=0 +RevisionVer=0 +AutoIncrementVer=0 +ServerSupportFiles=0 +VersionCompanyName="Fedpol" +CompilationType=0 +OptimizationType=0 +FavorPentiumPro(tm)=0 +CodeViewDebugInfo=0 +NoAliasing=0 +BoundsCheck=0 +OverflowCheck=0 +FlPointCheck=0 +FDIVCheck=0 +UnroundedFP=0 +StartMode=0 +Unattended=0 +Retained=0 +ThreadPerObject=0 +MaxNumberOfThreads=1 diff --git a/Demos/php4Applications/Visual Basic/php_VB.vbw b/Source/Demos/php4Applications/Visual Basic/php_VB.vbw similarity index 97% rename from Demos/php4Applications/Visual Basic/php_VB.vbw rename to Source/Demos/php4Applications/Visual Basic/php_VB.vbw index 457b520..0c44b62 100644 --- a/Demos/php4Applications/Visual Basic/php_VB.vbw +++ b/Source/Demos/php4Applications/Visual Basic/php_VB.vbw @@ -1,2 +1,2 @@ -Form1 = 66, 66, 702, 613, , 22, 22, 658, 569, C -php_module = 44, 44, 680, 591, +Form1 = 66, 66, 702, 613, , 22, 22, 658, 569, C +php_module = 44, 44, 680, 591, diff --git a/Demos/php4Applications/Visual Basic/php_module.bas b/Source/Demos/php4Applications/Visual Basic/php_module.bas similarity index 98% rename from Demos/php4Applications/Visual Basic/php_module.bas rename to Source/Demos/php4Applications/Visual Basic/php_module.bas index de82c82..ff67043 100644 --- a/Demos/php4Applications/Visual Basic/php_module.bas +++ b/Source/Demos/php4Applications/Visual Basic/php_module.bas @@ -1,14 +1,14 @@ -Attribute VB_Name = "php_module" -Option Explicit - -Public Declare Function ExecutePHP Lib "php4app.dll" (ByVal RequestID As Long, ByVal FileName As String) As Long -Public Declare Function InitRequest Lib "php4app.dll" () As Long -Public Declare Sub DoneRequest Lib "php4app.dll" (ByVal RequestID As Long) -Public Declare Function GetResultText Lib "php4app.dll" (ByVal RequestID As Long, ByVal Buf As String, ByVal Buflen As Long) As Long -Public Declare Sub RegisterVariable Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String, ByVal AValue As String) -Public Declare Function ExecuteCode Lib "php4app.dll" (ByVal RequestID As Long, ByVal ACode As String) As Long -Public Declare Function GetVariable Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String, ByVal Buffer As String, ByVal BufLen As Long) As Long -Public Declare Sub SaveToFile Lib "php4app.dll" (ByVal RequestID As Long, ByVal AFileName As String) -Public Declare Function GetVariableSize Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String) As Long -Public Declare Function GetResultBufferSize Lib "php4app.dll" (ByVal RequestID As Long) As Long - +Attribute VB_Name = "php_module" +Option Explicit + +Public Declare Function ExecutePHP Lib "php4app.dll" (ByVal RequestID As Long, ByVal FileName As String) As Long +Public Declare Function InitRequest Lib "php4app.dll" () As Long +Public Declare Sub DoneRequest Lib "php4app.dll" (ByVal RequestID As Long) +Public Declare Function GetResultText Lib "php4app.dll" (ByVal RequestID As Long, ByVal Buf As String, ByVal Buflen As Long) As Long +Public Declare Sub RegisterVariable Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String, ByVal AValue As String) +Public Declare Function ExecuteCode Lib "php4app.dll" (ByVal RequestID As Long, ByVal ACode As String) As Long +Public Declare Function GetVariable Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String, ByVal Buffer As String, ByVal BufLen As Long) As Long +Public Declare Sub SaveToFile Lib "php4app.dll" (ByVal RequestID As Long, ByVal AFileName As String) +Public Declare Function GetVariableSize Lib "php4app.dll" (ByVal RequestID As Long, ByVal AName As String) As Long +Public Declare Function GetResultBufferSize Lib "php4app.dll" (ByVal RequestID As Long) As Long + diff --git a/Demos/php4Applications/Visual Basic/test.php b/Source/Demos/php4Applications/Visual Basic/test.php similarity index 89% rename from Demos/php4Applications/Visual Basic/test.php rename to Source/Demos/php4Applications/Visual Basic/test.php index 852e574..d3fccb8 100644 --- a/Demos/php4Applications/Visual Basic/test.php +++ b/Source/Demos/php4Applications/Visual Basic/test.php @@ -1,4 +1,4 @@ - + diff --git a/Demos/psvPHP/Components/ComponentsDemo.bdsproj b/Source/Demos/psvPHP/Components/ComponentsDemo.bdsproj similarity index 100% rename from Demos/psvPHP/Components/ComponentsDemo.bdsproj rename to Source/Demos/psvPHP/Components/ComponentsDemo.bdsproj diff --git a/Demos/psvPHP/Components/ComponentsDemo.dpr b/Source/Demos/psvPHP/Components/ComponentsDemo.dpr similarity index 94% rename from Demos/psvPHP/Components/ComponentsDemo.dpr rename to Source/Demos/psvPHP/Components/ComponentsDemo.dpr index 8291061..0e34a1e 100644 --- a/Demos/psvPHP/Components/ComponentsDemo.dpr +++ b/Source/Demos/psvPHP/Components/ComponentsDemo.dpr @@ -1,14 +1,14 @@ -program ComponentsDemo; - -uses - Forms, - Unit1 in 'Unit1.pas' {frmTest}; - -{$R *.RES} - -begin - Application.Initialize; - Application.Title := 'Components Demo'; - Application.CreateForm(TfrmTest, frmTest); - Application.Run; -end. +program ComponentsDemo; + +uses + Forms, + Unit1 in 'Unit1.pas' {frmTest}; + +{$R *.RES} + +begin + Application.Initialize; + Application.Title := 'Components Demo'; + Application.CreateForm(TfrmTest, frmTest); + Application.Run; +end. diff --git a/Demos/psvPHP/Components/ComponentsDemo.res b/Source/Demos/psvPHP/Components/ComponentsDemo.res similarity index 100% rename from Demos/psvPHP/Components/ComponentsDemo.res rename to Source/Demos/psvPHP/Components/ComponentsDemo.res diff --git a/Demos/psvPHP/Components/Unit1.ddp b/Source/Demos/psvPHP/Components/Unit1.ddp similarity index 100% rename from Demos/psvPHP/Components/Unit1.ddp rename to Source/Demos/psvPHP/Components/Unit1.ddp diff --git a/Demos/psvPHP/Components/Unit1.dfm b/Source/Demos/psvPHP/Components/Unit1.dfm similarity index 95% rename from Demos/psvPHP/Components/Unit1.dfm rename to Source/Demos/psvPHP/Components/Unit1.dfm index a400fcf..b51da76 100644 --- a/Demos/psvPHP/Components/Unit1.dfm +++ b/Source/Demos/psvPHP/Components/Unit1.dfm @@ -1,60 +1,60 @@ -object frmTest: TfrmTest - Left = 399 - Top = 356 - BorderStyle = bsDialog - Caption = 'Components demo' - ClientHeight = 252 - ClientWidth = 472 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - OnCreate = FormCreate - OnDestroy = FormDestroy - PixelsPerInch = 96 - TextHeight = 13 - object Label1: TLabel - Left = 0 - Top = 226 - Width = 472 - Height = 26 - Align = alBottom - Caption = - 'This demo project shows how to access published property'#13#10'of Del' + - 'phi components from PHP script' - Color = clInfoBk - ParentColor = False - WordWrap = True - end - object memScript: TMemo - Left = 8 - Top = 8 - Width = 369 - Height = 213 - TabOrder = 0 - end - object btnExecute: TButton - Left = 384 - Top = 12 - Width = 75 - Height = 25 - Caption = '&Execute' - TabOrder = 1 - OnClick = btnExecuteClick - end - object PHP: TpsvPHP - Variables = <> - Left = 400 - Top = 136 - end - object PHPEngine: TPHPEngine - Constants = <> - ReportDLLError = False - Left = 408 - Top = 88 - end -end +object frmTest: TfrmTest + Left = 399 + Top = 356 + BorderStyle = bsDialog + Caption = 'Components demo' + ClientHeight = 252 + ClientWidth = 472 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 0 + Top = 226 + Width = 472 + Height = 26 + Align = alBottom + Caption = + 'This demo project shows how to access published property'#13#10'of Del' + + 'phi components from PHP script' + Color = clInfoBk + ParentColor = False + WordWrap = True + end + object memScript: TMemo + Left = 8 + Top = 8 + Width = 369 + Height = 213 + TabOrder = 0 + end + object btnExecute: TButton + Left = 384 + Top = 12 + Width = 75 + Height = 25 + Caption = '&Execute' + TabOrder = 1 + OnClick = btnExecuteClick + end + object PHP: TpsvPHP + Variables = <> + Left = 400 + Top = 136 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 408 + Top = 88 + end +end diff --git a/Demos/psvPHP/Components/Unit1.pas b/Source/Demos/psvPHP/Components/Unit1.pas similarity index 96% rename from Demos/psvPHP/Components/Unit1.pas rename to Source/Demos/psvPHP/Components/Unit1.pas index c1bc8f2..d0afb70 100644 --- a/Demos/psvPHP/Components/Unit1.pas +++ b/Source/Demos/psvPHP/Components/Unit1.pas @@ -1,134 +1,134 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -//This demo project shows how to access published property -//of Delphi components from PHP script - -{$I PHP.INC} - -unit Unit1; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, php4delphi, PHPCommon; - -type - - TMyButton = class(TButton) - private - function GetFontSize: integer; - procedure SetFontSize(const Value: integer); - published - property FontSize : integer read GetFontSize write SetFontSize; - end; - - TfrmTest = class(TForm) - memScript: TMemo; - btnExecute: TButton; - PHP: TpsvPHP; - Label1: TLabel; - PHPEngine: TPHPEngine; - procedure btnExecuteClick(Sender: TObject); - procedure btnCloseClick(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure FormDestroy(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - btnClose : TMyButton; - end; - -var - frmTest: TfrmTest; - -implementation - -{$R *.DFM} -{$R WindowsXP.res} - -procedure TfrmTest.btnExecuteClick(Sender: TObject); -begin - PHP.RunCode(memScript.Lines.Text); -end; - -procedure TfrmTest.btnCloseClick(Sender: TObject); -begin - Close; -end; - -procedure TfrmTest.FormCreate(Sender: TObject); -begin - btnClose := TMyButton.Create(Self); - with btnClose do - begin - Name := 'btnClose'; - Parent := Self; - Left := 384; - Top := 42; - Width := 75; - Height := 25; - Caption := '&Close'; - TabOrder := 2; - OnClick := btnCloseClick; - end; - - memScript.Lines.Clear; - with memScript.Lines do - begin - {$IFDEF PHP4} - Add('$btnClose = register_delphi_component("btnClose");'); - Add('$frmTest = register_delphi_component("frmTest");'); - Add('$btnClose->Caption = "&Exit";'); - Add('$frmTest->Caption = "PHP4Delphi demo";'); - Add('$btnClose->Top = 150;'); - Add('$btnClose->Font->Size = 10;'); - Add('$btnClose->Cursor = -21;'); - Add('$frmTest->Color = clGreen;'); - Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); - Add('delphi_show_message($st);'); - {$ELSE} - Add('$btnClose = register_delphi_component("btnClose");'); - Add('$frmTest = register_delphi_component("frmTest");'); - Add('$btnClose->Caption = "&Exit";'); - Add('$frmTest->Caption = "PHP4Delphi demo";'); - Add('$btnClose->Top = 150;'); - Add('$btnClose->FontSize = 10;'); - Add('$btnClose->Cursor = -21;'); - Add('$frmTest->Color = clGreen;'); - Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); - Add('delphi_show_message($st);'); - {$ENDIF} - end; - PHPEngine.StartupEngine; -end; - -procedure TfrmTest.FormDestroy(Sender: TObject); -begin - btnClose.Free; - PHPEngine.ShutdownEngine; -end; - -{ TMyButton } - -function TMyButton.GetFontSize: integer; -begin - Result := Font.Size; -end; - -procedure TMyButton.SetFontSize(const Value: integer); -begin - Font.Size := Value; -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +//This demo project shows how to access published property +//of Delphi components from PHP script + +{$I PHP.INC} + +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, php4delphi, PHPCommon; + +type + + TMyButton = class(TButton) + private + function GetFontSize: integer; + procedure SetFontSize(const Value: integer); + published + property FontSize : integer read GetFontSize write SetFontSize; + end; + + TfrmTest = class(TForm) + memScript: TMemo; + btnExecute: TButton; + PHP: TpsvPHP; + Label1: TLabel; + PHPEngine: TPHPEngine; + procedure btnExecuteClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + btnClose : TMyButton; + end; + +var + frmTest: TfrmTest; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TfrmTest.btnExecuteClick(Sender: TObject); +begin + PHP.RunCode(memScript.Lines.Text); +end; + +procedure TfrmTest.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmTest.FormCreate(Sender: TObject); +begin + btnClose := TMyButton.Create(Self); + with btnClose do + begin + Name := 'btnClose'; + Parent := Self; + Left := 384; + Top := 42; + Width := 75; + Height := 25; + Caption := '&Close'; + TabOrder := 2; + OnClick := btnCloseClick; + end; + + memScript.Lines.Clear; + with memScript.Lines do + begin + {$IFDEF PHP4} + Add('$btnClose = register_delphi_component("btnClose");'); + Add('$frmTest = register_delphi_component("frmTest");'); + Add('$btnClose->Caption = "&Exit";'); + Add('$frmTest->Caption = "PHP4Delphi demo";'); + Add('$btnClose->Top = 150;'); + Add('$btnClose->Font->Size = 10;'); + Add('$btnClose->Cursor = -21;'); + Add('$frmTest->Color = clGreen;'); + Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); + Add('delphi_show_message($st);'); + {$ELSE} + Add('$btnClose = register_delphi_component("btnClose");'); + Add('$frmTest = register_delphi_component("frmTest");'); + Add('$btnClose->Caption = "&Exit";'); + Add('$frmTest->Caption = "PHP4Delphi demo";'); + Add('$btnClose->Top = 150;'); + Add('$btnClose->FontSize = 10;'); + Add('$btnClose->Cursor = -21;'); + Add('$frmTest->Color = clGreen;'); + Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); + Add('delphi_show_message($st);'); + {$ENDIF} + end; + PHPEngine.StartupEngine; +end; + +procedure TfrmTest.FormDestroy(Sender: TObject); +begin + btnClose.Free; + PHPEngine.ShutdownEngine; +end; + +{ TMyButton } + +function TMyButton.GetFontSize: integer; +begin + Result := Font.Size; +end; + +procedure TMyButton.SetFontSize(const Value: integer); +begin + Font.Size := Value; +end; + +end. diff --git a/Demos/psvPHP/Components/WindowsXP.res b/Source/Demos/psvPHP/Components/WindowsXP.res similarity index 100% rename from Demos/psvPHP/Components/WindowsXP.res rename to Source/Demos/psvPHP/Components/WindowsXP.res diff --git a/Demos/psvPHP/Custom Library/DemoMain.dfm b/Source/Demos/psvPHP/Custom Library/DemoMain.dfm similarity index 100% rename from Demos/psvPHP/Custom Library/DemoMain.dfm rename to Source/Demos/psvPHP/Custom Library/DemoMain.dfm diff --git a/Demos/psvPHP/Custom Library/DemoMain.pas b/Source/Demos/psvPHP/Custom Library/DemoMain.pas similarity index 100% rename from Demos/psvPHP/Custom Library/DemoMain.pas rename to Source/Demos/psvPHP/Custom Library/DemoMain.pas diff --git a/Demos/psvPHP/Custom Library/ExtDemo.bdsproj b/Source/Demos/psvPHP/Custom Library/ExtDemo.bdsproj similarity index 100% rename from Demos/psvPHP/Custom Library/ExtDemo.bdsproj rename to Source/Demos/psvPHP/Custom Library/ExtDemo.bdsproj diff --git a/Demos/psvPHP/Custom Library/ExtDemo.dpr b/Source/Demos/psvPHP/Custom Library/ExtDemo.dpr similarity index 100% rename from Demos/psvPHP/Custom Library/ExtDemo.dpr rename to Source/Demos/psvPHP/Custom Library/ExtDemo.dpr diff --git a/Demos/psvPHP/Custom Library/ExtDemo.res b/Source/Demos/psvPHP/Custom Library/ExtDemo.res similarity index 100% rename from Demos/psvPHP/Custom Library/ExtDemo.res rename to Source/Demos/psvPHP/Custom Library/ExtDemo.res diff --git a/Demos/psvPHP/Custom Library/WindowsXP.res b/Source/Demos/psvPHP/Custom Library/WindowsXP.res similarity index 100% rename from Demos/psvPHP/Custom Library/WindowsXP.res rename to Source/Demos/psvPHP/Custom Library/WindowsXP.res diff --git a/Demos/psvPHP/Custom Library/phpShellLibrary.pas b/Source/Demos/psvPHP/Custom Library/phpShellLibrary.pas similarity index 96% rename from Demos/psvPHP/Custom Library/phpShellLibrary.pas rename to Source/Demos/psvPHP/Custom Library/phpShellLibrary.pas index b0a769d..219a349 100644 --- a/Demos/psvPHP/Custom Library/phpShellLibrary.pas +++ b/Source/Demos/psvPHP/Custom Library/phpShellLibrary.pas @@ -1,104 +1,104 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: phpShellLibrary.pas,v 7.0 04/2007 delphi32 Exp $ } - -//This sample shows how to create custom library for psvPHP component -unit phpShellLibrary; - -interface - -uses - Windows, Messages, SysUtils, Classes, Controls, Graphics, Dialogs, - PHPAPI, ZENDAPI, phpCustomLibrary, ShellAPI, phpFunctions, - ZendTypes, phpTypes; - - - -type - TphpShellLibrary = class(TCustomPHPLibrary) - protected - procedure _ShellExecute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar: TZendVariable; TSRMLS_DC: Pointer); - public - procedure Refresh; override; - end; - -procedure Register; - -implementation - - -procedure Register; -begin - RegisterComponents('PHP', [TphpShellLibrary]); -end; - - -{ TphpShellLibrary } - -procedure TphpShellLibrary._ShellExecute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - hWnd : THandle; - Operation, FileName, AParameters, - Directory: string; ShowCmd: Integer; - -begin - hWnd := Parameters[0].Value; - Operation := Parameters[1].Value; - FileName := Parameters[2].Value; - AParameters := Parameters[3].Value; - Directory := Parameters[4].Value; - ShowCmd := Parameters[5].Value; - ShellExecute(hWnd, PChar(Operation), PChar(FileName), PChar(AParameters), PChar(Directory), ShowCmd); -end; - -procedure TphpShellLibrary.Refresh; -var - Func : TphpFunction; - Parm : TFunctionParam; -begin - Functions.Clear; - - Func := TphpFunction(Functions.Add); - Func.FunctionName := 'shellexecute'; - - Parm := TFunctionParam(Func.Parameters.Add); - Parm.Name := 'hwnd'; - Parm.ParamType := tpInteger; - - Parm := TFunctionParam(Func.Parameters.Add); - Parm.Name := 'operation'; - Parm.ParamType := tpString; - - Parm := TFunctionParam(Func.Parameters.Add); - Parm.Name := 'filename'; - Parm.ParamType := tpString; - - Parm := TFunctionParam(Func.Parameters.Add); - Parm.Name := 'parameters'; - Parm.ParamType := tpString; - - Parm := TFunctionParam(Func.Parameters.Add); - Parm.Name := 'directory'; - Parm.ParamType := tpString; - - Parm := TFunctionParam(Func.Parameters.Add); - Parm.Name := 'showcmd'; - Parm.ParamType := tpInteger; - - Func.OnExecute := _ShellExecute; - - - inherited; -end; - +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: phpShellLibrary.pas,v 7.0 04/2007 delphi32 Exp $ } + +//This sample shows how to create custom library for psvPHP component +unit phpShellLibrary; + +interface + +uses + Windows, Messages, SysUtils, Classes, Controls, Graphics, Dialogs, + PHPAPI, ZENDAPI, phpCustomLibrary, ShellAPI, phpFunctions, + ZendTypes, phpTypes; + + + +type + TphpShellLibrary = class(TCustomPHPLibrary) + protected + procedure _ShellExecute(Sender: TObject; Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); + public + procedure Refresh; override; + end; + +procedure Register; + +implementation + + +procedure Register; +begin + RegisterComponents('PHP', [TphpShellLibrary]); +end; + + +{ TphpShellLibrary } + +procedure TphpShellLibrary._ShellExecute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + hWnd : THandle; + Operation, FileName, AParameters, + Directory: string; ShowCmd: Integer; + +begin + hWnd := Parameters[0].Value; + Operation := Parameters[1].Value; + FileName := Parameters[2].Value; + AParameters := Parameters[3].Value; + Directory := Parameters[4].Value; + ShowCmd := Parameters[5].Value; + ShellExecute(hWnd, PChar(Operation), PChar(FileName), PChar(AParameters), PChar(Directory), ShowCmd); +end; + +procedure TphpShellLibrary.Refresh; +var + Func : TphpFunction; + Parm : TFunctionParam; +begin + Functions.Clear; + + Func := TphpFunction(Functions.Add); + Func.FunctionName := 'shellexecute'; + + Parm := TFunctionParam(Func.Parameters.Add); + Parm.Name := 'hwnd'; + Parm.ParamType := tpInteger; + + Parm := TFunctionParam(Func.Parameters.Add); + Parm.Name := 'operation'; + Parm.ParamType := tpString; + + Parm := TFunctionParam(Func.Parameters.Add); + Parm.Name := 'filename'; + Parm.ParamType := tpString; + + Parm := TFunctionParam(Func.Parameters.Add); + Parm.Name := 'parameters'; + Parm.ParamType := tpString; + + Parm := TFunctionParam(Func.Parameters.Add); + Parm.Name := 'directory'; + Parm.ParamType := tpString; + + Parm := TFunctionParam(Func.Parameters.Add); + Parm.Name := 'showcmd'; + Parm.ParamType := tpInteger; + + Func.OnExecute := _ShellExecute; + + + inherited; +end; + end. \ No newline at end of file diff --git a/Demos/psvPHP/Dynamic Array/dynamic_array.dpr b/Source/Demos/psvPHP/Dynamic Array/dynamic_array.dpr similarity index 95% rename from Demos/psvPHP/Dynamic Array/dynamic_array.dpr rename to Source/Demos/psvPHP/Dynamic Array/dynamic_array.dpr index 17498d2..281c69a 100644 --- a/Demos/psvPHP/Dynamic Array/dynamic_array.dpr +++ b/Source/Demos/psvPHP/Dynamic Array/dynamic_array.dpr @@ -1,25 +1,25 @@ -{$APPTYPE CONSOLE} -program dynamic_array; - -uses - Windows, SysUtils, Classes, ZENDAPI, zend_dynamic_array; - -var - ar : TDynamicArray; - P : pointer; - El : PChar; -begin - zend_dynamic_array_init(@ar,sizeof(PChar), 3); - El := 'Test1'; - P := zend_dynamic_array_push(@ar); - Move(El, P^, sizeof(PChar)); - El := 'Test2'; - P := zend_dynamic_array_push(@ar); - Move(El, P^, sizeof(PChar)); - El := 'Test3'; - P := zend_dynamic_array_push(@ar); - Move(El, P^, sizeof(PChar)); - P := zend_dynamic_array_get_element(@ar, 1); - El := PChar(P^); - writeln(el); +{$APPTYPE CONSOLE} +program dynamic_array; + +uses + Windows, SysUtils, Classes, ZENDAPI, zend_dynamic_array; + +var + ar : TDynamicArray; + P : pointer; + El : PChar; +begin + zend_dynamic_array_init(@ar,sizeof(PChar), 3); + El := 'Test1'; + P := zend_dynamic_array_push(@ar); + Move(El, P^, sizeof(PChar)); + El := 'Test2'; + P := zend_dynamic_array_push(@ar); + Move(El, P^, sizeof(PChar)); + El := 'Test3'; + P := zend_dynamic_array_push(@ar); + Move(El, P^, sizeof(PChar)); + P := zend_dynamic_array_get_element(@ar, 1); + El := PChar(P^); + writeln(el); end. \ No newline at end of file diff --git a/Demos/psvPHP/Encryption/EncDemo.dpr b/Source/Demos/psvPHP/Encryption/EncDemo.dpr similarity index 94% rename from Demos/psvPHP/Encryption/EncDemo.dpr rename to Source/Demos/psvPHP/Encryption/EncDemo.dpr index 6c5452d..200b019 100644 --- a/Demos/psvPHP/Encryption/EncDemo.dpr +++ b/Source/Demos/psvPHP/Encryption/EncDemo.dpr @@ -1,14 +1,14 @@ -program EncDemo; - -uses - Forms, - uMain in 'uMain.pas' {frmMain}; - -{$R *.res} - -begin - Application.Initialize; - Application.Title := 'Encryption Demo'; - Application.CreateForm(TfrmMain, frmMain); - Application.Run; -end. +program EncDemo; + +uses + Forms, + uMain in 'uMain.pas' {frmMain}; + +{$R *.res} + +begin + Application.Initialize; + Application.Title := 'Encryption Demo'; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/Demos/psvPHP/Encryption/EncDemo.res b/Source/Demos/psvPHP/Encryption/EncDemo.res similarity index 100% rename from Demos/psvPHP/Encryption/EncDemo.res rename to Source/Demos/psvPHP/Encryption/EncDemo.res diff --git a/Demos/psvPHP/Encryption/WindowsXP.res b/Source/Demos/psvPHP/Encryption/WindowsXP.res similarity index 100% rename from Demos/psvPHP/Encryption/WindowsXP.res rename to Source/Demos/psvPHP/Encryption/WindowsXP.res diff --git a/Demos/psvPHP/Encryption/std.encryption.class.inc b/Source/Demos/psvPHP/Encryption/std.encryption.class.inc similarity index 97% rename from Demos/psvPHP/Encryption/std.encryption.class.inc rename to Source/Demos/psvPHP/Encryption/std.encryption.class.inc index 7ee1296..be24147 100644 --- a/Demos/psvPHP/Encryption/std.encryption.class.inc +++ b/Source/Demos/psvPHP/Encryption/std.encryption.class.inc @@ -1,253 +1,253 @@ - -// Distributed under the GNU General Public Licence -// ***************************************************************************** - -class Encryption { - - var $scramble1; // 1st string of ASCII characters - var $scramble2; // 2nd string of ASCII characters - var $errors; // array of error messages - var $adj; // 1st adjustment value (optional) - var $mod; // 2nd adjustment value (optional) - - // **************************************************************************** - // class constructor - // **************************************************************************** - function encryption () - { - //DebugBreak(); - $this->errors = array(); - - // Each of these two strings must contain the same characters, but in a different order. - // Use only printable characters from the ASCII table. - // Each character can only appear once in each string EXCEPT for the first character - // which must be duplicated at the end (this gets round a bijou problemette when the - // first character of the password is also the first character in $scramble1) - $this->scramble1 = '! "#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!'; - $this->scramble2 = 'f^jAE]okI\OzU[2&q1{3`h5w_794p@6s8?BgP>dFV=m Dscramble1) <> strlen($this->scramble2)) { - $this->errors[] = '** SCRAMBLE1 is not same length as SCRAMBLE2 **'; - } // if - - $this->adj = 1.75; // this value is added to the rolling fudgefactors - $this->mod = 3; // if divisible by this the adjustment is made negative - - } // constructor - - // **************************************************************************** - function decrypt ($key, $source) - // decrypt string into its original form - { - //DebugBreak(); - // convert $key into a sequence of numbers - $fudgefactor = $this->_convertKey($key); - if ($this->errors) return; - - if (empty($source)) { - $this->errors[] = 'No value has been supplied for decryption'; - return; - } // if - - $target = null; - $factor2 = 0; - - for ($i = 0; $i < strlen($source); $i++) { - // extract a character from $source - $char2 = substr($source, $i, 1); - - // identify its position in $scramble2 - $num2 = strpos($this->scramble2, $char2); - if ($num2 === false) { - $this->errors[] = "Source string contains an invalid character ($char)"; - return; - } // if - - // get an adjustment value using $fudgefactor - $adj = $this->_applyFudgeFactor($fudgefactor); - $factor1 = $factor2 + $adj; // accumulate in $factor1 - $num1 = round($factor1 * -1) + ($num2); // generate offset for $scramble1 - $num1 = $this->_checkRange($num1); // check range - $factor2 = $factor1 + $num2; // accumulate in $factor2 - - // extract character from $scramble1 - $char1 = substr($this->scramble1, $num1, 1); - - // append to $target string - $target .= $char1; - - //echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2
\n"; - - } // for - - return rtrim($target); - - } // decrypt - - // **************************************************************************** - function encrypt ($key, $source, $sourcelen = 0) - // encrypt string into a garbled form - { - //DebugBreak(); - // convert $key into a sequence of numbers - $fudgefactor = $this->_convertKey($key); - if ($this->errors) return; - - if (empty($source)) { - $this->errors[] = 'No value has been supplied for encryption'; - return; - } // if - - // pad $source with spaces up to $sourcelen - while (strlen($source) < $sourcelen) { - $source .= ' '; - } // while - - $target = null; - $factor2 = 0; - - for ($i = 0; $i < strlen($source); $i++) { - // extract a character from $source - $char1 = substr($source, $i, 1); - - // identify its position in $scramble1 - $num1 = strpos($this->scramble1, $char1); - if ($num1 === false) { - $this->errors[] = "Source string contains an invalid character ($char)"; - return; - } // if - - // get an adjustment value using $fudgefactor - $adj = $this->_applyFudgeFactor($fudgefactor); - $factor1 = $factor2 + $adj; // accumulate in $factor1 - $num2 = round($factor1) + ($num1); // generate offset for $scramble2 - $num2 = $this->_checkRange($num2); // check range - $factor2 = $factor1 + $num2; // accumulate in $factor2 - - // extract character from $scramble2 - $char2 = substr($this->scramble2, $num2, 1); - - // append to $target string - $target .= $char2; - - //echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2
\n"; - - } // for - - return $target; - - } // encrypt - - // **************************************************************************** - function getAdjustment () - // return the adjustment value - { - return $this->adj; - - } // setAdjustment - - // **************************************************************************** - function getModulus () - // return the modulus value - { - return $this->mod; - - } // setModulus - - // **************************************************************************** - function setAdjustment ($adj) - // set the adjustment value - { - $this->adj = (float)$adj; - - } // setAdjustment - - // **************************************************************************** - function setModulus ($mod) - // set the modulus value - { - $this->mod = (int)abs($mod); // must be a positive whole number - - } // setModulus - - // **************************************************************************** - // private methods - // **************************************************************************** - function _applyFudgeFactor (&$fudgefactor) - // return an adjustment value based on the contents of $fudgefactor - // NOTE: $fudgefactor is passed by reference so that it can be modified - { - $fudge = array_shift($fudgefactor); // extract 1st number from array - $fudge = $fudge + $this->adj; // add in adjustment value - $fudgefactor[] = $fudge; // put it back at end of array - - if (!empty($this->mod)) { // if modifier has been supplied - if ($fudge % $this->mod == 0) { // if it is divisible by modifier - $fudge = $fudge * -1; // make it negative - } // if - } // if - - return $fudge; - - } // _applyFudgeFactor - - // **************************************************************************** - function _checkRange ($num) - // check that $num points to an entry in $this->scramble1 - { - $num = round($num); // round up to nearest whole number - - // indexing starts at 0, not 1, so subtract 1 from string length - $limit = strlen($this->scramble1)-1; - - while ($num > $limit) { - $num = $num - $limit; // value too high, so reduce it - } // while - while ($num < 0) { - $num = $num + $limit; // value too low, so increase it - } // while - - return $num; - - } // _checkRange - - // **************************************************************************** - function _convertKey ($key) - // convert $key into an array of numbers - { - if (empty($key)) { - $this->errors[] = 'No value has been supplied for the encryption key'; - return; - } // if - - $array[] = strlen($key); // first entry in array is length of $key - - $tot = 0; - for ($i = 0; $i < strlen($key); $i++) { - // extract a character from $key - $char = substr($key, $i, 1); - - // identify its position in $scramble1 - $num = strpos($this->scramble1, $char); - if ($num === false) { - $this->errors[] = "Key contains an invalid character ($char)"; - return; - } // if - - $array[] = $num; // store in output array - $tot = $tot + $num; // accumulate total for later - } // for - - $array[] = $tot; // insert total as last entry in array - - return $array; - - } // _convertKey - -// **************************************************************************** -} // end Encryption -// **************************************************************************** - + +// Distributed under the GNU General Public Licence +// ***************************************************************************** + +class Encryption { + + var $scramble1; // 1st string of ASCII characters + var $scramble2; // 2nd string of ASCII characters + var $errors; // array of error messages + var $adj; // 1st adjustment value (optional) + var $mod; // 2nd adjustment value (optional) + + // **************************************************************************** + // class constructor + // **************************************************************************** + function encryption () + { + //DebugBreak(); + $this->errors = array(); + + // Each of these two strings must contain the same characters, but in a different order. + // Use only printable characters from the ASCII table. + // Each character can only appear once in each string EXCEPT for the first character + // which must be duplicated at the end (this gets round a bijou problemette when the + // first character of the password is also the first character in $scramble1) + $this->scramble1 = '! "#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!'; + $this->scramble2 = 'f^jAE]okI\OzU[2&q1{3`h5w_794p@6s8?BgP>dFV=m Dscramble1) <> strlen($this->scramble2)) { + $this->errors[] = '** SCRAMBLE1 is not same length as SCRAMBLE2 **'; + } // if + + $this->adj = 1.75; // this value is added to the rolling fudgefactors + $this->mod = 3; // if divisible by this the adjustment is made negative + + } // constructor + + // **************************************************************************** + function decrypt ($key, $source) + // decrypt string into its original form + { + //DebugBreak(); + // convert $key into a sequence of numbers + $fudgefactor = $this->_convertKey($key); + if ($this->errors) return; + + if (empty($source)) { + $this->errors[] = 'No value has been supplied for decryption'; + return; + } // if + + $target = null; + $factor2 = 0; + + for ($i = 0; $i < strlen($source); $i++) { + // extract a character from $source + $char2 = substr($source, $i, 1); + + // identify its position in $scramble2 + $num2 = strpos($this->scramble2, $char2); + if ($num2 === false) { + $this->errors[] = "Source string contains an invalid character ($char)"; + return; + } // if + + // get an adjustment value using $fudgefactor + $adj = $this->_applyFudgeFactor($fudgefactor); + $factor1 = $factor2 + $adj; // accumulate in $factor1 + $num1 = round($factor1 * -1) + ($num2); // generate offset for $scramble1 + $num1 = $this->_checkRange($num1); // check range + $factor2 = $factor1 + $num2; // accumulate in $factor2 + + // extract character from $scramble1 + $char1 = substr($this->scramble1, $num1, 1); + + // append to $target string + $target .= $char1; + + //echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2
\n"; + + } // for + + return rtrim($target); + + } // decrypt + + // **************************************************************************** + function encrypt ($key, $source, $sourcelen = 0) + // encrypt string into a garbled form + { + //DebugBreak(); + // convert $key into a sequence of numbers + $fudgefactor = $this->_convertKey($key); + if ($this->errors) return; + + if (empty($source)) { + $this->errors[] = 'No value has been supplied for encryption'; + return; + } // if + + // pad $source with spaces up to $sourcelen + while (strlen($source) < $sourcelen) { + $source .= ' '; + } // while + + $target = null; + $factor2 = 0; + + for ($i = 0; $i < strlen($source); $i++) { + // extract a character from $source + $char1 = substr($source, $i, 1); + + // identify its position in $scramble1 + $num1 = strpos($this->scramble1, $char1); + if ($num1 === false) { + $this->errors[] = "Source string contains an invalid character ($char)"; + return; + } // if + + // get an adjustment value using $fudgefactor + $adj = $this->_applyFudgeFactor($fudgefactor); + $factor1 = $factor2 + $adj; // accumulate in $factor1 + $num2 = round($factor1) + ($num1); // generate offset for $scramble2 + $num2 = $this->_checkRange($num2); // check range + $factor2 = $factor1 + $num2; // accumulate in $factor2 + + // extract character from $scramble2 + $char2 = substr($this->scramble2, $num2, 1); + + // append to $target string + $target .= $char2; + + //echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2
\n"; + + } // for + + return $target; + + } // encrypt + + // **************************************************************************** + function getAdjustment () + // return the adjustment value + { + return $this->adj; + + } // setAdjustment + + // **************************************************************************** + function getModulus () + // return the modulus value + { + return $this->mod; + + } // setModulus + + // **************************************************************************** + function setAdjustment ($adj) + // set the adjustment value + { + $this->adj = (float)$adj; + + } // setAdjustment + + // **************************************************************************** + function setModulus ($mod) + // set the modulus value + { + $this->mod = (int)abs($mod); // must be a positive whole number + + } // setModulus + + // **************************************************************************** + // private methods + // **************************************************************************** + function _applyFudgeFactor (&$fudgefactor) + // return an adjustment value based on the contents of $fudgefactor + // NOTE: $fudgefactor is passed by reference so that it can be modified + { + $fudge = array_shift($fudgefactor); // extract 1st number from array + $fudge = $fudge + $this->adj; // add in adjustment value + $fudgefactor[] = $fudge; // put it back at end of array + + if (!empty($this->mod)) { // if modifier has been supplied + if ($fudge % $this->mod == 0) { // if it is divisible by modifier + $fudge = $fudge * -1; // make it negative + } // if + } // if + + return $fudge; + + } // _applyFudgeFactor + + // **************************************************************************** + function _checkRange ($num) + // check that $num points to an entry in $this->scramble1 + { + $num = round($num); // round up to nearest whole number + + // indexing starts at 0, not 1, so subtract 1 from string length + $limit = strlen($this->scramble1)-1; + + while ($num > $limit) { + $num = $num - $limit; // value too high, so reduce it + } // while + while ($num < 0) { + $num = $num + $limit; // value too low, so increase it + } // while + + return $num; + + } // _checkRange + + // **************************************************************************** + function _convertKey ($key) + // convert $key into an array of numbers + { + if (empty($key)) { + $this->errors[] = 'No value has been supplied for the encryption key'; + return; + } // if + + $array[] = strlen($key); // first entry in array is length of $key + + $tot = 0; + for ($i = 0; $i < strlen($key); $i++) { + // extract a character from $key + $char = substr($key, $i, 1); + + // identify its position in $scramble1 + $num = strpos($this->scramble1, $char); + if ($num === false) { + $this->errors[] = "Key contains an invalid character ($char)"; + return; + } // if + + $array[] = $num; // store in output array + $tot = $tot + $num; // accumulate total for later + } // for + + $array[] = $tot; // insert total as last entry in array + + return $array; + + } // _convertKey + +// **************************************************************************** +} // end Encryption +// **************************************************************************** + ?> \ No newline at end of file diff --git a/Demos/psvPHP/Encryption/uMain.ddp b/Source/Demos/psvPHP/Encryption/uMain.ddp similarity index 100% rename from Demos/psvPHP/Encryption/uMain.ddp rename to Source/Demos/psvPHP/Encryption/uMain.ddp diff --git a/Demos/psvPHP/Encryption/uMain.dfm b/Source/Demos/psvPHP/Encryption/uMain.dfm similarity index 94% rename from Demos/psvPHP/Encryption/uMain.dfm rename to Source/Demos/psvPHP/Encryption/uMain.dfm index bdf8ec2..9389e02 100644 --- a/Demos/psvPHP/Encryption/uMain.dfm +++ b/Source/Demos/psvPHP/Encryption/uMain.dfm @@ -1,235 +1,235 @@ -object frmMain: TfrmMain - Left = 331 - Top = 235 - BorderStyle = bsDialog - Caption = 'Encryption/Decryption' - ClientHeight = 345 - ClientWidth = 555 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - OnCreate = FormCreate - OnDestroy = FormDestroy - PixelsPerInch = 96 - TextHeight = 13 - object lblCaption: TLabel - Left = 0 - Top = 0 - Width = 555 - Height = 29 - Align = alTop - Alignment = taCenter - Caption = 'Test Encryption/Decryption routines' - Font.Charset = RUSSIAN_CHARSET - Font.Color = clWindowText - Font.Height = -24 - Font.Name = 'Arial' - Font.Style = [fsBold] - ParentFont = False - Layout = tlCenter - end - object Label2: TLabel - Left = 16 - Top = 52 - Width = 46 - Height = 13 - Caption = 'Enter Key' - end - object Label3: TLabel - Left = 16 - Top = 77 - Width = 74 - Height = 13 - Caption = 'Enter Password' - end - object Label4: TLabel - Left = 16 - Top = 102 - Width = 110 - Height = 13 - Caption = 'Enter Password Length' - end - object Label5: TLabel - Left = 16 - Top = 128 - Width = 80 - Height = 13 - Caption = 'Enter Adjustment' - end - object Label6: TLabel - Left = 16 - Top = 153 - Width = 68 - Height = 13 - Caption = 'Enter Modulus' - end - object lblEncrypt: TLabel - Left = 152 - Top = 180 - Width = 3 - Height = 13 - end - object lblDecrypt: TLabel - Left = 152 - Top = 200 - Width = 3 - Height = 13 - end - object Label9: TLabel - Left = 236 - Top = 104 - Width = 83 - Height = 13 - Caption = '( positive integer )' - end - object Label10: TLabel - Left = 236 - Top = 128 - Width = 49 - Height = 13 - Caption = '( numeric )' - end - object Label11: TLabel - Left = 236 - Top = 152 - Width = 83 - Height = 13 - Caption = '( positive integer )' - end - object Label1: TLabel - Left = 148 - Top = 232 - Width = 27 - Height = 13 - Caption = 'Errors' - end - object btnEncrypt: TButton - Left = 16 - Top = 178 - Width = 75 - Height = 25 - Caption = 'Encrypt' - TabOrder = 0 - OnClick = btnEncryptClick - end - object btnDecrypt: TButton - Left = 16 - Top = 208 - Width = 75 - Height = 25 - Caption = 'Decrypt' - TabOrder = 1 - OnClick = btnDecryptClick - end - object edtKey: TEdit - Left = 152 - Top = 48 - Width = 245 - Height = 21 - TabOrder = 2 - Text = 'Fred' - end - object edtPassword: TEdit - Left = 152 - Top = 73 - Width = 249 - Height = 21 - TabOrder = 3 - Text = 'passWORD' - end - object edtPassLen: TEdit - Left = 152 - Top = 98 - Width = 70 - Height = 21 - TabOrder = 4 - Text = '16' - end - object edtAjustment: TEdit - Left = 152 - Top = 124 - Width = 70 - Height = 21 - TabOrder = 5 - Text = '1.75' - end - object edtModulus: TEdit - Left = 152 - Top = 149 - Width = 70 - Height = 21 - TabOrder = 6 - Text = '3' - end - object btnClose: TButton - Left = 476 - Top = 312 - Width = 75 - Height = 25 - Caption = 'Close' - TabOrder = 7 - OnClick = btnCloseClick - end - object Errors: TMemo - Left = 148 - Top = 248 - Width = 305 - Height = 89 - Lines.Strings = ( - '') - TabOrder = 8 - end - object psvPHP: TpsvPHP - Variables = < - item - Name = 'key' - end - item - Name = 'password' - end - item - Name = 'pswdlen' - end - item - Name = 'adj' - end - item - Name = 'mod' - end - item - Name = 'encrypt_result' - end - item - Name = 'decrypt_result' - end> - Left = 356 - Top = 116 - end - object PHPLibrary1: TPHPLibrary - LibraryName = 'ErrorsLib' - Functions = < - item - FunctionName = 'printerror' - Tag = 0 - Parameters = < - item - Name = 'line' - ParamType = tpString - end> - OnExecute = PHPLibrary1Functions0Execute - end> - Left = 360 - Top = 168 - end - object PHPEngine: TPHPEngine - Constants = <> - ReportDLLError = False - Left = 424 - Top = 124 - end -end +object frmMain: TfrmMain + Left = 331 + Top = 235 + BorderStyle = bsDialog + Caption = 'Encryption/Decryption' + ClientHeight = 345 + ClientWidth = 555 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object lblCaption: TLabel + Left = 0 + Top = 0 + Width = 555 + Height = 29 + Align = alTop + Alignment = taCenter + Caption = 'Test Encryption/Decryption routines' + Font.Charset = RUSSIAN_CHARSET + Font.Color = clWindowText + Font.Height = -24 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + Layout = tlCenter + end + object Label2: TLabel + Left = 16 + Top = 52 + Width = 46 + Height = 13 + Caption = 'Enter Key' + end + object Label3: TLabel + Left = 16 + Top = 77 + Width = 74 + Height = 13 + Caption = 'Enter Password' + end + object Label4: TLabel + Left = 16 + Top = 102 + Width = 110 + Height = 13 + Caption = 'Enter Password Length' + end + object Label5: TLabel + Left = 16 + Top = 128 + Width = 80 + Height = 13 + Caption = 'Enter Adjustment' + end + object Label6: TLabel + Left = 16 + Top = 153 + Width = 68 + Height = 13 + Caption = 'Enter Modulus' + end + object lblEncrypt: TLabel + Left = 152 + Top = 180 + Width = 3 + Height = 13 + end + object lblDecrypt: TLabel + Left = 152 + Top = 200 + Width = 3 + Height = 13 + end + object Label9: TLabel + Left = 236 + Top = 104 + Width = 83 + Height = 13 + Caption = '( positive integer )' + end + object Label10: TLabel + Left = 236 + Top = 128 + Width = 49 + Height = 13 + Caption = '( numeric )' + end + object Label11: TLabel + Left = 236 + Top = 152 + Width = 83 + Height = 13 + Caption = '( positive integer )' + end + object Label1: TLabel + Left = 148 + Top = 232 + Width = 27 + Height = 13 + Caption = 'Errors' + end + object btnEncrypt: TButton + Left = 16 + Top = 178 + Width = 75 + Height = 25 + Caption = 'Encrypt' + TabOrder = 0 + OnClick = btnEncryptClick + end + object btnDecrypt: TButton + Left = 16 + Top = 208 + Width = 75 + Height = 25 + Caption = 'Decrypt' + TabOrder = 1 + OnClick = btnDecryptClick + end + object edtKey: TEdit + Left = 152 + Top = 48 + Width = 245 + Height = 21 + TabOrder = 2 + Text = 'Fred' + end + object edtPassword: TEdit + Left = 152 + Top = 73 + Width = 249 + Height = 21 + TabOrder = 3 + Text = 'passWORD' + end + object edtPassLen: TEdit + Left = 152 + Top = 98 + Width = 70 + Height = 21 + TabOrder = 4 + Text = '16' + end + object edtAjustment: TEdit + Left = 152 + Top = 124 + Width = 70 + Height = 21 + TabOrder = 5 + Text = '1.75' + end + object edtModulus: TEdit + Left = 152 + Top = 149 + Width = 70 + Height = 21 + TabOrder = 6 + Text = '3' + end + object btnClose: TButton + Left = 476 + Top = 312 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 7 + OnClick = btnCloseClick + end + object Errors: TMemo + Left = 148 + Top = 248 + Width = 305 + Height = 89 + Lines.Strings = ( + '') + TabOrder = 8 + end + object psvPHP: TpsvPHP + Variables = < + item + Name = 'key' + end + item + Name = 'password' + end + item + Name = 'pswdlen' + end + item + Name = 'adj' + end + item + Name = 'mod' + end + item + Name = 'encrypt_result' + end + item + Name = 'decrypt_result' + end> + Left = 356 + Top = 116 + end + object PHPLibrary1: TPHPLibrary + LibraryName = 'ErrorsLib' + Functions = < + item + FunctionName = 'printerror' + Tag = 0 + Parameters = < + item + Name = 'line' + ParamType = tpString + end> + OnExecute = PHPLibrary1Functions0Execute + end> + Left = 360 + Top = 168 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 424 + Top = 124 + end +end diff --git a/Demos/psvPHP/Encryption/uMain.pas b/Source/Demos/psvPHP/Encryption/uMain.pas similarity index 96% rename from Demos/psvPHP/Encryption/uMain.pas rename to Source/Demos/psvPHP/Encryption/uMain.pas index a5a8c9f..0c97302 100644 --- a/Demos/psvPHP/Encryption/uMain.pas +++ b/Source/Demos/psvPHP/Encryption/uMain.pas @@ -1,143 +1,143 @@ -{$I PHP.INC} - -unit uMain; - -interface - -uses - Windows, Messages, SysUtils, - {$IFDEF VERSION6}Variants, {$ENDIF} - Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls, php4delphi, PHPCustomLibrary, phpLibrary, phpFunctions, - ZendTypes, PHPCommon; - -type - TfrmMain = class(TForm) - lblCaption: TLabel; - Label2: TLabel; - Label3: TLabel; - Label4: TLabel; - Label5: TLabel; - Label6: TLabel; - btnEncrypt: TButton; - btnDecrypt: TButton; - edtKey: TEdit; - edtPassword: TEdit; - edtPassLen: TEdit; - edtAjustment: TEdit; - edtModulus: TEdit; - btnClose: TButton; - lblEncrypt: TLabel; - lblDecrypt: TLabel; - Label9: TLabel; - Label10: TLabel; - Label11: TLabel; - psvPHP: TpsvPHP; - Errors: TMemo; - Label1: TLabel; - PHPLibrary1: TPHPLibrary; - PHPEngine: TPHPEngine; - procedure btnEncryptClick(Sender: TObject); - procedure btnDecryptClick(Sender: TObject); - procedure btnCloseClick(Sender: TObject); - procedure PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure FormCreate(Sender: TObject); - procedure FormDestroy(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - procedure Execute(Encrypt : boolean); - end; - -var - frmMain: TfrmMain; - -implementation - -{$R *.dfm} -{$R WindowsXP.res} - -{ TfrmMain } - -procedure TfrmMain.Execute(Encrypt: boolean); -var - Script : TStringList; -begin - psvPHP.VariableByName('key').Value := edtKey.Text; - psvPHP.VariableByName('password').Value := edtPassword.Text; - psvPHP.VariableByName('pswdlen').Value := edtPassLen.Text; - psvPHP.VariableByName('adj').Value := edtAjustment.Text; - psvPHP.VariableByName('mod').Value := edtModulus.Text; - psvPHP.Variables[5].Value := lblEncrypt.Caption; - psvPHP.Variables[6].Value := lblDecrypt.Caption; - - Script := TStringList.Create; - With Script do - begin - Add('require ''std.encryption.class.inc'';'); - Add('$crypt = new Encryption;'); - Add('ini_set(''session.bug_compat_warn'', 0);'); - Add('$crypt->setAdjustment($adj);'); - Add('$crypt->setModulus($mod);'); - Add('$adj = $crypt->getAdjustment();'); - Add('$mod = $crypt->getModulus();'); - Add('$errors = array();'); - - if Encrypt then - begin - Add('$encrypt_result = $crypt->encrypt($key, $password, $pswdlen);'); - Add('$errors = $crypt->errors;'); - end - else - begin - Add('$decrypt_result = $crypt->decrypt($key, $encrypt_result);'); - Add('$errors = $crypt->errors;'); - end; - Add('foreach ($errors as $error) {'); - Add('printerror($error);'); - Add('echo $error;'); - Add('} // foreach'); - - end; - psvPHP.RunCode(Script.Text); - lblEncrypt.Caption := psvPHP.Variables[5].Value; - lblDecrypt.Caption := psvPHP.Variables[6].Value; - Script.Free; -end; - -procedure TfrmMain.btnEncryptClick(Sender: TObject); -begin - Execute(true); -end; - -procedure TfrmMain.btnDecryptClick(Sender: TObject); -begin - Execute(false); -end; - -procedure TfrmMain.btnCloseClick(Sender: TObject); -begin - Close; -end; - -procedure TfrmMain.PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - Errors.Lines.Add(Parameters[0].Value); -end; - -procedure TfrmMain.FormCreate(Sender: TObject); -begin - PHPEngine.StartupEngine; -end; - -procedure TfrmMain.FormDestroy(Sender: TObject); -begin - PHPEngine.ShutdownEngine; -end; - -end. +{$I PHP.INC} + +unit uMain; + +interface + +uses + Windows, Messages, SysUtils, + {$IFDEF VERSION6}Variants, {$ENDIF} + Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, php4delphi, PHPCustomLibrary, phpLibrary, phpFunctions, + ZendTypes, PHPCommon; + +type + TfrmMain = class(TForm) + lblCaption: TLabel; + Label2: TLabel; + Label3: TLabel; + Label4: TLabel; + Label5: TLabel; + Label6: TLabel; + btnEncrypt: TButton; + btnDecrypt: TButton; + edtKey: TEdit; + edtPassword: TEdit; + edtPassLen: TEdit; + edtAjustment: TEdit; + edtModulus: TEdit; + btnClose: TButton; + lblEncrypt: TLabel; + lblDecrypt: TLabel; + Label9: TLabel; + Label10: TLabel; + Label11: TLabel; + psvPHP: TpsvPHP; + Errors: TMemo; + Label1: TLabel; + PHPLibrary1: TPHPLibrary; + PHPEngine: TPHPEngine; + procedure btnEncryptClick(Sender: TObject); + procedure btnDecryptClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure Execute(Encrypt : boolean); + end; + +var + frmMain: TfrmMain; + +implementation + +{$R *.dfm} +{$R WindowsXP.res} + +{ TfrmMain } + +procedure TfrmMain.Execute(Encrypt: boolean); +var + Script : TStringList; +begin + psvPHP.VariableByName('key').Value := edtKey.Text; + psvPHP.VariableByName('password').Value := edtPassword.Text; + psvPHP.VariableByName('pswdlen').Value := edtPassLen.Text; + psvPHP.VariableByName('adj').Value := edtAjustment.Text; + psvPHP.VariableByName('mod').Value := edtModulus.Text; + psvPHP.Variables[5].Value := lblEncrypt.Caption; + psvPHP.Variables[6].Value := lblDecrypt.Caption; + + Script := TStringList.Create; + With Script do + begin + Add('require ''std.encryption.class.inc'';'); + Add('$crypt = new Encryption;'); + Add('ini_set(''session.bug_compat_warn'', 0);'); + Add('$crypt->setAdjustment($adj);'); + Add('$crypt->setModulus($mod);'); + Add('$adj = $crypt->getAdjustment();'); + Add('$mod = $crypt->getModulus();'); + Add('$errors = array();'); + + if Encrypt then + begin + Add('$encrypt_result = $crypt->encrypt($key, $password, $pswdlen);'); + Add('$errors = $crypt->errors;'); + end + else + begin + Add('$decrypt_result = $crypt->decrypt($key, $encrypt_result);'); + Add('$errors = $crypt->errors;'); + end; + Add('foreach ($errors as $error) {'); + Add('printerror($error);'); + Add('echo $error;'); + Add('} // foreach'); + + end; + psvPHP.RunCode(Script.Text); + lblEncrypt.Caption := psvPHP.Variables[5].Value; + lblDecrypt.Caption := psvPHP.Variables[6].Value; + Script.Free; +end; + +procedure TfrmMain.btnEncryptClick(Sender: TObject); +begin + Execute(true); +end; + +procedure TfrmMain.btnDecryptClick(Sender: TObject); +begin + Execute(false); +end; + +procedure TfrmMain.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + Errors.Lines.Add(Parameters[0].Value); +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownEngine; +end; + +end. diff --git a/Demos/psvPHP/Graph/Project1.dpr b/Source/Demos/psvPHP/Graph/Project1.dpr similarity index 93% rename from Demos/psvPHP/Graph/Project1.dpr rename to Source/Demos/psvPHP/Graph/Project1.dpr index 79c301d..dfa3f13 100644 --- a/Demos/psvPHP/Graph/Project1.dpr +++ b/Source/Demos/psvPHP/Graph/Project1.dpr @@ -1,13 +1,13 @@ -program Project1; - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/Graph/Project1.res b/Source/Demos/psvPHP/Graph/Project1.res similarity index 100% rename from Demos/psvPHP/Graph/Project1.res rename to Source/Demos/psvPHP/Graph/Project1.res diff --git a/Demos/psvPHP/Graph/Unit1.ddp b/Source/Demos/psvPHP/Graph/Unit1.ddp similarity index 100% rename from Demos/psvPHP/Graph/Unit1.ddp rename to Source/Demos/psvPHP/Graph/Unit1.ddp diff --git a/Demos/psvPHP/Graph/Unit1.dfm b/Source/Demos/psvPHP/Graph/Unit1.dfm similarity index 95% rename from Demos/psvPHP/Graph/Unit1.dfm rename to Source/Demos/psvPHP/Graph/Unit1.dfm index 63c5246..ba5f4fd 100644 --- a/Demos/psvPHP/Graph/Unit1.dfm +++ b/Source/Demos/psvPHP/Graph/Unit1.dfm @@ -1,120 +1,120 @@ -object Form1: TForm1 - Left = 404 - Top = 217 - BorderStyle = bsDialog - Caption = 'PHP Graph demo' - ClientHeight = 531 - ClientWidth = 630 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - OnCreate = FormCreate - OnDestroy = FormDestroy - PixelsPerInch = 96 - TextHeight = 13 - object PaintBox: TPaintBox - Left = 4 - Top = 9 - Width = 512 - Height = 512 - OnPaint = PaintBoxPaint - end - object btnExecute: TButton - Left = 524 - Top = 4 - Width = 97 - Height = 25 - Caption = '&Execute' - TabOrder = 0 - OnClick = btnExecuteClick - end - object Button1: TButton - Left = 524 - Top = 32 - Width = 97 - Height = 25 - Caption = 'Use Library' - TabOrder = 1 - OnClick = Button1Click - end - object psvPHP: TpsvPHP - Variables = < - item - Name = 'X' - Value = '0' - end - item - Name = 'Y' - Value = '0' - end - item - Name = 'T' - Value = '0' - end> - Left = 236 - Top = 36 - end - object PHPEngine: TPHPEngine - HandleErrors = False - Constants = < - item - Name = 'MinT' - Value = '0' - end - item - Name = 'MaxT' - Value = '82' - end - item - Name = 'Steps' - Value = '2000' - end> - ReportDLLError = False - Left = 172 - Top = 212 - end - object PHPLibrary: TPHPLibrary - Functions = < - item - FunctionName = 'gr_prepare' - Tag = 0 - Parameters = <> - OnExecute = PHPLibrary1Functions0Execute - end - item - FunctionName = 'gr_paint' - Tag = 0 - Parameters = < - item - Name = 'X' - ParamType = tpFloat - end - item - Name = 'Y' - ParamType = tpFloat - end> - OnExecute = PHPLibraryFunctions1Execute - end - item - FunctionName = 'gr_move' - Tag = 0 - Parameters = < - item - Name = 'X' - ParamType = tpFloat - end - item - Name = 'Y' - ParamType = tpFloat - end> - OnExecute = PHPLibraryFunctions2Execute - end> - Left = 288 - Top = 196 - end -end +object Form1: TForm1 + Left = 404 + Top = 217 + BorderStyle = bsDialog + Caption = 'PHP Graph demo' + ClientHeight = 531 + ClientWidth = 630 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object PaintBox: TPaintBox + Left = 4 + Top = 9 + Width = 512 + Height = 512 + OnPaint = PaintBoxPaint + end + object btnExecute: TButton + Left = 524 + Top = 4 + Width = 97 + Height = 25 + Caption = '&Execute' + TabOrder = 0 + OnClick = btnExecuteClick + end + object Button1: TButton + Left = 524 + Top = 32 + Width = 97 + Height = 25 + Caption = 'Use Library' + TabOrder = 1 + OnClick = Button1Click + end + object psvPHP: TpsvPHP + Variables = < + item + Name = 'X' + Value = '0' + end + item + Name = 'Y' + Value = '0' + end + item + Name = 'T' + Value = '0' + end> + Left = 236 + Top = 36 + end + object PHPEngine: TPHPEngine + HandleErrors = False + Constants = < + item + Name = 'MinT' + Value = '0' + end + item + Name = 'MaxT' + Value = '82' + end + item + Name = 'Steps' + Value = '2000' + end> + ReportDLLError = False + Left = 172 + Top = 212 + end + object PHPLibrary: TPHPLibrary + Functions = < + item + FunctionName = 'gr_prepare' + Tag = 0 + Parameters = <> + OnExecute = PHPLibrary1Functions0Execute + end + item + FunctionName = 'gr_paint' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end + item + Name = 'Y' + ParamType = tpFloat + end> + OnExecute = PHPLibraryFunctions1Execute + end + item + FunctionName = 'gr_move' + Tag = 0 + Parameters = < + item + Name = 'X' + ParamType = tpFloat + end + item + Name = 'Y' + ParamType = tpFloat + end> + OnExecute = PHPLibraryFunctions2Execute + end> + Left = 288 + Top = 196 + end +end diff --git a/Demos/psvPHP/Graph/Unit1.pas b/Source/Demos/psvPHP/Graph/Unit1.pas similarity index 96% rename from Demos/psvPHP/Graph/Unit1.pas rename to Source/Demos/psvPHP/Graph/Unit1.pas index e876537..b088061 100644 --- a/Demos/psvPHP/Graph/Unit1.pas +++ b/Source/Demos/psvPHP/Graph/Unit1.pas @@ -1,209 +1,209 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -{$I PHP.INC} - -unit Unit1; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, php4delphi, StdCtrls, PHPCommon, PHPCustomLibrary, phpLibrary, - PHPFunctions, ZendTypes, PHPTypes, ZendAPI, PHPAPI; - -type - TForm1 = class(TForm) - PaintBox: TPaintBox; - psvPHP: TpsvPHP; - btnExecute: TButton; - PHPEngine: TPHPEngine; - PHPLibrary: TPHPLibrary; - Button1: TButton; - procedure btnExecuteClick(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure FormDestroy(Sender: TObject); - procedure PaintBoxPaint(Sender: TObject); - procedure PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure PHPLibraryFunctions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure Button1Click(Sender: TObject); - procedure PHPLibraryFunctions2Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - Busy : boolean; - procedure PaintBoxImage; - public - { Public declarations } - B : TBitmap; - end; - -var - Form1: TForm1; - -implementation - -{$R *.DFM} -{$R WindowsXP.res} - -procedure TForm1.btnExecuteClick(Sender: TObject); -var - Script : TStringList; - Steps, X, Y: integer; - MinT, MaxT, DeltaT, T: double; -begin - psvPHP.UseDelimiters := true; - B.Canvas.Brush.Color := clWhite; - B.Canvas.FillRect(B.Canvas.ClipRect); - B.Canvas.Pen.Color := clSilver; - B.Canvas.MoveTo(0, 256); - B.Canvas.LineTo(512, 256); - B.Canvas.MoveTo(256, 0); - B.Canvas.LineTo(256, 512); - B.Canvas.Pen.Color := clBlack; - - Script := TStringList.Create; - Script.Add('$R1 = 90.0;'); - Script.Add('$R2 = 26.0;'); - Script.Add('$O = 70.0;'); - Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); - Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); - - MinT := StrToFloat(PHPEngine.Constants.Items[0].Value); - MaxT := StrToFloat(PHPEngine.Constants.Items[1].Value); - Steps := StrToInt(PHPEngine.Constants.Items[2].Value); - DeltaT := (MaxT - MinT) / Steps; - T := MinT; - - psvPHP.VariableByName('T').AsFloat := T; - psvPHP.RunCode(Script); - X := psvPHP.VariableByName('X').AsInteger; - Y := psvPHP.VariableByName('Y').AsInteger; - B.Canvas.MoveTo(X, Y); - - repeat - T := T + DeltaT; - psvPHP.VariableByName('T').AsFloat := T; - psvPHP.RunCode(Script); - X := psvPHP.VariableByName('X').AsInteger; - Y := psvPHP.VariableByName('Y').AsInteger; - B.Canvas.LineTo(X, Y); - PaintBoxImage; - Application.ProcessMessages; - until T >= MaxT; - Script.Free; -end; - -procedure TForm1.FormCreate(Sender: TObject); -begin - PHPEngine.StartupEngine; - B := TBitmap.Create; - B.Width := Paintbox.Width; - B.Height := PaintBox.Height; -end; - -procedure TForm1.FormDestroy(Sender: TObject); -begin - PHPEngine.ShutdownEngine; - B.Free; - B := nil; -end; - -procedure TForm1.PaintBoxImage; -begin - if Busy then - Exit; - Busy := true; - try - bitBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.Width, PaintBox.Height, - B.Canvas.Handle, 0, 0, SRCCOPY); - finally - Busy := false; - end; -end; - -procedure TForm1.PaintBoxPaint(Sender: TObject); -begin - PaintBoxImage; -end; - -procedure TForm1.PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - B.Canvas.Brush.Color := clWhite; - B.Canvas.FillRect(B.Canvas.ClipRect); - B.Canvas.Pen.Color := clSilver; - B.Canvas.MoveTo(0, 256); - B.Canvas.LineTo(512, 256); - B.Canvas.MoveTo(256, 0); - B.Canvas.LineTo(256, 512); - B.Canvas.Pen.Color := clBlack; -end; - -procedure TForm1.PHPLibraryFunctions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - X, Y : integer; -begin - X := Parameters.ParamByName('X').ZendVariable.AsInteger; - Y := Parameters.ParamByName('Y').ZendVariable.AsInteger; - B.Canvas.LineTo(X, Y); - PaintBoxImage; - Application.ProcessMessages; -end; - -procedure TForm1.Button1Click(Sender: TObject); -var - Script : TStringList; -begin - Script := TStringList.Create; - try - Script.Add('gr_prepare();'); - Script.Add('$R1 = 90.0;'); - Script.Add('$R2 = 26.0;'); - Script.Add('$O = 70.0;'); - Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); - Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); - Script.Add('$DeltaT = (MaxT - MinT) / Steps;'); - Script.Add('$T = MinT;'); - Script.Add('gr_move($X, $Y);'); - Script.Add('gr_paint($X, $Y);'); - Script.Add('do {'); - Script.Add('$T = $T + $DeltaT;'); - Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); - Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); - Script.Add('gr_paint($X, $Y);'); - Script.Add('} while ($T <= MaxT);'); - psvPHP.RunCode(Script); - finally - Script.Free; - end; -end; - -procedure TForm1.PHPLibraryFunctions2Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -var - X, Y : integer; -begin - X := Parameters.ParamByName('X').ZendVariable.AsInteger; - Y := Parameters.ParamByName('Y').ZendVariable.AsInteger; - B.Canvas.MoveTo(X, Y); -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +{$I PHP.INC} + +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, php4delphi, StdCtrls, PHPCommon, PHPCustomLibrary, phpLibrary, + PHPFunctions, ZendTypes, PHPTypes, ZendAPI, PHPAPI; + +type + TForm1 = class(TForm) + PaintBox: TPaintBox; + psvPHP: TpsvPHP; + btnExecute: TButton; + PHPEngine: TPHPEngine; + PHPLibrary: TPHPLibrary; + Button1: TButton; + procedure btnExecuteClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure PaintBoxPaint(Sender: TObject); + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPLibraryFunctions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure Button1Click(Sender: TObject); + procedure PHPLibraryFunctions2Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + Busy : boolean; + procedure PaintBoxImage; + public + { Public declarations } + B : TBitmap; + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TForm1.btnExecuteClick(Sender: TObject); +var + Script : TStringList; + Steps, X, Y: integer; + MinT, MaxT, DeltaT, T: double; +begin + psvPHP.UseDelimiters := true; + B.Canvas.Brush.Color := clWhite; + B.Canvas.FillRect(B.Canvas.ClipRect); + B.Canvas.Pen.Color := clSilver; + B.Canvas.MoveTo(0, 256); + B.Canvas.LineTo(512, 256); + B.Canvas.MoveTo(256, 0); + B.Canvas.LineTo(256, 512); + B.Canvas.Pen.Color := clBlack; + + Script := TStringList.Create; + Script.Add('$R1 = 90.0;'); + Script.Add('$R2 = 26.0;'); + Script.Add('$O = 70.0;'); + Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); + + MinT := StrToFloat(PHPEngine.Constants.Items[0].Value); + MaxT := StrToFloat(PHPEngine.Constants.Items[1].Value); + Steps := StrToInt(PHPEngine.Constants.Items[2].Value); + DeltaT := (MaxT - MinT) / Steps; + T := MinT; + + psvPHP.VariableByName('T').AsFloat := T; + psvPHP.RunCode(Script); + X := psvPHP.VariableByName('X').AsInteger; + Y := psvPHP.VariableByName('Y').AsInteger; + B.Canvas.MoveTo(X, Y); + + repeat + T := T + DeltaT; + psvPHP.VariableByName('T').AsFloat := T; + psvPHP.RunCode(Script); + X := psvPHP.VariableByName('X').AsInteger; + Y := psvPHP.VariableByName('Y').AsInteger; + B.Canvas.LineTo(X, Y); + PaintBoxImage; + Application.ProcessMessages; + until T >= MaxT; + Script.Free; +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; + B := TBitmap.Create; + B.Width := Paintbox.Width; + B.Height := PaintBox.Height; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownEngine; + B.Free; + B := nil; +end; + +procedure TForm1.PaintBoxImage; +begin + if Busy then + Exit; + Busy := true; + try + bitBlt(PaintBox.Canvas.Handle, 0, 0, PaintBox.Width, PaintBox.Height, + B.Canvas.Handle, 0, 0, SRCCOPY); + finally + Busy := false; + end; +end; + +procedure TForm1.PaintBoxPaint(Sender: TObject); +begin + PaintBoxImage; +end; + +procedure TForm1.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + B.Canvas.Brush.Color := clWhite; + B.Canvas.FillRect(B.Canvas.ClipRect); + B.Canvas.Pen.Color := clSilver; + B.Canvas.MoveTo(0, 256); + B.Canvas.LineTo(512, 256); + B.Canvas.MoveTo(256, 0); + B.Canvas.LineTo(256, 512); + B.Canvas.Pen.Color := clBlack; +end; + +procedure TForm1.PHPLibraryFunctions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + X, Y : integer; +begin + X := Parameters.ParamByName('X').ZendVariable.AsInteger; + Y := Parameters.ParamByName('Y').ZendVariable.AsInteger; + B.Canvas.LineTo(X, Y); + PaintBoxImage; + Application.ProcessMessages; +end; + +procedure TForm1.Button1Click(Sender: TObject); +var + Script : TStringList; +begin + Script := TStringList.Create; + try + Script.Add('gr_prepare();'); + Script.Add('$R1 = 90.0;'); + Script.Add('$R2 = 26.0;'); + Script.Add('$O = 70.0;'); + Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$DeltaT = (MaxT - MinT) / Steps;'); + Script.Add('$T = MinT;'); + Script.Add('gr_move($X, $Y);'); + Script.Add('gr_paint($X, $Y);'); + Script.Add('do {'); + Script.Add('$T = $T + $DeltaT;'); + Script.Add('$X = ($R1+$R2)*cos($T) - ($R2+$O)*cos((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('$Y = ($R1+$R2)*sin($T) - ($R2+$O)*sin((($R1+$R2)/$R2)*$T) + 256;'); + Script.Add('gr_paint($X, $Y);'); + Script.Add('} while ($T <= MaxT);'); + psvPHP.RunCode(Script); + finally + Script.Free; + end; +end; + +procedure TForm1.PHPLibraryFunctions2Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +var + X, Y : integer; +begin + X := Parameters.ParamByName('X').ZendVariable.AsInteger; + Y := Parameters.ParamByName('Y').ZendVariable.AsInteger; + B.Canvas.MoveTo(X, Y); +end; + +end. diff --git a/Demos/psvPHP/Graph/WindowsXP.res b/Source/Demos/psvPHP/Graph/WindowsXP.res similarity index 100% rename from Demos/psvPHP/Graph/WindowsXP.res rename to Source/Demos/psvPHP/Graph/WindowsXP.res diff --git a/Demos/psvPHP/ISAPI Module/dmEngine.ddp b/Source/Demos/psvPHP/ISAPI Module/dmEngine.ddp similarity index 100% rename from Demos/psvPHP/ISAPI Module/dmEngine.ddp rename to Source/Demos/psvPHP/ISAPI Module/dmEngine.ddp diff --git a/Demos/psvPHP/ISAPI Module/dmEngine.dfm b/Source/Demos/psvPHP/ISAPI Module/dmEngine.dfm similarity index 100% rename from Demos/psvPHP/ISAPI Module/dmEngine.dfm rename to Source/Demos/psvPHP/ISAPI Module/dmEngine.dfm diff --git a/Demos/psvPHP/ISAPI Module/dmEngine.pas b/Source/Demos/psvPHP/ISAPI Module/dmEngine.pas similarity index 100% rename from Demos/psvPHP/ISAPI Module/dmEngine.pas rename to Source/Demos/psvPHP/ISAPI Module/dmEngine.pas diff --git a/Demos/psvPHP/ISAPI Module/dmMain.ddp b/Source/Demos/psvPHP/ISAPI Module/dmMain.ddp similarity index 100% rename from Demos/psvPHP/ISAPI Module/dmMain.ddp rename to Source/Demos/psvPHP/ISAPI Module/dmMain.ddp diff --git a/Demos/psvPHP/ISAPI Module/dmMain.dfm b/Source/Demos/psvPHP/ISAPI Module/dmMain.dfm similarity index 100% rename from Demos/psvPHP/ISAPI Module/dmMain.dfm rename to Source/Demos/psvPHP/ISAPI Module/dmMain.dfm diff --git a/Demos/psvPHP/ISAPI Module/dmMain.pas b/Source/Demos/psvPHP/ISAPI Module/dmMain.pas similarity index 100% rename from Demos/psvPHP/ISAPI Module/dmMain.pas rename to Source/Demos/psvPHP/ISAPI Module/dmMain.pas diff --git a/Demos/psvPHP/ISAPI Module/phpisapitest.bdsproj b/Source/Demos/psvPHP/ISAPI Module/phpisapitest.bdsproj similarity index 100% rename from Demos/psvPHP/ISAPI Module/phpisapitest.bdsproj rename to Source/Demos/psvPHP/ISAPI Module/phpisapitest.bdsproj diff --git a/Demos/psvPHP/ISAPI Module/phpisapitest.dpr b/Source/Demos/psvPHP/ISAPI Module/phpisapitest.dpr similarity index 100% rename from Demos/psvPHP/ISAPI Module/phpisapitest.dpr rename to Source/Demos/psvPHP/ISAPI Module/phpisapitest.dpr diff --git a/Demos/psvPHP/ISAPI Module/phpisapitest.res b/Source/Demos/psvPHP/ISAPI Module/phpisapitest.res similarity index 100% rename from Demos/psvPHP/ISAPI Module/phpisapitest.res rename to Source/Demos/psvPHP/ISAPI Module/phpisapitest.res diff --git a/Demos/psvPHP/Library demo/LibraryDemo.dpr b/Source/Demos/psvPHP/Library demo/LibraryDemo.dpr similarity index 100% rename from Demos/psvPHP/Library demo/LibraryDemo.dpr rename to Source/Demos/psvPHP/Library demo/LibraryDemo.dpr diff --git a/Demos/psvPHP/Library demo/LibraryDemo.res b/Source/Demos/psvPHP/Library demo/LibraryDemo.res similarity index 100% rename from Demos/psvPHP/Library demo/LibraryDemo.res rename to Source/Demos/psvPHP/Library demo/LibraryDemo.res diff --git a/Demos/psvPHP/Library demo/Project1.dpr b/Source/Demos/psvPHP/Library demo/Project1.dpr similarity index 93% rename from Demos/psvPHP/Library demo/Project1.dpr rename to Source/Demos/psvPHP/Library demo/Project1.dpr index 79c301d..dfa3f13 100644 --- a/Demos/psvPHP/Library demo/Project1.dpr +++ b/Source/Demos/psvPHP/Library demo/Project1.dpr @@ -1,13 +1,13 @@ -program Project1; - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/Library demo/Project1.res b/Source/Demos/psvPHP/Library demo/Project1.res similarity index 100% rename from Demos/psvPHP/Library demo/Project1.res rename to Source/Demos/psvPHP/Library demo/Project1.res diff --git a/Demos/psvPHP/Library demo/Unit1.ddp b/Source/Demos/psvPHP/Library demo/Unit1.ddp similarity index 100% rename from Demos/psvPHP/Library demo/Unit1.ddp rename to Source/Demos/psvPHP/Library demo/Unit1.ddp diff --git a/Demos/psvPHP/Library demo/Unit1.dfm b/Source/Demos/psvPHP/Library demo/Unit1.dfm similarity index 95% rename from Demos/psvPHP/Library demo/Unit1.dfm rename to Source/Demos/psvPHP/Library demo/Unit1.dfm index a5584d7..2e6cf63 100644 --- a/Demos/psvPHP/Library demo/Unit1.dfm +++ b/Source/Demos/psvPHP/Library demo/Unit1.dfm @@ -1,80 +1,80 @@ -object frmLibDemo: TfrmLibDemo - Left = 395 - Top = 303 - BorderStyle = bsDialog - Caption = 'PHP Demo' - ClientHeight = 209 - ClientWidth = 377 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - PixelsPerInch = 96 - TextHeight = 13 - object Memo1: TMemo - Left = 8 - Top = 8 - Width = 185 - Height = 189 - Lines.Strings = ( - 'formcaption("Hello from PHP");' - 'buttonclick();' - 'my_createcontrol();') - TabOrder = 0 - end - object Button1: TButton - Left = 292 - Top = 172 - Width = 75 - Height = 25 - Caption = 'Click' - TabOrder = 1 - OnClick = Button1Click - end - object btnExecute: TButton - Left = 292 - Top = 12 - Width = 75 - Height = 25 - Caption = 'Execute' - TabOrder = 2 - OnClick = btnExecuteClick - end - object psvPHP1: TpsvPHP - Variables = <> - Left = 32 - Top = 28 - end - object PHPLibrary1: TPHPLibrary - LibraryName = 'SimpleLib' - Functions = < - item - FunctionName = 'formcaption' - Tag = 0 - Parameters = < - item - Name = 'Param1' - ParamType = tpString - end> - OnExecute = PHPLibrary1Functions0Execute - end - item - FunctionName = 'buttonclick' - Tag = 0 - Parameters = <> - OnExecute = PHPLibrary1Functions1Execute - end> - Left = 88 - Top = 108 - end - object PHPEngine: TPHPEngine - Constants = <> - ReportDLLError = False - Left = 212 - Top = 64 - end -end +object frmLibDemo: TfrmLibDemo + Left = 395 + Top = 303 + BorderStyle = bsDialog + Caption = 'PHP Demo' + ClientHeight = 209 + ClientWidth = 377 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Memo1: TMemo + Left = 8 + Top = 8 + Width = 185 + Height = 189 + Lines.Strings = ( + 'formcaption("Hello from PHP");' + 'buttonclick();' + 'my_createcontrol();') + TabOrder = 0 + end + object Button1: TButton + Left = 292 + Top = 172 + Width = 75 + Height = 25 + Caption = 'Click' + TabOrder = 1 + OnClick = Button1Click + end + object btnExecute: TButton + Left = 292 + Top = 12 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 2 + OnClick = btnExecuteClick + end + object psvPHP1: TpsvPHP + Variables = <> + Left = 32 + Top = 28 + end + object PHPLibrary1: TPHPLibrary + LibraryName = 'SimpleLib' + Functions = < + item + FunctionName = 'formcaption' + Tag = 0 + Parameters = < + item + Name = 'Param1' + ParamType = tpString + end> + OnExecute = PHPLibrary1Functions0Execute + end + item + FunctionName = 'buttonclick' + Tag = 0 + Parameters = <> + OnExecute = PHPLibrary1Functions1Execute + end> + Left = 88 + Top = 108 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 212 + Top = 64 + end +end diff --git a/Demos/psvPHP/Library demo/Unit1.pas b/Source/Demos/psvPHP/Library demo/Unit1.pas similarity index 96% rename from Demos/psvPHP/Library demo/Unit1.pas rename to Source/Demos/psvPHP/Library demo/Unit1.pas index 681bb08..a734e5a 100644 --- a/Demos/psvPHP/Library demo/Unit1.pas +++ b/Source/Demos/psvPHP/Library demo/Unit1.pas @@ -1,77 +1,77 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -unit Unit1; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, PHPCustomLibrary, phpLibrary, php4delphi, PHPAPI, ZENDAPI, - PHPFunctions, ZendTypes, phpTypes, PHPCommon; - -type - TfrmLibDemo = class(TForm) - psvPHP1: TpsvPHP; - PHPLibrary1: TPHPLibrary; - Memo1: TMemo; - Button1: TButton; - btnExecute: TButton; - PHPEngine: TPHPEngine; - procedure Button1Click(Sender: TObject); - procedure btnExecuteClick(Sender: TObject); - procedure PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - procedure PHPLibrary1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar : TZendVariable; TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - end; - -var - frmLibDemo: TfrmLibDemo; - -implementation - -{$R *.DFM} -{$R WindowsXP.res} - -procedure TfrmLibDemo.Button1Click(Sender: TObject); -begin - ShowMessage('Click'); -end; - -procedure TfrmLibDemo.btnExecuteClick(Sender: TObject); -begin - PHPEngine.StartupEngine; - psvPhp1.RunCode(memo1.Lines.text); - PHPEngine.ShutdownAndWaitFor; -end; - -procedure TfrmLibDemo.PHPLibrary1Functions0Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - frmLibDemo.Caption := Parameters[0].Value; -end; - -procedure TfrmLibDemo.PHPLibrary1Functions1Execute(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; - TSRMLS_DC: Pointer); -begin - Button1.Click; -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, PHPCustomLibrary, phpLibrary, php4delphi, PHPAPI, ZENDAPI, + PHPFunctions, ZendTypes, phpTypes, PHPCommon; + +type + TfrmLibDemo = class(TForm) + psvPHP1: TpsvPHP; + PHPLibrary1: TPHPLibrary; + Memo1: TMemo; + Button1: TButton; + btnExecute: TButton; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + procedure btnExecuteClick(Sender: TObject); + procedure PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + procedure PHPLibrary1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar : TZendVariable; TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmLibDemo: TfrmLibDemo; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TfrmLibDemo.Button1Click(Sender: TObject); +begin + ShowMessage('Click'); +end; + +procedure TfrmLibDemo.btnExecuteClick(Sender: TObject); +begin + PHPEngine.StartupEngine; + psvPhp1.RunCode(memo1.Lines.text); + PHPEngine.ShutdownAndWaitFor; +end; + +procedure TfrmLibDemo.PHPLibrary1Functions0Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + frmLibDemo.Caption := Parameters[0].Value; +end; + +procedure TfrmLibDemo.PHPLibrary1Functions1Execute(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar : TZendVariable; + TSRMLS_DC: Pointer); +begin + Button1.Click; +end; + +end. diff --git a/Demos/psvPHP/Library demo/WindowsXP.res b/Source/Demos/psvPHP/Library demo/WindowsXP.res similarity index 100% rename from Demos/psvPHP/Library demo/WindowsXP.res rename to Source/Demos/psvPHP/Library demo/WindowsXP.res diff --git a/Demos/psvPHP/Library demo/dm_Main.dfm b/Source/Demos/psvPHP/Library demo/dm_Main.dfm similarity index 100% rename from Demos/psvPHP/Library demo/dm_Main.dfm rename to Source/Demos/psvPHP/Library demo/dm_Main.dfm diff --git a/Demos/psvPHP/Library demo/dm_Main.dti b/Source/Demos/psvPHP/Library demo/dm_Main.dti similarity index 100% rename from Demos/psvPHP/Library demo/dm_Main.dti rename to Source/Demos/psvPHP/Library demo/dm_Main.dti diff --git a/Demos/psvPHP/Library demo/dm_Main.pas b/Source/Demos/psvPHP/Library demo/dm_Main.pas similarity index 100% rename from Demos/psvPHP/Library demo/dm_Main.pas rename to Source/Demos/psvPHP/Library demo/dm_Main.pas diff --git a/Demos/psvPHP/Library demo/frm_dialog.dfm b/Source/Demos/psvPHP/Library demo/frm_dialog.dfm similarity index 100% rename from Demos/psvPHP/Library demo/frm_dialog.dfm rename to Source/Demos/psvPHP/Library demo/frm_dialog.dfm diff --git a/Demos/psvPHP/Library demo/frm_dialog.pas b/Source/Demos/psvPHP/Library demo/frm_dialog.pas similarity index 100% rename from Demos/psvPHP/Library demo/frm_dialog.pas rename to Source/Demos/psvPHP/Library demo/frm_dialog.pas diff --git a/Demos/psvPHP/Logo/LogoDemo.dpr b/Source/Demos/psvPHP/Logo/LogoDemo.dpr similarity index 93% rename from Demos/psvPHP/Logo/LogoDemo.dpr rename to Source/Demos/psvPHP/Logo/LogoDemo.dpr index 17ea943..7dedaa4 100644 --- a/Demos/psvPHP/Logo/LogoDemo.dpr +++ b/Source/Demos/psvPHP/Logo/LogoDemo.dpr @@ -1,13 +1,13 @@ -program LogoDemo; - -uses - Forms, - uMain in 'uMain.pas' {Form1}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program LogoDemo; + +uses + Forms, + uMain in 'uMain.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/Logo/LogoDemo.res b/Source/Demos/psvPHP/Logo/LogoDemo.res similarity index 100% rename from Demos/psvPHP/Logo/LogoDemo.res rename to Source/Demos/psvPHP/Logo/LogoDemo.res diff --git a/Demos/psvPHP/Logo/WindowsXP.res b/Source/Demos/psvPHP/Logo/WindowsXP.res similarity index 100% rename from Demos/psvPHP/Logo/WindowsXP.res rename to Source/Demos/psvPHP/Logo/WindowsXP.res diff --git a/Demos/psvPHP/Logo/egg.gif b/Source/Demos/psvPHP/Logo/egg.gif similarity index 100% rename from Demos/psvPHP/Logo/egg.gif rename to Source/Demos/psvPHP/Logo/egg.gif diff --git a/Demos/psvPHP/Logo/uMain.dfm b/Source/Demos/psvPHP/Logo/uMain.dfm similarity index 95% rename from Demos/psvPHP/Logo/uMain.dfm rename to Source/Demos/psvPHP/Logo/uMain.dfm index bb20edb..63d1244 100644 --- a/Demos/psvPHP/Logo/uMain.dfm +++ b/Source/Demos/psvPHP/Logo/uMain.dfm @@ -1,36 +1,36 @@ -object Form1: TForm1 - Left = 520 - Top = 365 - BorderStyle = bsDialog - Caption = 'Logo demo' - ClientHeight = 52 - ClientWidth = 178 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - PixelsPerInch = 96 - TextHeight = 13 - object Button1: TButton - Left = 11 - Top = 14 - Width = 75 - Height = 25 - Caption = 'PHP egg' - TabOrder = 0 - OnClick = Button1Click - end - object Button2: TButton - Left = 91 - Top = 14 - Width = 75 - Height = 25 - Caption = 'Close' - TabOrder = 1 - OnClick = Button2Click - end -end +object Form1: TForm1 + Left = 520 + Top = 365 + BorderStyle = bsDialog + Caption = 'Logo demo' + ClientHeight = 52 + ClientWidth = 178 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 11 + Top = 14 + Width = 75 + Height = 25 + Caption = 'PHP egg' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 91 + Top = 14 + Width = 75 + Height = 25 + Caption = 'Close' + TabOrder = 1 + OnClick = Button2Click + end +end diff --git a/Demos/psvPHP/Logo/uMain.pas b/Source/Demos/psvPHP/Logo/uMain.pas similarity index 94% rename from Demos/psvPHP/Logo/uMain.pas rename to Source/Demos/psvPHP/Logo/uMain.pas index 673a627..2371130 100644 --- a/Demos/psvPHP/Logo/uMain.pas +++ b/Source/Demos/psvPHP/Logo/uMain.pas @@ -1,46 +1,46 @@ -unit uMain; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ShellAPI; - -type - TForm1 = class(TForm) - Button1: TButton; - Button2: TButton; - procedure Button1Click(Sender: TObject); - procedure Button2Click(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - Form1: TForm1; - -implementation -uses - logos; - -{$R *.DFM} -{$R WindowsXP.res} - -procedure TForm1.Button1Click(Sender: TObject); -var - FS : TFileStream; -begin - FS := TFileStream.Create('egg.gif', fmCreate); - FS.Write(php_egg_logo, 7538); - FS.Free; - ShellExecute(0, 'open', 'egg.gif', nil, nil, SW_SHOWNORMAL); -end; - -procedure TForm1.Button2Click(Sender: TObject); -begin - Close; -end; - -end. +unit uMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ShellAPI; + +type + TForm1 = class(TForm) + Button1: TButton; + Button2: TButton; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation +uses + logos; + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TForm1.Button1Click(Sender: TObject); +var + FS : TFileStream; +begin + FS := TFileStream.Create('egg.gif', fmCreate); + FS.Write(php_egg_logo, 7538); + FS.Free; + ShellExecute(0, 'open', 'egg.gif', nil, nil, SW_SHOWNORMAL); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + Close; +end; + +end. diff --git a/Demos/psvPHP/Multithread simple/MultithreadSample.dpr b/Source/Demos/psvPHP/Multithread simple/MultithreadSample.dpr similarity index 100% rename from Demos/psvPHP/Multithread simple/MultithreadSample.dpr rename to Source/Demos/psvPHP/Multithread simple/MultithreadSample.dpr diff --git a/Demos/psvPHP/Multithread simple/MultithreadSample.res b/Source/Demos/psvPHP/Multithread simple/MultithreadSample.res similarity index 100% rename from Demos/psvPHP/Multithread simple/MultithreadSample.res rename to Source/Demos/psvPHP/Multithread simple/MultithreadSample.res diff --git a/Demos/psvPHP/Multithread simple/WindowsXP.res b/Source/Demos/psvPHP/Multithread simple/WindowsXP.res similarity index 100% rename from Demos/psvPHP/Multithread simple/WindowsXP.res rename to Source/Demos/psvPHP/Multithread simple/WindowsXP.res diff --git a/Demos/psvPHP/Multithread simple/frm_main.ddp b/Source/Demos/psvPHP/Multithread simple/frm_main.ddp similarity index 100% rename from Demos/psvPHP/Multithread simple/frm_main.ddp rename to Source/Demos/psvPHP/Multithread simple/frm_main.ddp diff --git a/Demos/psvPHP/Multithread simple/frm_main.dfm b/Source/Demos/psvPHP/Multithread simple/frm_main.dfm similarity index 100% rename from Demos/psvPHP/Multithread simple/frm_main.dfm rename to Source/Demos/psvPHP/Multithread simple/frm_main.dfm diff --git a/Demos/psvPHP/Multithread simple/frm_main.pas b/Source/Demos/psvPHP/Multithread simple/frm_main.pas similarity index 100% rename from Demos/psvPHP/Multithread simple/frm_main.pas rename to Source/Demos/psvPHP/Multithread simple/frm_main.pas diff --git a/Demos/psvPHP/Multithread simple/php_thread.pas b/Source/Demos/psvPHP/Multithread simple/php_thread.pas similarity index 100% rename from Demos/psvPHP/Multithread simple/php_thread.pas rename to Source/Demos/psvPHP/Multithread simple/php_thread.pas diff --git a/Demos/psvPHP/Thread Management/ManageThreads.dpr b/Source/Demos/psvPHP/Thread Management/ManageThreads.dpr similarity index 100% rename from Demos/psvPHP/Thread Management/ManageThreads.dpr rename to Source/Demos/psvPHP/Thread Management/ManageThreads.dpr diff --git a/Demos/psvPHP/Thread Management/ManageThreads.res b/Source/Demos/psvPHP/Thread Management/ManageThreads.res similarity index 100% rename from Demos/psvPHP/Thread Management/ManageThreads.res rename to Source/Demos/psvPHP/Thread Management/ManageThreads.res diff --git a/Demos/psvPHP/Thread Management/frm_main.dfm b/Source/Demos/psvPHP/Thread Management/frm_main.dfm similarity index 100% rename from Demos/psvPHP/Thread Management/frm_main.dfm rename to Source/Demos/psvPHP/Thread Management/frm_main.dfm diff --git a/Demos/psvPHP/Thread Management/frm_main.pas b/Source/Demos/psvPHP/Thread Management/frm_main.pas similarity index 100% rename from Demos/psvPHP/Thread Management/frm_main.pas rename to Source/Demos/psvPHP/Thread Management/frm_main.pas diff --git a/Demos/psvPHP/Thread Management/php_thread.pas b/Source/Demos/psvPHP/Thread Management/php_thread.pas similarity index 100% rename from Demos/psvPHP/Thread Management/php_thread.pas rename to Source/Demos/psvPHP/Thread Management/php_thread.pas diff --git a/Demos/psvPHP/Threads Library/ManageThreads.dpr b/Source/Demos/psvPHP/Threads Library/ManageThreads.dpr similarity index 100% rename from Demos/psvPHP/Threads Library/ManageThreads.dpr rename to Source/Demos/psvPHP/Threads Library/ManageThreads.dpr diff --git a/Demos/psvPHP/Threads Library/ManageThreads.res b/Source/Demos/psvPHP/Threads Library/ManageThreads.res similarity index 100% rename from Demos/psvPHP/Threads Library/ManageThreads.res rename to Source/Demos/psvPHP/Threads Library/ManageThreads.res diff --git a/Demos/psvPHP/Threads Library/frm_main.ddp b/Source/Demos/psvPHP/Threads Library/frm_main.ddp similarity index 100% rename from Demos/psvPHP/Threads Library/frm_main.ddp rename to Source/Demos/psvPHP/Threads Library/frm_main.ddp diff --git a/Demos/psvPHP/Threads Library/frm_main.dfm b/Source/Demos/psvPHP/Threads Library/frm_main.dfm similarity index 100% rename from Demos/psvPHP/Threads Library/frm_main.dfm rename to Source/Demos/psvPHP/Threads Library/frm_main.dfm diff --git a/Demos/psvPHP/Threads Library/frm_main.pas b/Source/Demos/psvPHP/Threads Library/frm_main.pas similarity index 100% rename from Demos/psvPHP/Threads Library/frm_main.pas rename to Source/Demos/psvPHP/Threads Library/frm_main.pas diff --git a/Demos/psvPHP/Threads Library/php_thread.pas b/Source/Demos/psvPHP/Threads Library/php_thread.pas similarity index 100% rename from Demos/psvPHP/Threads Library/php_thread.pas rename to Source/Demos/psvPHP/Threads Library/php_thread.pas diff --git a/Demos/psvPHP/array demo/Project1.bdsproj b/Source/Demos/psvPHP/array demo/Project1.bdsproj similarity index 100% rename from Demos/psvPHP/array demo/Project1.bdsproj rename to Source/Demos/psvPHP/array demo/Project1.bdsproj diff --git a/Demos/psvPHP/array demo/Project1.dpr b/Source/Demos/psvPHP/array demo/Project1.dpr similarity index 93% rename from Demos/psvPHP/array demo/Project1.dpr rename to Source/Demos/psvPHP/array demo/Project1.dpr index 79c301d..dfa3f13 100644 --- a/Demos/psvPHP/array demo/Project1.dpr +++ b/Source/Demos/psvPHP/array demo/Project1.dpr @@ -1,13 +1,13 @@ -program Project1; - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/array demo/Project1.res b/Source/Demos/psvPHP/array demo/Project1.res similarity index 100% rename from Demos/psvPHP/array demo/Project1.res rename to Source/Demos/psvPHP/array demo/Project1.res diff --git a/Demos/psvPHP/array demo/Unit1.ddp b/Source/Demos/psvPHP/array demo/Unit1.ddp similarity index 100% rename from Demos/psvPHP/array demo/Unit1.ddp rename to Source/Demos/psvPHP/array demo/Unit1.ddp diff --git a/Demos/psvPHP/array demo/Unit1.dfm b/Source/Demos/psvPHP/array demo/Unit1.dfm similarity index 95% rename from Demos/psvPHP/array demo/Unit1.dfm rename to Source/Demos/psvPHP/array demo/Unit1.dfm index d9a28b9..bcac6ee 100644 --- a/Demos/psvPHP/array demo/Unit1.dfm +++ b/Source/Demos/psvPHP/array demo/Unit1.dfm @@ -1,60 +1,60 @@ -object Form1: TForm1 - Left = 490 - Top = 294 - BorderStyle = bsDialog - Caption = 'Array demo' - ClientHeight = 160 - ClientWidth = 256 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - OnCreate = FormCreate - OnDestroy = FormDestroy - PixelsPerInch = 96 - TextHeight = 13 - object Button1: TButton - Left = 16 - Top = 64 - Width = 75 - Height = 25 - Caption = 'Button1' - TabOrder = 0 - OnClick = Button1Click - end - object ListBox1: TListBox - Left = 108 - Top = 4 - Width = 121 - Height = 97 - ItemHeight = 13 - TabOrder = 1 - end - object psvPHP1: TpsvPHP - Variables = <> - Left = 20 - Top = 16 - end - object PHPLibrary1: TPHPLibrary - LibraryName = 'ArrayLib' - Functions = < - item - FunctionName = 'get_php_array' - Tag = 0 - Parameters = <> - OnExecute = ExecuteGetArray - end> - Left = 52 - Top = 16 - end - object PHPEngine: TPHPEngine - Constants = <> - ReportDLLError = False - Left = 44 - Top = 112 - end -end +object Form1: TForm1 + Left = 490 + Top = 294 + BorderStyle = bsDialog + Caption = 'Array demo' + ClientHeight = 160 + ClientWidth = 256 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 16 + Top = 64 + Width = 75 + Height = 25 + Caption = 'Button1' + TabOrder = 0 + OnClick = Button1Click + end + object ListBox1: TListBox + Left = 108 + Top = 4 + Width = 121 + Height = 97 + ItemHeight = 13 + TabOrder = 1 + end + object psvPHP1: TpsvPHP + Variables = <> + Left = 20 + Top = 16 + end + object PHPLibrary1: TPHPLibrary + LibraryName = 'ArrayLib' + Functions = < + item + FunctionName = 'get_php_array' + Tag = 0 + Parameters = <> + OnExecute = ExecuteGetArray + end> + Left = 52 + Top = 16 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 44 + Top = 112 + end +end diff --git a/Demos/psvPHP/array demo/Unit1.pas b/Source/Demos/psvPHP/array demo/Unit1.pas similarity index 96% rename from Demos/psvPHP/array demo/Unit1.pas rename to Source/Demos/psvPHP/array demo/Unit1.pas index 381b37f..8b8979d 100644 --- a/Demos/psvPHP/array demo/Unit1.pas +++ b/Source/Demos/psvPHP/array demo/Unit1.pas @@ -1,107 +1,107 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -//This sample shows how to return an array as a result of PHP function -unit Unit1; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - PHPCustomLibrary, phpLibrary, php4delphi, phpFunctions, ZendAPI, PHPAPI, - StdCtrls, ZendTypes, phpTypes, PHPCommon; - -type - TForm1 = class(TForm) - psvPHP1: TpsvPHP; - PHPLibrary1: TPHPLibrary; - Button1: TButton; - ListBox1: TListBox; - PHPEngine: TPHPEngine; - procedure Button1Click(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure FormDestroy(Sender: TObject); - procedure ExecuteGetArray(Sender: TObject; Parameters: TFunctionParams; - var ReturnValue: Variant; ZendVar: TZendVariable; - TSRMLS_DC: Pointer); - private - { Private declarations } - public - { Public declarations } - ar : array of string; - end; - -var - Form1: TForm1; - -implementation - -{$R *.DFM} - - -procedure TForm1.Button1Click(Sender: TObject); -var - cnt : integer; -begin - //Clear array - SetLength(ar,0); - //Execute code - psvPHP1.RunCode('$z=0; $y=0; $ar=array("la","hu"); $x=45; $z = $x + $y; $count=count($ar); get_php_array();'); - //Display new value of the array - ListBox1.Items.Clear; - for cnt := 0 to Length(ar) - 1 do - ListBox1.Items.Add(ar[cnt]); -end; - -procedure TForm1.FormCreate(Sender: TObject); -begin - PHPEngine.StartupEngine; -end; - -procedure TForm1.FormDestroy(Sender: TObject); -begin - // PHPEngine.ShutdownEngine; -end; - -procedure TForm1.ExecuteGetArray(Sender: TObject; - Parameters: TFunctionParams; var ReturnValue: Variant; - ZendVar: TZendVariable; TSRMLS_DC: Pointer); -var - ht : PHashTable; - data: ^ppzval; - cnt : integer; - variable : pzval; - tmp : ^ppzval; -begin - ht := GetSymbolsTable; - if Assigned(ht) then - begin - new(data); - if zend_hash_find(ht, 'ar', 3, data) = SUCCESS then - begin - variable := data^^; - if variable^._type = IS_ARRAY then - begin - SetLength(ar, zend_hash_num_elements(variable^.value.ht)); - for cnt := 0 to zend_hash_num_elements(variable^.value.ht) -1 do - begin - new(tmp); - zend_hash_index_find(variable^.value.ht, cnt, tmp); - ar[cnt] := tmp^^^.value.str.val; - freemem(tmp); - end; - end; - end; - freemem(data); - end; -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +//This sample shows how to return an array as a result of PHP function +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + PHPCustomLibrary, phpLibrary, php4delphi, phpFunctions, ZendAPI, PHPAPI, + StdCtrls, ZendTypes, phpTypes, PHPCommon; + +type + TForm1 = class(TForm) + psvPHP1: TpsvPHP; + PHPLibrary1: TPHPLibrary; + Button1: TButton; + ListBox1: TListBox; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure ExecuteGetArray(Sender: TObject; Parameters: TFunctionParams; + var ReturnValue: Variant; ZendVar: TZendVariable; + TSRMLS_DC: Pointer); + private + { Private declarations } + public + { Public declarations } + ar : array of string; + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + + +procedure TForm1.Button1Click(Sender: TObject); +var + cnt : integer; +begin + //Clear array + SetLength(ar,0); + //Execute code + psvPHP1.RunCode('$z=0; $y=0; $ar=array("la","hu"); $x=45; $z = $x + $y; $count=count($ar); get_php_array();'); + //Display new value of the array + ListBox1.Items.Clear; + for cnt := 0 to Length(ar) - 1 do + ListBox1.Items.Add(ar[cnt]); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + // PHPEngine.ShutdownEngine; +end; + +procedure TForm1.ExecuteGetArray(Sender: TObject; + Parameters: TFunctionParams; var ReturnValue: Variant; + ZendVar: TZendVariable; TSRMLS_DC: Pointer); +var + ht : PHashTable; + data: ^ppzval; + cnt : integer; + variable : pzval; + tmp : ^ppzval; +begin + ht := GetSymbolsTable; + if Assigned(ht) then + begin + new(data); + if zend_hash_find(ht, 'ar', 3, data) = SUCCESS then + begin + variable := data^^; + if variable^._type = IS_ARRAY then + begin + SetLength(ar, zend_hash_num_elements(variable^.value.ht)); + for cnt := 0 to zend_hash_num_elements(variable^.value.ht) -1 do + begin + new(tmp); + zend_hash_index_find(variable^.value.ht, cnt, tmp); + ar[cnt] := tmp^^^.value.str.val; + freemem(tmp); + end; + end; + end; + freemem(data); + end; +end; + +end. diff --git a/Demos/psvPHP/array demo/WindowsXP.res b/Source/Demos/psvPHP/array demo/WindowsXP.res similarity index 100% rename from Demos/psvPHP/array demo/WindowsXP.res rename to Source/Demos/psvPHP/array demo/WindowsXP.res diff --git a/Demos/psvPHP/console/phpcon.dpr b/Source/Demos/psvPHP/console/phpcon.dpr similarity index 96% rename from Demos/psvPHP/console/phpcon.dpr rename to Source/Demos/psvPHP/console/phpcon.dpr index 100cb72..1aa6530 100644 --- a/Demos/psvPHP/console/phpcon.dpr +++ b/Source/Demos/psvPHP/console/phpcon.dpr @@ -1,35 +1,35 @@ -{$APPTYPE CONSOLE} - -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{ $Id: phpcon.dpr,v 7.0 04/2007 delphi32 Exp $ } - -program phpcon; - -uses SysUtils, php4delphi; - -var - php : TpsvPHP; - Engine : TPHPEngine; -begin - if ParamCount <> 1 then - begin - writeln(Format('Usage: %s ', [ParamStr(0)])); - Halt(1); - end; - Engine := TPHPEngine.Create(nil); - Engine.StartupEngine; - php := TpsvPHP.Create(nil); - php.FileName := ParamStr(1); - write(php.Execute); - php.Free; - Engine.ShutdownEngine; - Engine.Free; -end. +{$APPTYPE CONSOLE} + +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{ $Id: phpcon.dpr,v 7.0 04/2007 delphi32 Exp $ } + +program phpcon; + +uses SysUtils, php4delphi; + +var + php : TpsvPHP; + Engine : TPHPEngine; +begin + if ParamCount <> 1 then + begin + writeln(Format('Usage: %s ', [ParamStr(0)])); + Halt(1); + end; + Engine := TPHPEngine.Create(nil); + Engine.StartupEngine; + php := TpsvPHP.Create(nil); + php.FileName := ParamStr(1); + write(php.Execute); + php.Free; + Engine.ShutdownEngine; + Engine.Free; +end. diff --git a/Demos/psvPHP/sample1/test.php b/Source/Demos/psvPHP/console/test.php similarity index 85% rename from Demos/psvPHP/sample1/test.php rename to Source/Demos/psvPHP/console/test.php index 62eb52c..f4f3614 100644 --- a/Demos/psvPHP/sample1/test.php +++ b/Source/Demos/psvPHP/console/test.php @@ -1,4 +1,4 @@ - - + + diff --git a/Demos/psvPHP/sample1/Project1.dpr b/Source/Demos/psvPHP/sample1/Project1.dpr similarity index 93% rename from Demos/psvPHP/sample1/Project1.dpr rename to Source/Demos/psvPHP/sample1/Project1.dpr index 6c2b75e..56ace9c 100644 --- a/Demos/psvPHP/sample1/Project1.dpr +++ b/Source/Demos/psvPHP/sample1/Project1.dpr @@ -1,18 +1,18 @@ -program Project1; - -{%ToDo 'Project1.todo'} - -uses - Forms, - Unit1 in 'Unit1.pas' {frmPHPDemo}, - zendAPI, - php4delphi, - phpAPI; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TfrmPHPDemo, frmPHPDemo); - Application.Run; -end. +program Project1; + +{%ToDo 'Project1.todo'} + +uses + Forms, + Unit1 in 'Unit1.pas' {frmPHPDemo}, + zendAPI, + php4delphi, + phpAPI; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmPHPDemo, frmPHPDemo); + Application.Run; +end. diff --git a/Demos/psvPHP/sample1/Project1.res b/Source/Demos/psvPHP/sample1/Project1.res similarity index 100% rename from Demos/psvPHP/sample1/Project1.res rename to Source/Demos/psvPHP/sample1/Project1.res diff --git a/Demos/psvPHP/sample1/Sample1.bdsproj b/Source/Demos/psvPHP/sample1/Sample1.bdsproj similarity index 100% rename from Demos/psvPHP/sample1/Sample1.bdsproj rename to Source/Demos/psvPHP/sample1/Sample1.bdsproj diff --git a/Demos/psvPHP/sample1/Sample1.dpr b/Source/Demos/psvPHP/sample1/Sample1.dpr similarity index 100% rename from Demos/psvPHP/sample1/Sample1.dpr rename to Source/Demos/psvPHP/sample1/Sample1.dpr diff --git a/Demos/psvPHP/sample1/Sample1.dproj b/Source/Demos/psvPHP/sample1/Sample1.dproj similarity index 100% rename from Demos/psvPHP/sample1/Sample1.dproj rename to Source/Demos/psvPHP/sample1/Sample1.dproj diff --git a/Demos/psvPHP/sample1/Sample1.res b/Source/Demos/psvPHP/sample1/Sample1.res similarity index 100% rename from Demos/psvPHP/sample1/Sample1.res rename to Source/Demos/psvPHP/sample1/Sample1.res diff --git a/Source/Demos/psvPHP/sample1/Thumbs.db b/Source/Demos/psvPHP/sample1/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..3292cf968e1f818fbdf1b7f76cd37b53fe5af002 GIT binary patch literal 18944 zcmeIuF#!Mo0K%a4Pi+e?h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>Yx*92iOf B00961 literal 0 HcmV?d00001 diff --git a/Demos/psvPHP/sample1/Unit1.ddp b/Source/Demos/psvPHP/sample1/Unit1.ddp similarity index 100% rename from Demos/psvPHP/sample1/Unit1.ddp rename to Source/Demos/psvPHP/sample1/Unit1.ddp diff --git a/Demos/psvPHP/sample1/Unit1.dfm b/Source/Demos/psvPHP/sample1/Unit1.dfm similarity index 96% rename from Demos/psvPHP/sample1/Unit1.dfm rename to Source/Demos/psvPHP/sample1/Unit1.dfm index 43af372..87db932 100644 --- a/Demos/psvPHP/sample1/Unit1.dfm +++ b/Source/Demos/psvPHP/sample1/Unit1.dfm @@ -1,181 +1,181 @@ -object frmPHPDemo: TfrmPHPDemo - Left = 299 - Top = 239 - Width = 783 - Height = 540 - Caption = 'psvPHP demo' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - OnCreate = FormCreate - PixelsPerInch = 96 - TextHeight = 13 - object Splitter1: TSplitter - Left = 484 - Top = 0 - Width = 4 - Height = 465 - Cursor = crHSplit - Align = alRight - end - object pnlButtons: TPanel - Left = 0 - Top = 465 - Width = 775 - Height = 41 - Align = alBottom - BevelOuter = bvNone - TabOrder = 0 - object Panel2: TPanel - Left = 590 - Top = 0 - Width = 185 - Height = 41 - Align = alRight - BevelOuter = bvNone - TabOrder = 0 - object btnExecuteCode: TButton - Left = 88 - Top = 8 - Width = 87 - Height = 25 - Caption = 'Execute Code' - TabOrder = 0 - OnClick = btnExecuteCodeClick - end - object btnExecuteFile: TButton - Left = 8 - Top = 8 - Width = 75 - Height = 25 - Caption = 'Execute File' - TabOrder = 1 - OnClick = btnExecuteFileClick - end - end - end - object WebBrowser1: TWebBrowser - Left = 0 - Top = 0 - Width = 484 - Height = 465 - Align = alClient - TabOrder = 1 - ControlData = { - 4C000000063200000F3000000000000000000000000000000000000000000000 - 000000004C000000000000000000000001000000E0D057007335CF11AE690800 - 2B2E126208000000000000004C0000000114020000000000C000000000000046 - 8000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000100000000000000000000000000000000000000} - end - object Panel3: TPanel - Left = 488 - Top = 0 - Width = 287 - Height = 465 - Align = alRight - Caption = 'Panel3' - TabOrder = 2 - object Label1: TLabel - Left = 1 - Top = 1 - Width = 285 - Height = 13 - Align = alTop - Caption = ' PHP code' - end - object Label2: TLabel - Left = 1 - Top = 295 - Width = 285 - Height = 13 - Align = alBottom - Caption = ' Result values' - end - object memPHPCode: TMemo - Left = 1 - Top = 14 - Width = 285 - Height = 281 - Align = alClient - Lines.Strings = ( - 'echo "Before function declaration...
\n";' - '' - 'function print_something_multiple_times($something,$times)' - '{' - - ' echo "----
\nIn function, printing the string \"$something\' + - '" $times times
\n";' - ' for ($i=0; $i<$times; $i++) {' - ' echo "$i) $something
\n";' - ' }' - ' echo "Done with function...
\n-----
\n";' - '}' - '' - 'function some_other_function()' - '{' - - ' echo "This is some other function, to ensure more than just on' + - 'e function works fine...
\n";' - '}' - '' - '' - 'echo "After function declaration...
\n";' - '' - 'echo "Calling function for the first time...
\n";' - 'print_something_multiple_times($test,10);' - 'echo "Returned from function call...
\n";' - '' - 'echo "Calling the function for the second time...
\n";' - - 'print_something_multiple_times("This like, really works and stuf' + - 'f...",3);' - 'echo "Returned from function call...
\n";' - '' - 'some_other_function();' - '' - '$test = "I don'#39't believe";' - '$tool = "PHP";') - ScrollBars = ssBoth - TabOrder = 0 - WordWrap = False - end - object lbVariables: TListBox - Left = 1 - Top = 308 - Width = 285 - Height = 156 - Align = alBottom - ItemHeight = 13 - TabOrder = 1 - end - end - object psvPHP: TpsvPHP - Constants = <> - Variables = < - item - Name = 'test' - Value = 'This works!' - end - item - Name = 'tool' - Value = 'Delphi' - end> - HTMLErrors = True - HandleErrors = False - OnLogMessage = psvPHPLogMessage - Left = 116 - Top = 28 - end - object OpenDialog1: TOpenDialog - DefaultExt = '.php' - Filter = 'PHP script (*.php)|*.php|Any File (*.*)|*.*' - Left = 196 - Top = 132 - end -end +object frmPHPDemo: TfrmPHPDemo + Left = 299 + Top = 239 + Width = 783 + Height = 540 + Caption = 'psvPHP demo' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 484 + Top = 0 + Width = 4 + Height = 465 + Cursor = crHSplit + Align = alRight + end + object pnlButtons: TPanel + Left = 0 + Top = 465 + Width = 775 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 590 + Top = 0 + Width = 185 + Height = 41 + Align = alRight + BevelOuter = bvNone + TabOrder = 0 + object btnExecuteCode: TButton + Left = 88 + Top = 8 + Width = 87 + Height = 25 + Caption = 'Execute Code' + TabOrder = 0 + OnClick = btnExecuteCodeClick + end + object btnExecuteFile: TButton + Left = 8 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Execute File' + TabOrder = 1 + OnClick = btnExecuteFileClick + end + end + end + object WebBrowser1: TWebBrowser + Left = 0 + Top = 0 + Width = 484 + Height = 465 + Align = alClient + TabOrder = 1 + ControlData = { + 4C000000063200000F3000000000000000000000000000000000000000000000 + 000000004C000000000000000000000001000000E0D057007335CF11AE690800 + 2B2E126208000000000000004C0000000114020000000000C000000000000046 + 8000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000100000000000000000000000000000000000000} + end + object Panel3: TPanel + Left = 488 + Top = 0 + Width = 287 + Height = 465 + Align = alRight + Caption = 'Panel3' + TabOrder = 2 + object Label1: TLabel + Left = 1 + Top = 1 + Width = 285 + Height = 13 + Align = alTop + Caption = ' PHP code' + end + object Label2: TLabel + Left = 1 + Top = 295 + Width = 285 + Height = 13 + Align = alBottom + Caption = ' Result values' + end + object memPHPCode: TMemo + Left = 1 + Top = 14 + Width = 285 + Height = 281 + Align = alClient + Lines.Strings = ( + 'echo "Before function declaration...
\n";' + '' + 'function print_something_multiple_times($something,$times)' + '{' + + ' echo "----
\nIn function, printing the string \"$something\' + + '" $times times
\n";' + ' for ($i=0; $i<$times; $i++) {' + ' echo "$i) $something
\n";' + ' }' + ' echo "Done with function...
\n-----
\n";' + '}' + '' + 'function some_other_function()' + '{' + + ' echo "This is some other function, to ensure more than just on' + + 'e function works fine...
\n";' + '}' + '' + '' + 'echo "After function declaration...
\n";' + '' + 'echo "Calling function for the first time...
\n";' + 'print_something_multiple_times($test,10);' + 'echo "Returned from function call...
\n";' + '' + 'echo "Calling the function for the second time...
\n";' + + 'print_something_multiple_times("This like, really works and stuf' + + 'f...",3);' + 'echo "Returned from function call...
\n";' + '' + 'some_other_function();' + '' + '$test = "I don'#39't believe";' + '$tool = "PHP";') + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + object lbVariables: TListBox + Left = 1 + Top = 308 + Width = 285 + Height = 156 + Align = alBottom + ItemHeight = 13 + TabOrder = 1 + end + end + object psvPHP: TpsvPHP + Constants = <> + Variables = < + item + Name = 'test' + Value = 'This works!' + end + item + Name = 'tool' + Value = 'Delphi' + end> + HTMLErrors = True + HandleErrors = False + OnLogMessage = psvPHPLogMessage + Left = 116 + Top = 28 + end + object OpenDialog1: TOpenDialog + DefaultExt = '.php' + Filter = 'PHP script (*.php)|*.php|Any File (*.*)|*.*' + Left = 196 + Top = 132 + end +end diff --git a/Demos/psvPHP/sample1/Unit1.pas b/Source/Demos/psvPHP/sample1/Unit1.pas similarity index 96% rename from Demos/psvPHP/sample1/Unit1.pas rename to Source/Demos/psvPHP/sample1/Unit1.pas index dd8419f..53d68ce 100644 --- a/Demos/psvPHP/sample1/Unit1.pas +++ b/Source/Demos/psvPHP/sample1/Unit1.pas @@ -1,158 +1,158 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -{$I PHP.INC} - -unit Unit1; - -{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - OleCtrls, SHDocVw, StdCtrls, ExtCtrls, ActiveX, php4delphi, PHPCommon; - -type - TfrmPHPDemo = class(TForm) - pnlButtons: TPanel; - Panel2: TPanel; - btnExecuteCode: TButton; - WebBrowser1: TWebBrowser; - psvPHP: TpsvPHP; - btnExecuteFile: TButton; - OpenDialog1: TOpenDialog; - Panel3: TPanel; - memPHPCode: TMemo; - lbVariables: TListBox; - Splitter1: TSplitter; - Label1: TLabel; - Label2: TLabel; - procedure FormCreate(Sender: TObject); - procedure btnExecuteFileClick(Sender: TObject); - procedure btnExecuteCodeClick(Sender: TObject); - procedure psvPHPLogMessage(Sender: TObject; AText: String); - private - { Private declarations } - public - { Public declarations } - procedure DisplayResultInBrowser(AStr : string); - procedure DisplayVariables; - end; - -var - frmPHPDemo: TfrmPHPDemo; - -implementation - - - -{$R *.DFM} -{$R internal.res} - -function StringToOleStream(const AString: string): IStream; -var - MemHandle: THandle; -begin - MemHandle := GlobalAlloc(GPTR, Length(AString) + 1); - if MemHandle <> 0 then begin - Move(AString[1], PChar(MemHandle)^, Length(AString) + 1); - CreateStreamOnHGlobal(MemHandle, True, Result); - end else - Result := nil; -end; - -procedure TfrmPHPDemo.FormCreate(Sender: TObject); -var - Url : OleVariant; - Doc : string; -begin - Url := 'about:blank'; - Webbrowser1.Navigate2(Url); - Doc := psvPHP.RunCode('phpinfo();'); - DisplayResultInBrowser(Doc); - DisplayVariables; -end; - - - -procedure TfrmPHPDemo.btnExecuteFileClick(Sender: TObject); -var - doc : string; -begin - if OpenDialog1.Execute then - begin - doc := ''; - MemPHPCode.Lines.Clear; - MemPHPCode.Lines.LoadFromFile(OpenDialog1.FileName); - doc := psvPHP.Execute(OpenDialog1.FileName); - DisplayResultInBrowser(doc); - DisplayVariables; - end; -end; - -procedure TfrmPHPDemo.DisplayResultInBrowser(AStr: string); -var - Stream: IStream; - StreamInit: IPersistStreamInit; -begin - if AStr = '' then - begin - WebBrowser1.Navigate('about:The script returns no result'); - Exit; - end; - AStr := StringReplace(AStr, 'src="?=PHPE9568F34-D428-11d2-A769-00AA001ACF42"', - 'src="res://'+ParamStr(0)+'/php"', [rfReplaceAll, rfIgnoreCase]); - - {$IFDEF PHP4} - AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', - 'src="res://'+ ParamStr(0) + '/zend1"', [rfReplaceAll, rfIgnoreCase]); - {$ELSE} - AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', - 'src="res://'+ ParamStr(0) + '/zend2"', [rfReplaceAll, rfIgnoreCase]); - {$ENDIF} - - Stream := StringToOleStream(AStr); - StreamInit := Webbrowser1.Document as IPersistStreamInit; - StreamInit.InitNew; - StreamInit.Load(Stream); -end; - -procedure TfrmPHPDemo.DisplayVariables; -var - i : integer; -begin - lbVariables.Items.Clear; - for i := 0 to psvPHP.Variables.Count - 1 do - begin - lbVariables.Items.Add(psvphp.Variables[i].Name + '=' + psvPHP.Variables[i].Value); - end; - lbVariables.Items.Add(''); - lbVariables.Items.Add('Headers:'); - lbVariables.Items.Add(''); - for i := 0 to psvPHP.Headers.Count - 1 do - lbVariables.Items.Add(psvPHP.Headers[i].Header); -end; - -procedure TfrmPHPDemo.btnExecuteCodeClick(Sender: TObject); -var - doc : string; -begin - doc := ''; - doc := psvPHP.RunCode(memPHPCode.Text); - DisplayResultInBrowser(doc); - DisplayVariables; -end; - -procedure TfrmPHPDemo.psvPHPLogMessage(Sender: TObject; AText: String); -begin - ShowMessage('Trapped ' + AText); -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +{$I PHP.INC} + +unit Unit1; + +{ $Id: Unit1.pas,v 6.2 02/2006 delphi32 Exp $ } + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + OleCtrls, SHDocVw, StdCtrls, ExtCtrls, ActiveX, php4delphi, PHPCommon; + +type + TfrmPHPDemo = class(TForm) + pnlButtons: TPanel; + Panel2: TPanel; + btnExecuteCode: TButton; + WebBrowser1: TWebBrowser; + psvPHP: TpsvPHP; + btnExecuteFile: TButton; + OpenDialog1: TOpenDialog; + Panel3: TPanel; + memPHPCode: TMemo; + lbVariables: TListBox; + Splitter1: TSplitter; + Label1: TLabel; + Label2: TLabel; + procedure FormCreate(Sender: TObject); + procedure btnExecuteFileClick(Sender: TObject); + procedure btnExecuteCodeClick(Sender: TObject); + procedure psvPHPLogMessage(Sender: TObject; AText: String); + private + { Private declarations } + public + { Public declarations } + procedure DisplayResultInBrowser(AStr : string); + procedure DisplayVariables; + end; + +var + frmPHPDemo: TfrmPHPDemo; + +implementation + + + +{$R *.DFM} +{$R internal.res} + +function StringToOleStream(const AString: string): IStream; +var + MemHandle: THandle; +begin + MemHandle := GlobalAlloc(GPTR, Length(AString) + 1); + if MemHandle <> 0 then begin + Move(AString[1], PChar(MemHandle)^, Length(AString) + 1); + CreateStreamOnHGlobal(MemHandle, True, Result); + end else + Result := nil; +end; + +procedure TfrmPHPDemo.FormCreate(Sender: TObject); +var + Url : OleVariant; + Doc : string; +begin + Url := 'about:blank'; + Webbrowser1.Navigate2(Url); + Doc := psvPHP.RunCode('phpinfo();'); + DisplayResultInBrowser(Doc); + DisplayVariables; +end; + + + +procedure TfrmPHPDemo.btnExecuteFileClick(Sender: TObject); +var + doc : string; +begin + if OpenDialog1.Execute then + begin + doc := ''; + MemPHPCode.Lines.Clear; + MemPHPCode.Lines.LoadFromFile(OpenDialog1.FileName); + doc := psvPHP.Execute(OpenDialog1.FileName); + DisplayResultInBrowser(doc); + DisplayVariables; + end; +end; + +procedure TfrmPHPDemo.DisplayResultInBrowser(AStr: string); +var + Stream: IStream; + StreamInit: IPersistStreamInit; +begin + if AStr = '' then + begin + WebBrowser1.Navigate('about:The script returns no result'); + Exit; + end; + AStr := StringReplace(AStr, 'src="?=PHPE9568F34-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ParamStr(0)+'/php"', [rfReplaceAll, rfIgnoreCase]); + + {$IFDEF PHP4} + AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ ParamStr(0) + '/zend1"', [rfReplaceAll, rfIgnoreCase]); + {$ELSE} + AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', + 'src="res://'+ ParamStr(0) + '/zend2"', [rfReplaceAll, rfIgnoreCase]); + {$ENDIF} + + Stream := StringToOleStream(AStr); + StreamInit := Webbrowser1.Document as IPersistStreamInit; + StreamInit.InitNew; + StreamInit.Load(Stream); +end; + +procedure TfrmPHPDemo.DisplayVariables; +var + i : integer; +begin + lbVariables.Items.Clear; + for i := 0 to psvPHP.Variables.Count - 1 do + begin + lbVariables.Items.Add(psvphp.Variables[i].Name + '=' + psvPHP.Variables[i].Value); + end; + lbVariables.Items.Add(''); + lbVariables.Items.Add('Headers:'); + lbVariables.Items.Add(''); + for i := 0 to psvPHP.Headers.Count - 1 do + lbVariables.Items.Add(psvPHP.Headers[i].Header); +end; + +procedure TfrmPHPDemo.btnExecuteCodeClick(Sender: TObject); +var + doc : string; +begin + doc := ''; + doc := psvPHP.RunCode(memPHPCode.Text); + DisplayResultInBrowser(doc); + DisplayVariables; +end; + +procedure TfrmPHPDemo.psvPHPLogMessage(Sender: TObject; AText: String); +begin + ShowMessage('Trapped ' + AText); +end; + +end. diff --git a/Demos/psvPHP/sample1/WindowsXP.res b/Source/Demos/psvPHP/sample1/WindowsXP.res similarity index 100% rename from Demos/psvPHP/sample1/WindowsXP.res rename to Source/Demos/psvPHP/sample1/WindowsXP.res diff --git a/Demos/psvPHP/sample1/frm_phpDemo.ddp b/Source/Demos/psvPHP/sample1/frm_phpDemo.ddp similarity index 100% rename from Demos/psvPHP/sample1/frm_phpDemo.ddp rename to Source/Demos/psvPHP/sample1/frm_phpDemo.ddp diff --git a/Demos/psvPHP/sample1/frm_phpDemo.dfm b/Source/Demos/psvPHP/sample1/frm_phpDemo.dfm similarity index 100% rename from Demos/psvPHP/sample1/frm_phpDemo.dfm rename to Source/Demos/psvPHP/sample1/frm_phpDemo.dfm diff --git a/Demos/psvPHP/sample1/frm_phpDemo.pas b/Source/Demos/psvPHP/sample1/frm_phpDemo.pas similarity index 100% rename from Demos/psvPHP/sample1/frm_phpDemo.pas rename to Source/Demos/psvPHP/sample1/frm_phpDemo.pas diff --git a/Demos/psvPHP/sample1/internal.RES b/Source/Demos/psvPHP/sample1/internal.RES similarity index 100% rename from Demos/psvPHP/sample1/internal.RES rename to Source/Demos/psvPHP/sample1/internal.RES diff --git a/Demos/psvPHP/sample1/internal.rc b/Source/Demos/psvPHP/sample1/internal.rc similarity index 96% rename from Demos/psvPHP/sample1/internal.rc rename to Source/Demos/psvPHP/sample1/internal.rc index cdba328..7af5bd7 100644 --- a/Demos/psvPHP/sample1/internal.rc +++ b/Source/Demos/psvPHP/sample1/internal.rc @@ -1,3 +1,3 @@ -php 23 DISCARDABLE php.gif -zend2 23 DISCARDABLE zend2.gif -zend1 23 DISCARDABLE zend1.gif +php 23 DISCARDABLE php.gif +zend2 23 DISCARDABLE zend2.gif +zend1 23 DISCARDABLE zend1.gif diff --git a/Demos/psvPHP/sample1/php.gif b/Source/Demos/psvPHP/sample1/php.gif similarity index 100% rename from Demos/psvPHP/sample1/php.gif rename to Source/Demos/psvPHP/sample1/php.gif diff --git a/Demos/psvPHP/console/test.php b/Source/Demos/psvPHP/sample1/test.php similarity index 85% rename from Demos/psvPHP/console/test.php rename to Source/Demos/psvPHP/sample1/test.php index 62eb52c..f4f3614 100644 --- a/Demos/psvPHP/console/test.php +++ b/Source/Demos/psvPHP/sample1/test.php @@ -1,4 +1,4 @@ - - + + diff --git a/Demos/psvPHP/sample1/zend1.gif b/Source/Demos/psvPHP/sample1/zend1.gif similarity index 100% rename from Demos/psvPHP/sample1/zend1.gif rename to Source/Demos/psvPHP/sample1/zend1.gif diff --git a/Demos/psvPHP/sample1/zend2.gif b/Source/Demos/psvPHP/sample1/zend2.gif similarity index 100% rename from Demos/psvPHP/sample1/zend2.gif rename to Source/Demos/psvPHP/sample1/zend2.gif diff --git a/Demos/psvPHP/sample2/Project1.dpr b/Source/Demos/psvPHP/sample2/Project1.dpr similarity index 93% rename from Demos/psvPHP/sample2/Project1.dpr rename to Source/Demos/psvPHP/sample2/Project1.dpr index 6a76f6f..ca1d8c4 100644 --- a/Demos/psvPHP/sample2/Project1.dpr +++ b/Source/Demos/psvPHP/sample2/Project1.dpr @@ -1,14 +1,14 @@ -program Project1; - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}, - PHP4Delphi; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}, + PHP4Delphi; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/sample2/Project1.res b/Source/Demos/psvPHP/sample2/Project1.res similarity index 100% rename from Demos/psvPHP/sample2/Project1.res rename to Source/Demos/psvPHP/sample2/Project1.res diff --git a/Demos/psvPHP/sample2/Sample2.bdsproj b/Source/Demos/psvPHP/sample2/Sample2.bdsproj similarity index 100% rename from Demos/psvPHP/sample2/Sample2.bdsproj rename to Source/Demos/psvPHP/sample2/Sample2.bdsproj diff --git a/Demos/psvPHP/sample2/Sample2.dpr b/Source/Demos/psvPHP/sample2/Sample2.dpr similarity index 100% rename from Demos/psvPHP/sample2/Sample2.dpr rename to Source/Demos/psvPHP/sample2/Sample2.dpr diff --git a/Demos/psvPHP/sample2/Sample2.res b/Source/Demos/psvPHP/sample2/Sample2.res similarity index 100% rename from Demos/psvPHP/sample2/Sample2.res rename to Source/Demos/psvPHP/sample2/Sample2.res diff --git a/Demos/psvPHP/sample2/Unit1.ddp b/Source/Demos/psvPHP/sample2/Unit1.ddp similarity index 100% rename from Demos/psvPHP/sample2/Unit1.ddp rename to Source/Demos/psvPHP/sample2/Unit1.ddp diff --git a/Demos/psvPHP/sample2/Unit1.dfm b/Source/Demos/psvPHP/sample2/Unit1.dfm similarity index 94% rename from Demos/psvPHP/sample2/Unit1.dfm rename to Source/Demos/psvPHP/sample2/Unit1.dfm index d1d054f..2c36f02 100644 --- a/Demos/psvPHP/sample2/Unit1.dfm +++ b/Source/Demos/psvPHP/sample2/Unit1.dfm @@ -1,87 +1,87 @@ -object Form1: TForm1 - Left = 414 - Top = 391 - BorderStyle = bsDialog - Caption = 'Calculator' - ClientHeight = 120 - ClientWidth = 336 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - PixelsPerInch = 96 - TextHeight = 13 - object Label1: TLabel - Left = 40 - Top = 36 - Width = 6 - Height = 13 - Margins.Bottom = 0 - Caption = '+' - end - object Label2: TLabel - Left = 140 - Top = 36 - Width = 6 - Height = 13 - Margins.Bottom = 0 - Caption = '=' - end - object Label3: TLabel - Left = 156 - Top = 36 - Width = 3 - Height = 13 - Margins.Bottom = 0 - end - object Edit1: TEdit - Left = 8 - Top = 8 - Width = 121 - Height = 21 - TabOrder = 0 - Text = '2' - end - object Edit2: TEdit - Left = 8 - Top = 52 - Width = 121 - Height = 21 - TabOrder = 1 - Text = '2' - end - object Button1: TButton - Left = 244 - Top = 88 - Width = 75 - Height = 25 - Caption = 'Calculate' - TabOrder = 2 - OnClick = Button1Click - end - object psvPHP1: TpsvPHP - Variables = < - item - Name = 'x' - end - item - Name = 'y' - end - item - Name = 'z' - Value = '0' - end> - Left = 20 - Top = 80 - end - object PHPEngine: TPHPEngine - Constants = <> - ReportDLLError = False - Left = 76 - Top = 84 - end -end +object Form1: TForm1 + Left = 414 + Top = 391 + BorderStyle = bsDialog + Caption = 'Calculator' + ClientHeight = 120 + ClientWidth = 336 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 40 + Top = 36 + Width = 6 + Height = 13 + Margins.Bottom = 0 + Caption = '+' + end + object Label2: TLabel + Left = 140 + Top = 36 + Width = 6 + Height = 13 + Margins.Bottom = 0 + Caption = '=' + end + object Label3: TLabel + Left = 156 + Top = 36 + Width = 3 + Height = 13 + Margins.Bottom = 0 + end + object Edit1: TEdit + Left = 8 + Top = 8 + Width = 121 + Height = 21 + TabOrder = 0 + Text = '2' + end + object Edit2: TEdit + Left = 8 + Top = 52 + Width = 121 + Height = 21 + TabOrder = 1 + Text = '2' + end + object Button1: TButton + Left = 244 + Top = 88 + Width = 75 + Height = 25 + Caption = 'Calculate' + TabOrder = 2 + OnClick = Button1Click + end + object psvPHP1: TpsvPHP + Variables = < + item + Name = 'x' + end + item + Name = 'y' + end + item + Name = 'z' + Value = '0' + end> + Left = 20 + Top = 80 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 76 + Top = 84 + end +end diff --git a/Demos/psvPHP/sample2/Unit1.pas b/Source/Demos/psvPHP/sample2/Unit1.pas similarity index 96% rename from Demos/psvPHP/sample2/Unit1.pas rename to Source/Demos/psvPHP/sample2/Unit1.pas index 6e20fb9..09414e2 100644 --- a/Demos/psvPHP/sample2/Unit1.pas +++ b/Source/Demos/psvPHP/sample2/Unit1.pas @@ -1,53 +1,53 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} -unit Unit1; - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, php4delphi, PHPCommon; - -type - TForm1 = class(TForm) - psvPHP1: TpsvPHP; - Edit1: TEdit; - Edit2: TEdit; - Label1: TLabel; - Label2: TLabel; - Label3: TLabel; - Button1: TButton; - PHPEngine: TPHPEngine; - procedure Button1Click(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - Form1: TForm1; - -implementation - -{$R *.DFM} - -procedure TForm1.Button1Click(Sender: TObject); -begin - PHPEngine.StartupEngine; - psvPHP1.Variables.Items[0].Value := Edit1.text; - psvPHP1.Variables.Items[1].Value := Edit2.text; - psvPHP1.RunCode('$z = $x + $y;'); - Label3.Caption := psvPHP1.VariableByName('z').Value; - PHPEngine.ShutdownAndWaitFor; -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} +unit Unit1; + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, php4delphi, PHPCommon; + +type + TForm1 = class(TForm) + psvPHP1: TpsvPHP; + Edit1: TEdit; + Edit2: TEdit; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + Button1: TButton; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +procedure TForm1.Button1Click(Sender: TObject); +begin + PHPEngine.StartupEngine; + psvPHP1.Variables.Items[0].Value := Edit1.text; + psvPHP1.Variables.Items[1].Value := Edit2.text; + psvPHP1.RunCode('$z = $x + $y;'); + Label3.Caption := psvPHP1.VariableByName('z').Value; + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos/psvPHP/sample3/Project1.dpr b/Source/Demos/psvPHP/sample3/Project1.dpr similarity index 93% rename from Demos/psvPHP/sample3/Project1.dpr rename to Source/Demos/psvPHP/sample3/Project1.dpr index 08b344c..513a1dd 100644 --- a/Demos/psvPHP/sample3/Project1.dpr +++ b/Source/Demos/psvPHP/sample3/Project1.dpr @@ -1,13 +1,13 @@ -program Project1; - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Project1; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/psvPHP/sample3/Project1.res b/Source/Demos/psvPHP/sample3/Project1.res similarity index 100% rename from Demos/psvPHP/sample3/Project1.res rename to Source/Demos/psvPHP/sample3/Project1.res diff --git a/Demos/psvPHP/sample3/Sample3.dpr b/Source/Demos/psvPHP/sample3/Sample3.dpr similarity index 100% rename from Demos/psvPHP/sample3/Sample3.dpr rename to Source/Demos/psvPHP/sample3/Sample3.dpr diff --git a/Demos/psvPHP/sample3/Sample3.res b/Source/Demos/psvPHP/sample3/Sample3.res similarity index 100% rename from Demos/psvPHP/sample3/Sample3.res rename to Source/Demos/psvPHP/sample3/Sample3.res diff --git a/Demos/psvPHP/sample3/Unit1.ddp b/Source/Demos/psvPHP/sample3/Unit1.ddp similarity index 100% rename from Demos/psvPHP/sample3/Unit1.ddp rename to Source/Demos/psvPHP/sample3/Unit1.ddp diff --git a/Demos/psvPHP/sample3/Unit1.dfm b/Source/Demos/psvPHP/sample3/Unit1.dfm similarity index 95% rename from Demos/psvPHP/sample3/Unit1.dfm rename to Source/Demos/psvPHP/sample3/Unit1.dfm index a1d1140..e6deda2 100644 --- a/Demos/psvPHP/sample3/Unit1.dfm +++ b/Source/Demos/psvPHP/sample3/Unit1.dfm @@ -1,91 +1,91 @@ -object Form1: TForm1 - Left = 309 - Top = 184 - BorderStyle = bsDialog - Caption = 'Built-in functions and class sample' - ClientHeight = 331 - ClientWidth = 460 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - OnCreate = FormCreate - OnDestroy = FormDestroy - PixelsPerInch = 96 - TextHeight = 13 - object Memo1: TMemo - Left = 8 - Top = 8 - Width = 329 - Height = 89 - Lines.Strings = ( - 'delphi_Show_Message("Hello, Delphi!");') - TabOrder = 0 - end - object Memo2: TMemo - Left = 8 - Top = 108 - Width = 329 - Height = 89 - Lines.Strings = ( - '$a = new php4delphi_author();' - '$a->send_email();') - TabOrder = 1 - end - object Memo3: TMemo - Left = 8 - Top = 212 - Width = 329 - Height = 89 - Lines.Strings = ( - 'echo delphi_get_system_directory();') - TabOrder = 2 - end - object Button1: TButton - Left = 364 - Top = 60 - Width = 75 - Height = 25 - Caption = 'Execute' - TabOrder = 3 - OnClick = Button1Click - end - object Button2: TButton - Left = 364 - Top = 160 - Width = 75 - Height = 25 - Caption = 'Execute' - TabOrder = 4 - OnClick = Button2Click - end - object Button3: TButton - Left = 372 - Top = 268 - Width = 75 - Height = 25 - Caption = 'Execute' - TabOrder = 5 - OnClick = Button3Click - end - object psvPHP1: TpsvPHP - Variables = < - item - Name = 'test' - Value = 'test' - end> - Left = 112 - Top = 140 - end - object PHPEngine: TPHPEngine - HandleErrors = False - Constants = <> - ReportDLLError = False - Left = 116 - Top = 252 - end -end +object Form1: TForm1 + Left = 309 + Top = 184 + BorderStyle = bsDialog + Caption = 'Built-in functions and class sample' + ClientHeight = 331 + ClientWidth = 460 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Memo1: TMemo + Left = 8 + Top = 8 + Width = 329 + Height = 89 + Lines.Strings = ( + 'delphi_Show_Message("Hello, Delphi!");') + TabOrder = 0 + end + object Memo2: TMemo + Left = 8 + Top = 108 + Width = 329 + Height = 89 + Lines.Strings = ( + '$a = new php4delphi_author();' + '$a->send_email();') + TabOrder = 1 + end + object Memo3: TMemo + Left = 8 + Top = 212 + Width = 329 + Height = 89 + Lines.Strings = ( + 'echo delphi_get_system_directory();') + TabOrder = 2 + end + object Button1: TButton + Left = 364 + Top = 60 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 3 + OnClick = Button1Click + end + object Button2: TButton + Left = 364 + Top = 160 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 4 + OnClick = Button2Click + end + object Button3: TButton + Left = 372 + Top = 268 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 5 + OnClick = Button3Click + end + object psvPHP1: TpsvPHP + Variables = < + item + Name = 'test' + Value = 'test' + end> + Left = 112 + Top = 140 + end + object PHPEngine: TPHPEngine + HandleErrors = False + Constants = <> + ReportDLLError = False + Left = 116 + Top = 252 + end +end diff --git a/Demos/psvPHP/sample3/Unit1.pas b/Source/Demos/psvPHP/sample3/Unit1.pas similarity index 95% rename from Demos/psvPHP/sample3/Unit1.pas rename to Source/Demos/psvPHP/sample3/Unit1.pas index bcf0e46..a71263f 100644 --- a/Demos/psvPHP/sample3/Unit1.pas +++ b/Source/Demos/psvPHP/sample3/Unit1.pas @@ -1,77 +1,77 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{*******************************************************} - -unit Unit1; - -{$I PHP.INC} - -{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } - -interface - -uses - Windows, Messages, SysUtils, - {$IFDEF VERSION6} Variants, {$ENDIF} Classes, Graphics, Controls, Forms, - Dialogs, php4delphi, StdCtrls, PHPCommon; - -type - TForm1 = class(TForm) - Memo1: TMemo; - Memo2: TMemo; - Memo3: TMemo; - Button1: TButton; - Button2: TButton; - Button3: TButton; - psvPHP1: TpsvPHP; - PHPEngine: TPHPEngine; - procedure Button1Click(Sender: TObject); - procedure Button2Click(Sender: TObject); - procedure Button3Click(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure FormDestroy(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - Form1: TForm1; - -implementation - -{$R *.dfm} -{$R WindowsXP.res} - -procedure TForm1.Button1Click(Sender: TObject); -begin - psvPHP1.RunCode(Memo1.Lines.text); -end; - -procedure TForm1.Button2Click(Sender: TObject); -begin - psvPHP1.RunCode(Memo2.Lines.text); -end; - -procedure TForm1.Button3Click(Sender: TObject); -begin - ShowMessage(psvPHP1.RunCode(Memo3.Lines.text)); -end; - -procedure TForm1.FormCreate(Sender: TObject); -begin - PHPEngine.StartupEngine; -end; - -procedure TForm1.FormDestroy(Sender: TObject); -begin - PHPEngine.ShutdownAndWaitFor; -end; - -end. +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{*******************************************************} + +unit Unit1; + +{$I PHP.INC} + +{ $Id: Unit1.pas,v 7.0 04/2007 delphi32 Exp $ } + +interface + +uses + Windows, Messages, SysUtils, + {$IFDEF VERSION6} Variants, {$ENDIF} Classes, Graphics, Controls, Forms, + Dialogs, php4delphi, StdCtrls, PHPCommon; + +type + TForm1 = class(TForm) + Memo1: TMemo; + Memo2: TMemo; + Memo3: TMemo; + Button1: TButton; + Button2: TButton; + Button3: TButton; + psvPHP1: TpsvPHP; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} +{$R WindowsXP.res} + +procedure TForm1.Button1Click(Sender: TObject); +begin + psvPHP1.RunCode(Memo1.Lines.text); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + psvPHP1.RunCode(Memo2.Lines.text); +end; + +procedure TForm1.Button3Click(Sender: TObject); +begin + ShowMessage(psvPHP1.RunCode(Memo3.Lines.text)); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos/psvPHP/sample3/WindowsXP.res b/Source/Demos/psvPHP/sample3/WindowsXP.res similarity index 100% rename from Demos/psvPHP/sample3/WindowsXP.res rename to Source/Demos/psvPHP/sample3/WindowsXP.res diff --git a/Demos/psvPHP/sample4/WindowsXP.res b/Source/Demos/psvPHP/sample4/WindowsXP.res similarity index 100% rename from Demos/psvPHP/sample4/WindowsXP.res rename to Source/Demos/psvPHP/sample4/WindowsXP.res diff --git a/Demos/psvPHP/sample4/frm_PHPTest.ddp b/Source/Demos/psvPHP/sample4/frm_PHPTest.ddp similarity index 100% rename from Demos/psvPHP/sample4/frm_PHPTest.ddp rename to Source/Demos/psvPHP/sample4/frm_PHPTest.ddp diff --git a/Demos/psvPHP/sample4/frm_PHPTest.dfm b/Source/Demos/psvPHP/sample4/frm_PHPTest.dfm similarity index 94% rename from Demos/psvPHP/sample4/frm_PHPTest.dfm rename to Source/Demos/psvPHP/sample4/frm_PHPTest.dfm index a5a36ee..c7ba0a4 100644 --- a/Demos/psvPHP/sample4/frm_PHPTest.dfm +++ b/Source/Demos/psvPHP/sample4/frm_PHPTest.dfm @@ -1,103 +1,103 @@ -object frmPHPTest: TfrmPHPTest - Left = 422 - Top = 286 - Width = 590 - Height = 435 - Caption = 'psvPHP test' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - OnCreate = FormCreate - OnDestroy = FormDestroy - PixelsPerInch = 96 - TextHeight = 13 - object Splitter1: TSplitter - Left = 241 - Top = 0 - Width = 3 - Height = 360 - Cursor = crHSplit - end - object Panel1: TPanel - Left = 0 - Top = 360 - Width = 582 - Height = 41 - Align = alBottom - BevelOuter = bvNone - TabOrder = 0 - object Panel2: TPanel - Left = 397 - Top = 0 - Width = 185 - Height = 41 - Align = alRight - BevelOuter = bvNone - TabOrder = 0 - object Button1: TButton - Left = 100 - Top = 8 - Width = 75 - Height = 25 - Caption = 'Execute' - TabOrder = 0 - OnClick = Button1Click - end - end - end - object Panel3: TPanel - Left = 0 - Top = 0 - Width = 241 - Height = 360 - Align = alLeft - BevelOuter = bvNone - Caption = 'Panel3' - TabOrder = 1 - object memoScript: TMemo - Left = 0 - Top = 0 - Width = 241 - Height = 360 - Align = alClient - Lines.Strings = ( - 'phpinfo();') - ScrollBars = ssBoth - TabOrder = 0 - end - end - object Panel4: TPanel - Left = 244 - Top = 0 - Width = 338 - Height = 360 - Align = alClient - BevelOuter = bvNone - Caption = 'Panel4' - TabOrder = 2 - object MemoResult: TMemo - Left = 0 - Top = 0 - Width = 338 - Height = 360 - Align = alClient - ScrollBars = ssBoth - TabOrder = 0 - end - end - object psvPHP: TpsvPHP - Variables = <> - Left = 84 - Top = 148 - end - object PHPEngine: TPHPEngine - Constants = <> - ReportDLLError = False - Left = 80 - Top = 248 - end -end +object frmPHPTest: TfrmPHPTest + Left = 422 + Top = 286 + Width = 590 + Height = 435 + Caption = 'psvPHP test' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 241 + Top = 0 + Width = 3 + Height = 360 + Cursor = crHSplit + end + object Panel1: TPanel + Left = 0 + Top = 360 + Width = 582 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Panel2: TPanel + Left = 397 + Top = 0 + Width = 185 + Height = 41 + Align = alRight + BevelOuter = bvNone + TabOrder = 0 + object Button1: TButton + Left = 100 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Execute' + TabOrder = 0 + OnClick = Button1Click + end + end + end + object Panel3: TPanel + Left = 0 + Top = 0 + Width = 241 + Height = 360 + Align = alLeft + BevelOuter = bvNone + Caption = 'Panel3' + TabOrder = 1 + object memoScript: TMemo + Left = 0 + Top = 0 + Width = 241 + Height = 360 + Align = alClient + Lines.Strings = ( + 'phpinfo();') + ScrollBars = ssBoth + TabOrder = 0 + end + end + object Panel4: TPanel + Left = 244 + Top = 0 + Width = 338 + Height = 360 + Align = alClient + BevelOuter = bvNone + Caption = 'Panel4' + TabOrder = 2 + object MemoResult: TMemo + Left = 0 + Top = 0 + Width = 338 + Height = 360 + Align = alClient + ScrollBars = ssBoth + TabOrder = 0 + end + end + object psvPHP: TpsvPHP + Variables = <> + Left = 84 + Top = 148 + end + object PHPEngine: TPHPEngine + Constants = <> + ReportDLLError = False + Left = 80 + Top = 248 + end +end diff --git a/Demos/psvPHP/sample4/frm_PHPTest.pas b/Source/Demos/psvPHP/sample4/frm_PHPTest.pas similarity index 95% rename from Demos/psvPHP/sample4/frm_PHPTest.pas rename to Source/Demos/psvPHP/sample4/frm_PHPTest.pas index 9b238de..6227652 100644 --- a/Demos/psvPHP/sample4/frm_PHPTest.pas +++ b/Source/Demos/psvPHP/sample4/frm_PHPTest.pas @@ -1,53 +1,53 @@ -unit frm_PHPTest; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - php4delphi, StdCtrls, ExtCtrls, PHPCommon; - -type - TfrmPHPTest = class(TForm) - Panel1: TPanel; - Panel2: TPanel; - Button1: TButton; - Panel3: TPanel; - Splitter1: TSplitter; - Panel4: TPanel; - memoScript: TMemo; - MemoResult: TMemo; - psvPHP: TpsvPHP; - PHPEngine: TPHPEngine; - procedure Button1Click(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure FormDestroy(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - frmPHPTest: TfrmPHPTest; - -implementation - -{$R *.DFM} -{$R WindowsXP.res} - -procedure TfrmPHPTest.Button1Click(Sender: TObject); -begin - MemoResult.Text := psvPHP.RunCode(memoScript.Text); -end; - -procedure TfrmPHPTest.FormCreate(Sender: TObject); -begin - PHPEngine.StartupEngine; -end; - -procedure TfrmPHPTest.FormDestroy(Sender: TObject); -begin - PHPEngine.ShutdownAndWaitFor; -end; - -end. +unit frm_PHPTest; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + php4delphi, StdCtrls, ExtCtrls, PHPCommon; + +type + TfrmPHPTest = class(TForm) + Panel1: TPanel; + Panel2: TPanel; + Button1: TButton; + Panel3: TPanel; + Splitter1: TSplitter; + Panel4: TPanel; + memoScript: TMemo; + MemoResult: TMemo; + psvPHP: TpsvPHP; + PHPEngine: TPHPEngine; + procedure Button1Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmPHPTest: TfrmPHPTest; + +implementation + +{$R *.DFM} +{$R WindowsXP.res} + +procedure TfrmPHPTest.Button1Click(Sender: TObject); +begin + MemoResult.Text := psvPHP.RunCode(memoScript.Text); +end; + +procedure TfrmPHPTest.FormCreate(Sender: TObject); +begin + PHPEngine.StartupEngine; +end; + +procedure TfrmPHPTest.FormDestroy(Sender: TObject); +begin + PHPEngine.ShutdownAndWaitFor; +end; + +end. diff --git a/Demos/psvPHP/sample4/psvPHP_test.dpr b/Source/Demos/psvPHP/sample4/psvPHP_test.dpr similarity index 94% rename from Demos/psvPHP/sample4/psvPHP_test.dpr rename to Source/Demos/psvPHP/sample4/psvPHP_test.dpr index ad20b28..b15444a 100644 --- a/Demos/psvPHP/sample4/psvPHP_test.dpr +++ b/Source/Demos/psvPHP/sample4/psvPHP_test.dpr @@ -1,13 +1,13 @@ -program psvPHP_test; - -uses - Forms, - frm_PHPTest in 'frm_PHPTest.pas' {frmPHPTest}; - -{$R *.RES} - -begin - Application.Initialize; - Application.CreateForm(TfrmPHPTest, frmPHPTest); - Application.Run; -end. +program psvPHP_test; + +uses + Forms, + frm_PHPTest in 'frm_PHPTest.pas' {frmPHPTest}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmPHPTest, frmPHPTest); + Application.Run; +end. diff --git a/Demos/psvPHP/sample4/psvPHP_test.res b/Source/Demos/psvPHP/sample4/psvPHP_test.res similarity index 100% rename from Demos/psvPHP/sample4/psvPHP_test.res rename to Source/Demos/psvPHP/sample4/psvPHP_test.res diff --git a/ExtensionBuilder/Builder.Inc b/Source/ExtensionBuilder/Builder.Inc similarity index 96% rename from ExtensionBuilder/Builder.Inc rename to Source/ExtensionBuilder/Builder.Inc index e5a3e23..1b60723 100644 --- a/ExtensionBuilder/Builder.Inc +++ b/Source/ExtensionBuilder/Builder.Inc @@ -1,67 +1,67 @@ -{$IFNDEF VER80} {Delphi 1.0} - {$DEFINE VERSION2} {Delphi 2.0 and BCB 1 or higher} -{$ENDIF} - -{$IFDEF VERSION2} - {$IFNDEF VER90} {Delphi 2.0} - {$IFNDEF VER93} {BCB 1.0} - {$DEFINE VERSION3} {Delphi 3.0 or BCB 3.0} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION3} - {$IFNDEF VER100} {Delphi 3} - {$IFNDEF VER110} {BCB 3} - {$DEFINE VERSION4} {Delphi 4.0 or higher} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION4} - {$IFNDEF VER120} {Delphi 4} - {$IFNDEF VER125} {BCB 4} - {$DEFINE VERSION5} {Delphi 5.0 or higher} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION5} - {$IFNDEF VER130} {Delphi 5} - {$IFNDEF VER135} {BCB 5} - {$DEFINE VERSION6} {Delphi 6.0 or higher} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION6} - {$IFNDEF VER140} {Delphi 6} - {$IFNDEF VER145} {BCB 6} - {$DEFINE VERSION7} {Delphi 7.0 or higher} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION6} - {$WARN SYMBOL_PLATFORM OFF} - {$IFDEF VERSION7} - {$WARN UNIT_PLATFORM OFF} - {$WARN UNSAFE_CODE OFF} - {$WARN UNSAFE_TYPE OFF} - {$WARN UNSAFE_CAST OFF} - {$WARN UNIT_DEPRECATED OFF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION5} - {$IFNDEF VERSION6} - {$DEFINE VERSION5ONLY} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION6} -{$A8} -{ELSE} -{$A+} -{$ENDIF} - +{$IFNDEF VER80} {Delphi 1.0} + {$DEFINE VERSION2} {Delphi 2.0 and BCB 1 or higher} +{$ENDIF} + +{$IFDEF VERSION2} + {$IFNDEF VER90} {Delphi 2.0} + {$IFNDEF VER93} {BCB 1.0} + {$DEFINE VERSION3} {Delphi 3.0 or BCB 3.0} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION3} + {$IFNDEF VER100} {Delphi 3} + {$IFNDEF VER110} {BCB 3} + {$DEFINE VERSION4} {Delphi 4.0 or higher} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION4} + {$IFNDEF VER120} {Delphi 4} + {$IFNDEF VER125} {BCB 4} + {$DEFINE VERSION5} {Delphi 5.0 or higher} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION5} + {$IFNDEF VER130} {Delphi 5} + {$IFNDEF VER135} {BCB 5} + {$DEFINE VERSION6} {Delphi 6.0 or higher} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION6} + {$IFNDEF VER140} {Delphi 6} + {$IFNDEF VER145} {BCB 6} + {$DEFINE VERSION7} {Delphi 7.0 or higher} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION6} + {$WARN SYMBOL_PLATFORM OFF} + {$IFDEF VERSION7} + {$WARN UNIT_PLATFORM OFF} + {$WARN UNSAFE_CODE OFF} + {$WARN UNSAFE_TYPE OFF} + {$WARN UNSAFE_CAST OFF} + {$WARN UNIT_DEPRECATED OFF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION5} + {$IFNDEF VERSION6} + {$DEFINE VERSION5ONLY} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION6} +{$A8} +{ELSE} +{$A+} +{$ENDIF} + diff --git a/ExtensionBuilder/PHPEXT.RES b/Source/ExtensionBuilder/PHPEXT.RES similarity index 100% rename from ExtensionBuilder/PHPEXT.RES rename to Source/ExtensionBuilder/PHPEXT.RES diff --git a/ExtensionBuilder/frm_Functions.dfm b/Source/ExtensionBuilder/frm_Functions.dfm similarity index 95% rename from ExtensionBuilder/frm_Functions.dfm rename to Source/ExtensionBuilder/frm_Functions.dfm index c3459d6..cb38b1a 100644 --- a/ExtensionBuilder/frm_Functions.dfm +++ b/Source/ExtensionBuilder/frm_Functions.dfm @@ -1,54 +1,54 @@ -object frmFunctions: TfrmFunctions - Left = 414 - Top = 217 - BorderStyle = bsDialog - Caption = 'Functions' - ClientHeight = 442 - ClientWidth = 370 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False - Position = poScreenCenter - PixelsPerInch = 96 - TextHeight = 13 - object Label1: TLabel - Left = 20 - Top = 8 - Width = 259 - Height = 52 - Caption = - 'This wizard will create PHP extension project for you'#13#10#13#10'Please ' + - 'enter name of the functions you want to include'#13#10'in this project' - end - object Functions: TMemo - Left = 16 - Top = 68 - Width = 337 - Height = 319 - TabOrder = 0 - end - object btnOK: TButton - Left = 208 - Top = 408 - Width = 75 - Height = 25 - Caption = 'OK' - Default = True - ModalResult = 1 - TabOrder = 1 - end - object btnCancel: TButton - Left = 284 - Top = 408 - Width = 75 - Height = 25 - Cancel = True - Caption = 'Cancel' - ModalResult = 2 - TabOrder = 2 - end -end +object frmFunctions: TfrmFunctions + Left = 414 + Top = 217 + BorderStyle = bsDialog + Caption = 'Functions' + ClientHeight = 442 + ClientWidth = 370 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 20 + Top = 8 + Width = 259 + Height = 52 + Caption = + 'This wizard will create PHP extension project for you'#13#10#13#10'Please ' + + 'enter name of the functions you want to include'#13#10'in this project' + end + object Functions: TMemo + Left = 16 + Top = 68 + Width = 337 + Height = 319 + TabOrder = 0 + end + object btnOK: TButton + Left = 208 + Top = 408 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end + object btnCancel: TButton + Left = 284 + Top = 408 + Width = 75 + Height = 25 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 2 + end +end diff --git a/ExtensionBuilder/frm_Functions.pas b/Source/ExtensionBuilder/frm_Functions.pas similarity index 93% rename from ExtensionBuilder/frm_Functions.pas rename to Source/ExtensionBuilder/frm_Functions.pas index 4148df9..7670ff8 100644 --- a/ExtensionBuilder/frm_Functions.pas +++ b/Source/ExtensionBuilder/frm_Functions.pas @@ -1,28 +1,28 @@ -unit frm_Functions; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls; - -type - TfrmFunctions = class(TForm) - Functions: TMemo; - btnOK: TButton; - btnCancel: TButton; - Label1: TLabel; - private - { Private declarations } - public - { Public declarations } - end; - -var - frmFunctions: TfrmFunctions; - -implementation - -{$R *.DFM} - -end. +unit frm_Functions; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TfrmFunctions = class(TForm) + Functions: TMemo; + btnOK: TButton; + btnCancel: TButton; + Label1: TLabel; + private + { Private declarations } + public + { Public declarations } + end; + +var + frmFunctions: TfrmFunctions; + +implementation + +{$R *.DFM} + +end. diff --git a/ExtensionBuilder/phpExtBuilderD5.dpk b/Source/ExtensionBuilder/phpExtBuilderD5.dpk similarity index 94% rename from ExtensionBuilder/phpExtBuilderD5.dpk rename to Source/ExtensionBuilder/phpExtBuilderD5.dpk index cd504c9..892079e 100644 --- a/ExtensionBuilder/phpExtBuilderD5.dpk +++ b/Source/ExtensionBuilder/phpExtBuilderD5.dpk @@ -1,37 +1,37 @@ -package phpExtBuilderD5; - -{$R *.RES} -{$ALIGN ON} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DESCRIPTION 'PHP Extension Builder'} -{$DESIGNONLY} -{$IMPLICITBUILD OFF} - -requires - vcl50, - dsnide50; - -contains - phpExtensionBuilder in 'phpExtensionBuilder.pas', - frm_Functions in 'frm_Functions.pas' {frmFunctions}; - -end. +package phpExtBuilderD5; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'PHP Extension Builder'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl50, + dsnide50; + +contains + phpExtensionBuilder in 'phpExtensionBuilder.pas', + frm_Functions in 'frm_Functions.pas' {frmFunctions}; + +end. diff --git a/ExtensionBuilder/phpExtBuilderD5.res b/Source/ExtensionBuilder/phpExtBuilderD5.res similarity index 100% rename from ExtensionBuilder/phpExtBuilderD5.res rename to Source/ExtensionBuilder/phpExtBuilderD5.res diff --git a/ExtensionBuilder/phpExtBuilderD6.dpk b/Source/ExtensionBuilder/phpExtBuilderD6.dpk similarity index 94% rename from ExtensionBuilder/phpExtBuilderD6.dpk rename to Source/ExtensionBuilder/phpExtBuilderD6.dpk index 9036232..2042411 100644 --- a/ExtensionBuilder/phpExtBuilderD6.dpk +++ b/Source/ExtensionBuilder/phpExtBuilderD6.dpk @@ -1,37 +1,37 @@ -package phpExtBuilderD6; - -{$R *.res} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DESCRIPTION 'PHP Extension Builder'} -{$DESIGNONLY} -{$IMPLICITBUILD OFF} - -requires - vcl, - designide; - -contains - phpExtensionBuilder in 'phpExtensionBuilder.pas', - frm_Functions in 'frm_Functions.pas' {frmFunctions}; - -end. +package phpExtBuilderD6; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'PHP Extension Builder'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + designide; + +contains + phpExtensionBuilder in 'phpExtensionBuilder.pas', + frm_Functions in 'frm_Functions.pas' {frmFunctions}; + +end. diff --git a/ExtensionBuilder/phpExtBuilderD6.res b/Source/ExtensionBuilder/phpExtBuilderD6.res similarity index 100% rename from ExtensionBuilder/phpExtBuilderD6.res rename to Source/ExtensionBuilder/phpExtBuilderD6.res diff --git a/ExtensionBuilder/phpExtBuilderD7.dpk b/Source/ExtensionBuilder/phpExtBuilderD7.dpk similarity index 94% rename from ExtensionBuilder/phpExtBuilderD7.dpk rename to Source/ExtensionBuilder/phpExtBuilderD7.dpk index a7be0bd..22fc57d 100644 --- a/ExtensionBuilder/phpExtBuilderD7.dpk +++ b/Source/ExtensionBuilder/phpExtBuilderD7.dpk @@ -1,37 +1,37 @@ -package phpExtBuilderD7; - -{$R *.res} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DESCRIPTION 'PHP Extension Builder'} -{$DESIGNONLY} -{$IMPLICITBUILD OFF} - -requires - vcl, - designide; - -contains - phpExtensionBuilder in 'phpExtensionBuilder.pas', - frm_Functions in 'frm_Functions.pas' {frmFunctions}; - -end. +package phpExtBuilderD7; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'PHP Extension Builder'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + designide; + +contains + phpExtensionBuilder in 'phpExtensionBuilder.pas', + frm_Functions in 'frm_Functions.pas' {frmFunctions}; + +end. diff --git a/ExtensionBuilder/phpExtBuilderD7.res b/Source/ExtensionBuilder/phpExtBuilderD7.res similarity index 100% rename from ExtensionBuilder/phpExtBuilderD7.res rename to Source/ExtensionBuilder/phpExtBuilderD7.res diff --git a/ExtensionBuilder/phpExtensionBuilder.pas b/Source/ExtensionBuilder/phpExtensionBuilder.pas similarity index 96% rename from ExtensionBuilder/phpExtensionBuilder.pas rename to Source/ExtensionBuilder/phpExtensionBuilder.pas index 5cf9b8c..8ebe001 100644 --- a/ExtensionBuilder/phpExtensionBuilder.pas +++ b/Source/ExtensionBuilder/phpExtensionBuilder.pas @@ -1,380 +1,380 @@ -{$I Builder.INC} -unit phpExtensionBuilder; - -interface -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, - Dialogs, - {$IFDEF VERSION6} - DesignIntf, - DesignEditors, - DMForm, - {$ELSE} - dsgnintf, - dmdesigner, - {$ENDIF} - ToolsAPI, - frm_functions; - -type - - TExtensionExpert = class(TNotifierObject, IOTAWizard, IOTARepositoryWizard, IOTAFormWizard) - public - // IOTAWizard - function GetIDString: string; - function GetName: string; - function GetState: TWizardState; - procedure Execute; - // IOTARepositoryWizard - function GetAuthor: string; - function GetComment: string; - function GetPage: string; - {$IFDEF VERSION6} - function GetGlyph : cardinal; - {$ELSE} - function GetGlyph: HICON; - {$ENDIF} - end; - - TExtensionProjectCreator = class(TInterfacedObject, IOTACreator, IOTAProjectCreator) - public - // IOTACreator - function GetCreatorType: string; - function GetExisting: Boolean; - function GetFileSystem: string; - function GetOwner: IOTAModule; - function GetUnnamed: Boolean; - // IOTAProjectCreator - function GetFileName: string; - function GetOptionFileName: string; - function GetShowSource: Boolean; - procedure NewDefaultModule; - function NewOptionSource(const ProjectName: string): IOTAFile; - procedure NewProjectResource(const Project: IOTAProject); - function NewProjectSource(const ProjectName: string): IOTAFile; - end; - - TExtensionProjectSourceFile = class(TInterfacedObject, IOTAFile) - private - FSource: string; - FProjectName : string; - public - function GetSource: string; - function GetAge: TDateTime; - constructor Create(const Source: string); - constructor CreateNamedProject(AProjectName : string); - end; - -const CRLF = #13#10; - -procedure Register; - -implementation - -{$R PHPEXT.RES} - -procedure Register; -begin - RegisterPackageWizard(TExtensionExpert.Create); -end; - -function GetActiveProjectGroup: IOTAProjectGroup; -var - ModuleServices: IOTAModuleServices; - i: Integer; - -begin - Result := nil; - ModuleServices := BorlandIDEServices as IOTAModuleServices; - for i := 0 to ModuleServices.ModuleCount - 1 do - if Succeeded(ModuleServices.Modules[i].QueryInterface(IOTAProjectGroup, Result)) then - Break; -end; - -{ TExtensionExpert } - -procedure TExtensionExpert.Execute; -begin - frmFunctions := TfrmFunctions.Create(Application); - if frmFunctions.ShowModal = mrOK then - begin - (BorlandIDEServices as IOTAModuleServices).CreateModule(TExtensionProjectCreator.Create); - end; - frmFunctions.Free; -end; - -function TExtensionExpert.GetAuthor: string; -begin - Result := 'Serhiy Perevoznyk'; -end; - -function TExtensionExpert.GetComment: string; -begin - Result := 'PHP Extensions builder'; -end; - -{$IFDEF VERSION6} -function TExtensionExpert.GetGlyph: cardinal; -{$ELSE} -function TExtensionExpert.GetGlyph: HICON; -{$ENDIF} -begin - Result := LoadIcon(hInstance, 'PHPEXTWIZ'); -end; - -function TExtensionExpert.GetIDString: string; -begin - Result := '7E497181-FBF6-4070-BFD8-D98522713DE3'; -end; - -function TExtensionExpert.GetName: string; -begin - Result := 'PHP Extensions Wizard'; -end; - -function TExtensionExpert.GetPage: string; -begin - Result := 'New'; -end; - -function TExtensionExpert.GetState: TWizardState; -begin - Result := [wsEnabled]; -end; - -{ TExtensionProjectSourceFile } - -constructor TExtensionProjectSourceFile.Create(const Source: string); -begin - FSource := Source; -end; - -constructor TExtensionProjectSourceFile.CreateNamedProject( - AProjectName: string); -begin - inherited Create; - FProjectName := AProjectName; -end; - -function TExtensionProjectSourceFile.GetAge: TDateTime; -begin - Result := -1; -end; - -function TExtensionProjectSourceFile.GetSource: string; -var - S : string; - I : integer; -begin - S := 'library ' + FProjectName + ';' + CRLF + - '{$I PHP.INC}' + CRLF + - 'uses' + CRLF + - ' Windows,' + CRLF + - ' SysUtils,' + CRLF + - ' ZendAPI,' + CRLF + - ' ZendTypes,' + CRLF + - ' PHPAPI,' + CRLF + - ' PHPTypes;' + CRLF + CRLF + - '{$R *.RES}' + CRLF + CRLF + -'function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl;' + CRLF + -'begin' + CRLF + -' Result := SUCCESS;' + CRLF + -'end;' + CRLF + -'' + CRLF + -'function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl;' + CRLF + -'begin' + CRLF + -' Result := SUCCESS;' + CRLF + -'end;' + CRLF + -'' + CRLF + -'procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl;' + CRLF + -'begin' + CRLF + -' php_info_print_table_start();' + CRLF + -' php_info_print_table_row(2, PChar(''module name''), PChar(''enabled''));' + CRLF + -' php_info_print_table_end();' + CRLF + -'end;' + CRLF + -'' + CRLF + -'function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl;' + CRLF + -'begin' + CRLF + -' RESULT := SUCCESS;' + CRLF + -'end;' + CRLF + -'' + CRLF + -'function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl;' + CRLF + -'begin' + CRLF + -' RESULT := SUCCESS;' + CRLF + -'end;' + CRLF + -'' + CRLF + CRLF; - -for i := 0 to frmFunctions.Functions.Lines.Count - 1 do -begin - S := S + -'{$IFDEF PHP510}' + CRLF + -'procedure ' + LowerCase(frmFunctions.Functions.Lines[i])+' (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval;' + CRLF + -' return_value_used : integer; TSRMLS_DC : pointer); cdecl;' + CRLF + -'{$ELSE}'+ CRLF + -'procedure ' + LowerCase(frmFunctions.Functions.Lines[i])+' (ht : integer; return_value : pzval; this_ptr : pzval;' + CRLF + -' return_value_used : integer; TSRMLS_DC : pointer); cdecl;' + CRLF + -'{$ENDIF}'+ CRLF + -'var'+ CRLF + -' param : pzval_array;' + CRLF + -'begin' + CRLF + -' if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then' + CRLF + -' begin' + CRLF + -' zend_wrong_param_count(TSRMLS_DC);' + CRLF + -' Exit;' + CRLF + -' end;' + CRLF + -'' + CRLF + -' dispose_pzval_array(param);' + CRLF + -'' + CRLF + -'end;' + CRLF + CRLF; -end; - -S := S + -'var' + CRLF + -' moduleEntry : Tzend_module_entry;' + CRLF + -' module_entry_table : array[0..'+IntToStr(frmFunctions.functions.Lines.count)+'] of zend_function_entry;' + CRLF + -'' + CRLF + -'' + CRLF + -'function get_module : Pzend_module_entry; cdecl;' + CRLF + -'begin' + CRLF + -' if not PHPLoaded then' + CRLF + -' LoadPHP;' + CRLF + -' ModuleEntry.size := sizeof(Tzend_module_entry);' + CRLF + -' ModuleEntry.zend_api := ZEND_MODULE_API_NO;' + CRLF + -' ModuleEntry.zts := USING_ZTS;' + CRLF + -' ModuleEntry.Name := ''module name'';' + CRLF + -' ModuleEntry.version := ''1.0'';' + CRLF + -' ModuleEntry.module_startup_func := @minit;' + CRLF + -' ModuleEntry.module_shutdown_func := @mshutdown;' + CRLF + -' ModuleEntry.request_startup_func := @rinit;' + CRLF + -' ModuleEntry.request_shutdown_func := @rshutdown;' + CRLF + -' ModuleEntry.info_func := @php_info_module;' + CRLF + -'' + CRLF; -for i := 0 to frmFunctions.Functions.Lines.Count - 1 do - begin - S := S + -' Module_entry_table['+IntToStr(i)+'].fname := '+ QuotedStr(LowerCase(frmFunctions.Functions.Lines[i]))+';' + CRLF + -' Module_entry_table['+IntToStr(i)+'].handler := @'+frmFunctions.Functions.Lines[i]+';' + CRLF + -'' + CRLF; - end; -S := S + ' ModuleEntry.functions := @module_entry_table[0];' + CRLF + -' ModuleEntry._type := MODULE_PERSISTENT;' + CRLF + -' Result := @ModuleEntry;' + CRLF + -'end;' + CRLF + -'' + CRLF + -'' + CRLF + -'exports' + CRLF + -' get_module;' + CRLF + -'' + CRLF + -'end.'; - - Result := S; -end; - -{ TExtensionProjectCreator } - -function TExtensionProjectCreator.GetCreatorType: string; -begin - Result := sLibrary; -end; - -function TExtensionProjectCreator.GetExisting: Boolean; -begin - Result := false; -end; - -function TExtensionProjectCreator.GetFileName: string; -var - i: Integer; - j: Integer; - ProjGroup: IOTAProjectGroup; - Found: Boolean; - TempFileName: string; - TempFileName2: string; -begin - Result := GetCurrentDir + '\' + 'Project%d' + '.dpr'; { do not localize } - - ProjGroup := GetActiveProjectGroup; - - if ProjGroup <> nil then - begin - for j := 0 to ProjGroup.ProjectCount-1 do - begin - Found := False; - TempFileName2 := Format(Result, [j+1]); - - for i := 0 to ProjGroup.ProjectCount-1 do - begin - try - TempFileName := ProjGroup.Projects[i].FileName; - if {$IFDEF PHP550}CompareFileName{$ELSE}AnsiCompareFileName{$ENDIF}(ExtractFileName(TempFileName), ExtractFileName(TempFileName2)) = 0 then - begin - Found := True; - Break; - end; - except on E: Exception do - if not (E is EIntfCastError) then - raise; - end; - end; - - if not Found then - begin - Result := TempFileName2; - Exit; - end; - end; - Result := Format(Result, [ProjGroup.ProjectCount+1]); - end - else - Result := Format(Result, [1]); -end; - -function TExtensionProjectCreator.GetFileSystem: string; -begin - Result := ''; -end; - -function TExtensionProjectCreator.GetOptionFileName: string; -begin - Result := ''; -end; - -function TExtensionProjectCreator.GetOwner: IOTAModule; -begin - Result := GetActiveProjectGroup; -end; - -function TExtensionProjectCreator.GetShowSource: Boolean; -begin - Result := true; -end; - -function TExtensionProjectCreator.GetUnnamed: Boolean; -begin - Result := true; -end; - -procedure TExtensionProjectCreator.NewDefaultModule; -begin - -end; - -function TExtensionProjectCreator.NewOptionSource( - const ProjectName: string): IOTAFile; -begin - Result := nil; -end; - -procedure TExtensionProjectCreator.NewProjectResource( - const Project: IOTAProject); -begin - -end; - -function TExtensionProjectCreator.NewProjectSource( - const ProjectName: string): IOTAFile; -begin - Result := TExtensionProjectSourceFile.CreateNamedProject(ProjectName) as IOTAFile; -end; - -end. +{$I Builder.INC} +unit phpExtensionBuilder; + +interface +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, + {$IFDEF VERSION6} + DesignIntf, + DesignEditors, + DMForm, + {$ELSE} + dsgnintf, + dmdesigner, + {$ENDIF} + ToolsAPI, + frm_functions; + +type + + TExtensionExpert = class(TNotifierObject, IOTAWizard, IOTARepositoryWizard, IOTAFormWizard) + public + // IOTAWizard + function GetIDString: string; + function GetName: string; + function GetState: TWizardState; + procedure Execute; + // IOTARepositoryWizard + function GetAuthor: string; + function GetComment: string; + function GetPage: string; + {$IFDEF VERSION6} + function GetGlyph : cardinal; + {$ELSE} + function GetGlyph: HICON; + {$ENDIF} + end; + + TExtensionProjectCreator = class(TInterfacedObject, IOTACreator, IOTAProjectCreator) + public + // IOTACreator + function GetCreatorType: string; + function GetExisting: Boolean; + function GetFileSystem: string; + function GetOwner: IOTAModule; + function GetUnnamed: Boolean; + // IOTAProjectCreator + function GetFileName: string; + function GetOptionFileName: string; + function GetShowSource: Boolean; + procedure NewDefaultModule; + function NewOptionSource(const ProjectName: string): IOTAFile; + procedure NewProjectResource(const Project: IOTAProject); + function NewProjectSource(const ProjectName: string): IOTAFile; + end; + + TExtensionProjectSourceFile = class(TInterfacedObject, IOTAFile) + private + FSource: string; + FProjectName : string; + public + function GetSource: string; + function GetAge: TDateTime; + constructor Create(const Source: string); + constructor CreateNamedProject(AProjectName : string); + end; + +const CRLF = #13#10; + +procedure Register; + +implementation + +{$R PHPEXT.RES} + +procedure Register; +begin + RegisterPackageWizard(TExtensionExpert.Create); +end; + +function GetActiveProjectGroup: IOTAProjectGroup; +var + ModuleServices: IOTAModuleServices; + i: Integer; + +begin + Result := nil; + ModuleServices := BorlandIDEServices as IOTAModuleServices; + for i := 0 to ModuleServices.ModuleCount - 1 do + if Succeeded(ModuleServices.Modules[i].QueryInterface(IOTAProjectGroup, Result)) then + Break; +end; + +{ TExtensionExpert } + +procedure TExtensionExpert.Execute; +begin + frmFunctions := TfrmFunctions.Create(Application); + if frmFunctions.ShowModal = mrOK then + begin + (BorlandIDEServices as IOTAModuleServices).CreateModule(TExtensionProjectCreator.Create); + end; + frmFunctions.Free; +end; + +function TExtensionExpert.GetAuthor: string; +begin + Result := 'Serhiy Perevoznyk'; +end; + +function TExtensionExpert.GetComment: string; +begin + Result := 'PHP Extensions builder'; +end; + +{$IFDEF VERSION6} +function TExtensionExpert.GetGlyph: cardinal; +{$ELSE} +function TExtensionExpert.GetGlyph: HICON; +{$ENDIF} +begin + Result := LoadIcon(hInstance, 'PHPEXTWIZ'); +end; + +function TExtensionExpert.GetIDString: string; +begin + Result := '7E497181-FBF6-4070-BFD8-D98522713DE3'; +end; + +function TExtensionExpert.GetName: string; +begin + Result := 'PHP Extensions Wizard'; +end; + +function TExtensionExpert.GetPage: string; +begin + Result := 'New'; +end; + +function TExtensionExpert.GetState: TWizardState; +begin + Result := [wsEnabled]; +end; + +{ TExtensionProjectSourceFile } + +constructor TExtensionProjectSourceFile.Create(const Source: string); +begin + FSource := Source; +end; + +constructor TExtensionProjectSourceFile.CreateNamedProject( + AProjectName: string); +begin + inherited Create; + FProjectName := AProjectName; +end; + +function TExtensionProjectSourceFile.GetAge: TDateTime; +begin + Result := -1; +end; + +function TExtensionProjectSourceFile.GetSource: string; +var + S : string; + I : integer; +begin + S := 'library ' + FProjectName + ';' + CRLF + + '{$I PHP.INC}' + CRLF + + 'uses' + CRLF + + ' Windows,' + CRLF + + ' SysUtils,' + CRLF + + ' ZendAPI,' + CRLF + + ' ZendTypes,' + CRLF + + ' PHPAPI,' + CRLF + + ' PHPTypes;' + CRLF + CRLF + + '{$R *.RES}' + CRLF + CRLF + +'function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl;' + CRLF + +'begin' + CRLF + +' Result := SUCCESS;' + CRLF + +'end;' + CRLF + +'' + CRLF + +'function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl;' + CRLF + +'begin' + CRLF + +' Result := SUCCESS;' + CRLF + +'end;' + CRLF + +'' + CRLF + +'procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer); cdecl;' + CRLF + +'begin' + CRLF + +' php_info_print_table_start();' + CRLF + +' php_info_print_table_row(2, PChar(''module name''), PChar(''enabled''));' + CRLF + +' php_info_print_table_end();' + CRLF + +'end;' + CRLF + +'' + CRLF + +'function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl;' + CRLF + +'begin' + CRLF + +' RESULT := SUCCESS;' + CRLF + +'end;' + CRLF + +'' + CRLF + +'function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl;' + CRLF + +'begin' + CRLF + +' RESULT := SUCCESS;' + CRLF + +'end;' + CRLF + +'' + CRLF + CRLF; + +for i := 0 to frmFunctions.Functions.Lines.Count - 1 do +begin + S := S + +'{$IFDEF PHP510}' + CRLF + +'procedure ' + LowerCase(frmFunctions.Functions.Lines[i])+' (ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval;' + CRLF + +' return_value_used : integer; TSRMLS_DC : pointer); cdecl;' + CRLF + +'{$ELSE}'+ CRLF + +'procedure ' + LowerCase(frmFunctions.Functions.Lines[i])+' (ht : integer; return_value : pzval; this_ptr : pzval;' + CRLF + +' return_value_used : integer; TSRMLS_DC : pointer); cdecl;' + CRLF + +'{$ENDIF}'+ CRLF + +'var'+ CRLF + +' param : pzval_array;' + CRLF + +'begin' + CRLF + +' if ( not (zend_get_parameters_ex(ht, Param) = SUCCESS )) then' + CRLF + +' begin' + CRLF + +' zend_wrong_param_count(TSRMLS_DC);' + CRLF + +' Exit;' + CRLF + +' end;' + CRLF + +'' + CRLF + +' dispose_pzval_array(param);' + CRLF + +'' + CRLF + +'end;' + CRLF + CRLF; +end; + +S := S + +'var' + CRLF + +' moduleEntry : Tzend_module_entry;' + CRLF + +' module_entry_table : array[0..'+IntToStr(frmFunctions.functions.Lines.count)+'] of zend_function_entry;' + CRLF + +'' + CRLF + +'' + CRLF + +'function get_module : Pzend_module_entry; cdecl;' + CRLF + +'begin' + CRLF + +' if not PHPLoaded then' + CRLF + +' LoadPHP;' + CRLF + +' ModuleEntry.size := sizeof(Tzend_module_entry);' + CRLF + +' ModuleEntry.zend_api := ZEND_MODULE_API_NO;' + CRLF + +' ModuleEntry.zts := USING_ZTS;' + CRLF + +' ModuleEntry.Name := ''module name'';' + CRLF + +' ModuleEntry.version := ''1.0'';' + CRLF + +' ModuleEntry.module_startup_func := @minit;' + CRLF + +' ModuleEntry.module_shutdown_func := @mshutdown;' + CRLF + +' ModuleEntry.request_startup_func := @rinit;' + CRLF + +' ModuleEntry.request_shutdown_func := @rshutdown;' + CRLF + +' ModuleEntry.info_func := @php_info_module;' + CRLF + +'' + CRLF; +for i := 0 to frmFunctions.Functions.Lines.Count - 1 do + begin + S := S + +' Module_entry_table['+IntToStr(i)+'].fname := '+ QuotedStr(LowerCase(frmFunctions.Functions.Lines[i]))+';' + CRLF + +' Module_entry_table['+IntToStr(i)+'].handler := @'+frmFunctions.Functions.Lines[i]+';' + CRLF + +'' + CRLF; + end; +S := S + ' ModuleEntry.functions := @module_entry_table[0];' + CRLF + +' ModuleEntry._type := MODULE_PERSISTENT;' + CRLF + +' Result := @ModuleEntry;' + CRLF + +'end;' + CRLF + +'' + CRLF + +'' + CRLF + +'exports' + CRLF + +' get_module;' + CRLF + +'' + CRLF + +'end.'; + + Result := S; +end; + +{ TExtensionProjectCreator } + +function TExtensionProjectCreator.GetCreatorType: string; +begin + Result := sLibrary; +end; + +function TExtensionProjectCreator.GetExisting: Boolean; +begin + Result := false; +end; + +function TExtensionProjectCreator.GetFileName: string; +var + i: Integer; + j: Integer; + ProjGroup: IOTAProjectGroup; + Found: Boolean; + TempFileName: string; + TempFileName2: string; +begin + Result := GetCurrentDir + '\' + 'Project%d' + '.dpr'; { do not localize } + + ProjGroup := GetActiveProjectGroup; + + if ProjGroup <> nil then + begin + for j := 0 to ProjGroup.ProjectCount-1 do + begin + Found := False; + TempFileName2 := Format(Result, [j+1]); + + for i := 0 to ProjGroup.ProjectCount-1 do + begin + try + TempFileName := ProjGroup.Projects[i].FileName; + if {$IFDEF PHP550}CompareFileName{$ELSE}AnsiCompareFileName{$ENDIF}(ExtractFileName(TempFileName), ExtractFileName(TempFileName2)) = 0 then + begin + Found := True; + Break; + end; + except on E: Exception do + if not (E is EIntfCastError) then + raise; + end; + end; + + if not Found then + begin + Result := TempFileName2; + Exit; + end; + end; + Result := Format(Result, [ProjGroup.ProjectCount+1]); + end + else + Result := Format(Result, [1]); +end; + +function TExtensionProjectCreator.GetFileSystem: string; +begin + Result := ''; +end; + +function TExtensionProjectCreator.GetOptionFileName: string; +begin + Result := ''; +end; + +function TExtensionProjectCreator.GetOwner: IOTAModule; +begin + Result := GetActiveProjectGroup; +end; + +function TExtensionProjectCreator.GetShowSource: Boolean; +begin + Result := true; +end; + +function TExtensionProjectCreator.GetUnnamed: Boolean; +begin + Result := true; +end; + +procedure TExtensionProjectCreator.NewDefaultModule; +begin + +end; + +function TExtensionProjectCreator.NewOptionSource( + const ProjectName: string): IOTAFile; +begin + Result := nil; +end; + +procedure TExtensionProjectCreator.NewProjectResource( + const Project: IOTAProject); +begin + +end; + +function TExtensionProjectCreator.NewProjectSource( + const ProjectName: string): IOTAFile; +begin + Result := TExtensionProjectSourceFile.CreateNamedProject(ProjectName) as IOTAFile; +end; + +end. diff --git a/PHP.INC b/Source/PHP.INC similarity index 96% rename from PHP.INC rename to Source/PHP.INC index 183d75b..3f7ef73 100644 --- a/PHP.INC +++ b/Source/PHP.INC @@ -1,213 +1,213 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Author: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{ http://delphi32.blogspot.com } -{*******************************************************} - -{ $Id: PHP.INC,v 7.4 10/2009 delphi32 Exp $ } - -{IMPORTANT: -If you are using PHP version 4.2.x...4.3.0 please change $DEFINE PHP433 to $DEFINE PHP430 -If you are using PHP version 5.0 please change $DEFINE PHP433 to $DEFINE PHP5 or remove it -If you are using PHP version 5.0.4 please add $DEFINE PHP504 -If you are using PHP version 5.1.0 or higher please add $DEFINE PHP510 -If you are using PHP version 5.1.1 or higher please add $DEFINE PHP511 -If you are using PHP version 5.1.2 or higher please add $DEFINE PHP512 -If you are using PHP version 5.2.0 or higher please add $DEFINE PHP520 -IF you are using PHP version 5.3.0 or highre please add $DEFINE PHP530 -IF you are using PHP version 5.4.0 or highre please add $DEFINE PHP540 -IF you are using PHP version 5.5.0 or highre please add $DEFINE PHP550 -IF you are using PHP version 5.6.0 or highre please add $DEFINE PHP560 -If you are using PHP compiled via: -id, define compiler_id -VC9 COMPILER_VC9 -VC10 COMPILER_VC10 -VC11 COMPILER_VC11 -VC12 COMPILER_VC12 -VC13 COMPILER_VC13 -VC14 COMPILER_VC14 -Sorry for such complicated configuration, but PHP team does not keep -backward compatibility between PHP versions. -} - - -{.$DEFINE PHP4} -{.$DEFINE PHP430} -{.$DEFINE PHP433} -{.$DEFINE PHP435} -{.$DEFINE PHP446} - -{If you are using PHP 4 please comment $DEFINE PHP5} - -{PHP5 must be defined if you are using PHP5} -{$DEFINE PHP5} - -{For PHP5 you have to define the subversion of PHP} -{$DEFINE PHP504} -{$DEFINE PHP510} -{$DEFINE PHP511} -{$DEFINE PHP512} -{$DEFINE PHP520} -{$DEFINE PHP530} -{$DEFINE PHP540} -{$DEFINE PHP550} -{$DEFINE PHP560} - -{$IFDEF PHP530} - {$DEFINE ZEND_WIN32} - {$DEFINE PHP_COMPILER_ID} -{$ENDIF} - {$IFDEF PHP700} - {$DEFINE COMPILER_VC14} - {$DEFINE PHP560} - {$ENDIF} -{$IFDEF PHP560} - {$DEFINE PHP530} - {$DEFINE PHP540} - {$DEFINE PHP550} - {$DEFINE PHP_UNICE} - {$DEFINE ZEND_WIN32} - {$DEFINE PHP_COMPILER_ID} -{$ENDIF} -//Warning! You must select one of the compilers -//Look at the version of PHP you have installed -//I DO recommend to use php-5.6.40-Win32-VC11-x86, specially if you are using -//php4delphi component with php5ts.dll. If you are building PHP extensions, -//you have to define the right compiler, otherwise you would have incompatibility -//problems - -{$IFDEF PHP_COMPILER_ID} - {.$DEFINE COMPILER_VC6} - {$DEFINE COMPILER_VC9} - {$IFDEF PHP550} {$DEFINE COMPILER_VC11} {$ENDIF} -{$ENDIF} - -{$IFDEF PHP5} - {$UNDEF PHP4} - {$UNDEF PHP430} - {$UNDEF PHP433} - {$UNDEF PHP435} - {$UNDEF PHP446} -{$ENDIF} -{$WARN UNIT_DEPRECATED OFF} - -{.$DEFINE QUIET_LOAD} //Do not show error while loading php4ts.dll or php5ts.dll (depends from php version) - -{.$DEFINE PHP4DELPHI_AUTOLOAD} //Load php4ts.dll or php5ts.dll at initialization -{.$DEFINE PHP4DELPHI_AUTOUNLOAD} // Unload php4ts.dll or php5ts.dll at finalization - -{.$DEFINE PHP_DEBUG} - -{$DEFINE REGISTER_COLORS} //register php constants for colors - -{$IFNDEF LINUX} - {$DEFINE ZTS} {zts support} -{$ENDIF} - -{$IFNDEF VER80} {Delphi 1.0} - {$DEFINE VERSION2} {Delphi 2.0 and BCB 1 or higher} -{$ENDIF} - -{$IFDEF VERSION2} - {$IFNDEF VER90} {Delphi 2.0} - {$IFNDEF VER93} {BCB 1.0} - {$DEFINE VERSION3} {Delphi 3.0 or BCB 3.0} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION3} - {$IFNDEF VER100} {Delphi 3} - {$IFNDEF VER110} {BCB 3} - {$DEFINE VERSION4} {Delphi 4.0 or higher} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION4} - {$IFNDEF VER120} {Delphi 4} - {$IFNDEF VER125} {BCB 4} - {$DEFINE VERSION5} {Delphi 5.0 or higher} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION5} - {$IFNDEF VER130} {Delphi 5} - {$IFNDEF VER135} {BCB 5} - {$DEFINE VERSION6} {Delphi 6.0 or higher} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION6} - {$IFNDEF VER140} {Delphi 6} - {$IFNDEF VER145} {BCB 6} - {$DEFINE VERSION7} {Delphi 7.0 or higher} - {$ENDIF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION7} - {$IFNDEF VER150} {Delphi 7} - {$DEFINE VERSION9} {Delphi 2005} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION9} - {$IFNDEF VER170} {Delphi 2005} - {$DEFINE VERSION10} {Delphi 2006} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION10} - {$IFNDEF VER180} {Delphi 2006} - {$DEFINE VERSION11} {Delphi 2007} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION11} - {$IFNDEF VER185} {Delphi 2007} - {$DEFINE VERSION12} {Delphi 2009} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION12} - {$IFNDEF VERSION20} - {$DEFINE VERSION13} {Delphi 2010} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION6} - {$WARN SYMBOL_PLATFORM OFF} - {$IFDEF VERSION7} - {$WARN UNIT_PLATFORM OFF} - {$WARN UNSAFE_CODE OFF} - {$WARN UNSAFE_TYPE OFF} - {$WARN UNSAFE_CAST OFF} - {$WARN UNIT_DEPRECATED OFF} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION5} - {$IFNDEF VERSION6} - {$DEFINE VERSION5ONLY} - {$ENDIF} -{$ENDIF} - -{$IFDEF VERSION6} -{$A8} -{$ELSE} -{$A+} -{$ENDIF} - - -{$IFDEF VERSION7} -{$J+} -{$WARNINGS OFF} -{$ENDIF} +{*******************************************************} +{ PHP4Delphi } +{ PHP - Delphi interface } +{ } +{ Author: } +{ Serhiy Perevoznyk } +{ serge_perevoznyk@hotmail.com } +{ http://users.chello.be/ws36637 } +{ http://delphi32.blogspot.com } +{*******************************************************} + +{ $Id: PHP.INC,v 7.4 10/2009 delphi32 Exp $ } + +{IMPORTANT: +If you are using PHP version 4.2.x...4.3.0 please change $DEFINE PHP433 to $DEFINE PHP430 +If you are using PHP version 5.0 please change $DEFINE PHP433 to $DEFINE PHP5 or remove it +If you are using PHP version 5.0.4 please add $DEFINE PHP504 +If you are using PHP version 5.1.0 or higher please add $DEFINE PHP510 +If you are using PHP version 5.1.1 or higher please add $DEFINE PHP511 +If you are using PHP version 5.1.2 or higher please add $DEFINE PHP512 +If you are using PHP version 5.2.0 or higher please add $DEFINE PHP520 +IF you are using PHP version 5.3.0 or highre please add $DEFINE PHP530 +IF you are using PHP version 5.4.0 or highre please add $DEFINE PHP540 +IF you are using PHP version 5.5.0 or highre please add $DEFINE PHP550 +IF you are using PHP version 5.6.0 or highre please add $DEFINE PHP560 +If you are using PHP compiled via: +id, define compiler_id +VC9 COMPILER_VC9 +VC10 COMPILER_VC10 +VC11 COMPILER_VC11 +VC12 COMPILER_VC12 +VC13 COMPILER_VC13 +VC14 COMPILER_VC14 +Sorry for such complicated configuration, but PHP team does not keep +backward compatibility between PHP versions. +} + + +{.$DEFINE PHP4} +{.$DEFINE PHP430} +{.$DEFINE PHP433} +{.$DEFINE PHP435} +{.$DEFINE PHP446} + +{If you are using PHP 4 please comment $DEFINE PHP5} + +{PHP5 must be defined if you are using PHP5} +{$DEFINE PHP5} + +{For PHP5 you have to define the subversion of PHP} +{$DEFINE PHP504} +{$DEFINE PHP510} +{$DEFINE PHP511} +{$DEFINE PHP512} +{$DEFINE PHP520} +{$DEFINE PHP530} +{$DEFINE PHP540} +{$DEFINE PHP550} +{$DEFINE PHP560} + +{$IFDEF PHP530} + {$DEFINE ZEND_WIN32} + {$DEFINE PHP_COMPILER_ID} +{$ENDIF} + {$IFDEF PHP700} + {$DEFINE COMPILER_VC14} + {$DEFINE PHP560} + {$ENDIF} +{$IFDEF PHP560} + {$DEFINE PHP530} + {$DEFINE PHP540} + {$DEFINE PHP550} + {$DEFINE PHP_UNICE} + {$DEFINE ZEND_WIN32} + {$DEFINE PHP_COMPILER_ID} +{$ENDIF} +//Warning! You must select one of the compilers +//Look at the version of PHP you have installed +//I DO recommend to use php-5.6.40-Win32-VC11-x86, specially if you are using +//php4delphi component with php5ts.dll. If you are building PHP extensions, +//you have to define the right compiler, otherwise you would have incompatibility +//problems + +{$IFDEF PHP_COMPILER_ID} + {.$DEFINE COMPILER_VC6} + {$DEFINE COMPILER_VC9} + {$IFDEF PHP550} {$DEFINE COMPILER_VC11} {$ENDIF} +{$ENDIF} + +{$IFDEF PHP5} + {$UNDEF PHP4} + {$UNDEF PHP430} + {$UNDEF PHP433} + {$UNDEF PHP435} + {$UNDEF PHP446} +{$ENDIF} +{$WARN UNIT_DEPRECATED OFF} + +{.$DEFINE QUIET_LOAD} //Do not show error while loading php4ts.dll or php5ts.dll (depends from php version) + +{.$DEFINE PHP4DELPHI_AUTOLOAD} //Load php4ts.dll or php5ts.dll at initialization +{.$DEFINE PHP4DELPHI_AUTOUNLOAD} // Unload php4ts.dll or php5ts.dll at finalization + +{.$DEFINE PHP_DEBUG} + +{$DEFINE REGISTER_COLORS} //register php constants for colors + +{$IFNDEF LINUX} + {$DEFINE ZTS} {zts support} +{$ENDIF} + +{$IFNDEF VER80} {Delphi 1.0} + {$DEFINE VERSION2} {Delphi 2.0 and BCB 1 or higher} +{$ENDIF} + +{$IFDEF VERSION2} + {$IFNDEF VER90} {Delphi 2.0} + {$IFNDEF VER93} {BCB 1.0} + {$DEFINE VERSION3} {Delphi 3.0 or BCB 3.0} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION3} + {$IFNDEF VER100} {Delphi 3} + {$IFNDEF VER110} {BCB 3} + {$DEFINE VERSION4} {Delphi 4.0 or higher} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION4} + {$IFNDEF VER120} {Delphi 4} + {$IFNDEF VER125} {BCB 4} + {$DEFINE VERSION5} {Delphi 5.0 or higher} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION5} + {$IFNDEF VER130} {Delphi 5} + {$IFNDEF VER135} {BCB 5} + {$DEFINE VERSION6} {Delphi 6.0 or higher} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION6} + {$IFNDEF VER140} {Delphi 6} + {$IFNDEF VER145} {BCB 6} + {$DEFINE VERSION7} {Delphi 7.0 or higher} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION7} + {$IFNDEF VER150} {Delphi 7} + {$DEFINE VERSION9} {Delphi 2005} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION9} + {$IFNDEF VER170} {Delphi 2005} + {$DEFINE VERSION10} {Delphi 2006} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION10} + {$IFNDEF VER180} {Delphi 2006} + {$DEFINE VERSION11} {Delphi 2007} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION11} + {$IFNDEF VER185} {Delphi 2007} + {$DEFINE VERSION12} {Delphi 2009} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION12} + {$IFNDEF VERSION20} + {$DEFINE VERSION13} {Delphi 2010} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION6} + {$WARN SYMBOL_PLATFORM OFF} + {$IFDEF VERSION7} + {$WARN UNIT_PLATFORM OFF} + {$WARN UNSAFE_CODE OFF} + {$WARN UNSAFE_TYPE OFF} + {$WARN UNSAFE_CAST OFF} + {$WARN UNIT_DEPRECATED OFF} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION5} + {$IFNDEF VERSION6} + {$DEFINE VERSION5ONLY} + {$ENDIF} +{$ENDIF} + +{$IFDEF VERSION6} +{$A8} +{$ELSE} +{$A+} +{$ENDIF} + + +{$IFDEF VERSION7} +{$J+} +{$WARNINGS OFF} +{$ENDIF} diff --git a/PHP4DelphiD2006.bdsproj b/Source/PHP4DelphiD2006.bdsproj similarity index 100% rename from PHP4DelphiD2006.bdsproj rename to Source/PHP4DelphiD2006.bdsproj diff --git a/PHP4DelphiD2006.dpk b/Source/PHP4DelphiD2006.dpk similarity index 95% rename from PHP4DelphiD2006.dpk rename to Source/PHP4DelphiD2006.dpk index ee63fa4..35082b9 100644 --- a/PHP4DelphiD2006.dpk +++ b/Source/PHP4DelphiD2006.dpk @@ -1,48 +1,48 @@ package php4DelphiD2006; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi (design-time)'} -{$DESIGNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (design-time)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + rrequires - rtl, - vcl, - designide, - vclactnband, - vclx, - php4DelphiR2006; - + rtl, + vcl, + designide, + vclactnband, + vclx, + php4DelphiR2006; + ocontains - PHPProjectWizard in 'PHPProjectWizard.pas', - php4DelphiReg in 'php4DelphiReg.pas', - php4DelphiWeb in 'php4DelphiWeb.pas', - phpWeb in 'phpWeb.pas', - phpAbout in 'phpAbout.pas' {dlgAbout}; - + PHPProjectWizard in 'PHPProjectWizard.pas', + php4DelphiReg in 'php4DelphiReg.pas', + php4DelphiWeb in 'php4DelphiWeb.pas', + phpWeb in 'phpWeb.pas', + phpAbout in 'phpAbout.pas' {dlgAbout}; + d. diff --git a/PHP4DelphiD2006.dproj b/Source/PHP4DelphiD2006.dproj similarity index 100% rename from PHP4DelphiD2006.dproj rename to Source/PHP4DelphiD2006.dproj diff --git a/PHP4DelphiD2006.dproj.local b/Source/PHP4DelphiD2006.dproj.local similarity index 100% rename from PHP4DelphiD2006.dproj.local rename to Source/PHP4DelphiD2006.dproj.local diff --git a/PHP4DelphiD2006.res b/Source/PHP4DelphiD2006.res similarity index 100% rename from PHP4DelphiD2006.res rename to Source/PHP4DelphiD2006.res diff --git a/PHP4DelphiD2006.stat b/Source/PHP4DelphiD2006.stat similarity index 100% rename from PHP4DelphiD2006.stat rename to Source/PHP4DelphiD2006.stat diff --git a/PHP4DelphiD2006_Icon.ico b/Source/PHP4DelphiD2006_Icon.ico similarity index 100% rename from PHP4DelphiD2006_Icon.ico rename to Source/PHP4DelphiD2006_Icon.ico diff --git a/PHPAPI.pas b/Source/PHPAPI.pas similarity index 99% rename from PHPAPI.pas rename to Source/PHPAPI.pas index ca2662a..e5fcffc 100644 --- a/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -122,9 +122,9 @@ interface php_ob_init_conflict: function (handler_new : PAnsiChar; handler_set : PAnsiChar; TSRMLS_DC : pointer) : integer; cdecl; {$ENDIF} -//php_output.h - - +//php_output.h + + function GetSymbolsTable : PHashTable; function GetTrackHash(Name : AnsiString) : PHashTable; @@ -258,36 +258,36 @@ function FloatToValue(Value: Extended): AnsiString; function ValueToFloat(Value : AnsiString) : extended; -var -php_print_info: procedure (flag : Integer; TSRMLS_DC : pointer); cdecl; - - -php_info_print_table_colspan_header: procedure (num_cols : Integer; - header : PAnsiChar); cdecl; - -php_info_print_box_start: procedure (bg : Integer); cdecl; - -php_info_print_box_end: procedure; cdecl; - -php_info_print_hr: procedure; cdecl; - -php_info_print_table_start: procedure; cdecl; -php_info_print_table_row1: procedure(n1 : integer; c1: PAnsiChar); cdecl; -php_info_print_table_row2: procedure (n2 : integer; c1, c2 : PAnsiChar); cdecl; -php_info_print_table_row3: procedure (n3 : integer; c1, c2, c3 : PAnsiChar); cdecl; -php_info_print_table_row4: procedure (n4 : integer; c1, c2, c3, c4 : PAnsiChar); cdecl; -php_info_print_table_row : procedure (n2 : integer; c1, c2 : pAnsiChar); cdecl; - -php_info_print_table_end: procedure (); cdecl; - -php_body_write: function (const str : PAnsiChar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; -php_header_write: function (const str : PAnsiChar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; - - -php_header: function() : integer; cdecl; -php_setcookie: function (name : PAnsiChar; name_len : integer; value : PAnsiChar; value_len: integer; - expires : longint; path : PAnsiChar; path_len : integer; domain : PAnsiChar; domain_len : integer; - secure : integer; TSRMLS_DC : pointer) : integer; cdecl; +var +php_print_info: procedure (flag : Integer; TSRMLS_DC : pointer); cdecl; + + +php_info_print_table_colspan_header: procedure (num_cols : Integer; + header : PAnsiChar); cdecl; + +php_info_print_box_start: procedure (bg : Integer); cdecl; + +php_info_print_box_end: procedure; cdecl; + +php_info_print_hr: procedure; cdecl; + +php_info_print_table_start: procedure; cdecl; +php_info_print_table_row1: procedure(n1 : integer; c1: PAnsiChar); cdecl; +php_info_print_table_row2: procedure (n2 : integer; c1, c2 : PAnsiChar); cdecl; +php_info_print_table_row3: procedure (n3 : integer; c1, c2, c3 : PAnsiChar); cdecl; +php_info_print_table_row4: procedure (n4 : integer; c1, c2, c3, c4 : PAnsiChar); cdecl; +php_info_print_table_row : procedure (n2 : integer; c1, c2 : pAnsiChar); cdecl; + +php_info_print_table_end: procedure (); cdecl; + +php_body_write: function (const str : PAnsiChar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; +php_header_write: function (const str : PAnsiChar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; + + +php_header: function() : integer; cdecl; +php_setcookie: function (name : PAnsiChar; name_len : integer; value : PAnsiChar; value_len: integer; + expires : longint; path : PAnsiChar; path_len : integer; domain : PAnsiChar; domain_len : integer; + secure : integer; TSRMLS_DC : pointer) : integer; cdecl; @@ -403,26 +403,26 @@ function GetSAPIGlobals : Psapi_globals_struct; end; end; function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; -var - sapi_global_id : pointer; - sapi_globals_value : integer; - sapi_globals : Psapi_globals_struct; - -begin - Result := nil; - sapi_global_id := GetProcAddress(PHPLib, 'sapi_globals_id'); - if Assigned(sapi_global_id) then - begin - sapi_globals_value := integer(sapi_global_id^); - asm - mov ecx, sapi_globals_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov sapi_globals, ecx - end; - Result := sapi_globals; - end; +var + sapi_global_id : pointer; + sapi_globals_value : integer; + sapi_globals : Psapi_globals_struct; + +begin + Result := nil; + sapi_global_id := GetProcAddress(PHPLib, 'sapi_globals_id'); + if Assigned(sapi_global_id) then + begin + sapi_globals_value := integer(sapi_global_id^); + asm + mov ecx, sapi_globals_value + mov edx, dword ptr tsrmls_dc + mov eax, dword ptr [edx] + mov ecx, dword ptr [eax+ecx*4-4] + mov sapi_globals, ecx + end; + Result := sapi_globals; + end; end; function zval2variant(value : zval) : variant; @@ -439,49 +439,49 @@ function zval2variant(value : zval) : variant; end; function GetStringOf(const V: TVarData): string; - begin - case V.VType of - varEmpty, varNull: - Result := ''; - varSmallInt: - Result := IntToStr(V.VSmallInt); - varInteger: - Result := IntToStr(V.VInteger); - varSingle: - Result := FloatToStr(V.VSingle); - varDouble: - Result := FloatToStr(V.VDouble); - varCurrency: - Result := CurrToStr(V.VCurrency); - varDate: - Result := DateTimeToStr(V.VDate); - varOleStr: - Result := V.VOleStr; - varBoolean: - Result := BoolToStr(V.VBoolean, true); - varByte: - Result := IntToStr(V.VByte); - varWord: - Result := IntToStr(V.VWord); - varShortInt: - Result := IntToStr(V.VShortInt); - varLongWord: - Result := IntToStr(V.VLongWord); - varInt64: - Result := IntToStr(V.VInt64); - varString: - Result := string(V.VString); - {$IFDEF SUPPORTS_UNICODE_STRING} - varUString: - Result := string(V.VUString); - {$ENDIF SUPPORTS_UNICODE_STRING} - {varArray, - varDispatch, - varError, - varUnknown, - varAny, - varByRef:} - end; + begin + case V.VType of + varEmpty, varNull: + Result := ''; + varSmallInt: + Result := IntToStr(V.VSmallInt); + varInteger: + Result := IntToStr(V.VInteger); + varSingle: + Result := FloatToStr(V.VSingle); + varDouble: + Result := FloatToStr(V.VDouble); + varCurrency: + Result := CurrToStr(V.VCurrency); + varDate: + Result := DateTimeToStr(V.VDate); + varOleStr: + Result := V.VOleStr; + varBoolean: + Result := BoolToStr(V.VBoolean, true); + varByte: + Result := IntToStr(V.VByte); + varWord: + Result := IntToStr(V.VWord); + varShortInt: + Result := IntToStr(V.VShortInt); + varLongWord: + Result := IntToStr(V.VLongWord); + varInt64: + Result := IntToStr(V.VInt64); + varString: + Result := string(V.VString); + {$IFDEF SUPPORTS_UNICODE_STRING} + varUString: + Result := string(V.VUString); + {$ENDIF SUPPORTS_UNICODE_STRING} + {varArray, + varDispatch, + varError, + varUnknown, + varAny, + varByRef:} + end; end; @@ -604,224 +604,224 @@ procedure php_end_implicit_flush(TSRMLS_D : pointer); {$ENDIF} -function LoadPHP(const DllFileName: AnsiString = PHPWin) : boolean; - -begin - Result := false; - if not PHPLoaded then - begin - if not LoadZend(DllFileName) then - Exit; - end; - - sapi_globals_id := GetProcAddress(PHPLib, 'sapi_globals_id'); - - core_globals_id := GetProcAddress(PHPLib, 'core_globals_id'); - - php_default_post_reader := GetProcAddress(PHPLib, 'php_default_post_reader'); - - sapi_add_header_ex := GetProcAddress(PHPLib, 'sapi_add_header_ex'); - - php_request_startup := GetProcAddress(PHPLib, 'php_request_startup'); - - php_request_shutdown := GetProcAddress(PHPLib, 'php_request_shutdown'); - - php_module_startup := GetProcAddress(PHPLib, 'php_module_startup'); - - php_module_shutdown := GetProcAddress(PHPLib, 'php_module_shutdown'); - - php_module_shutdown_wrapper := GetProcAddress(PHPLib, 'php_module_shutdown_wrapper'); - - sapi_startup := GetProcAddress(PHPLib, 'sapi_startup'); - - sapi_shutdown := GetProcAddress(PHPLib, 'sapi_shutdown'); - - sapi_activate := GetProcAddress(PHPLib, 'sapi_activate'); - - sapi_deactivate := GetProcAddress(PHPLib, 'sapi_deactivate'); - - php_execute_script := GetProcAddress(PHPLib, 'php_execute_script'); - - php_handle_aborted_connection := GetProcAddress(PHPLib, 'php_handle_aborted_connection'); - - php_register_variable := GetProcAddress(PHPLib, 'php_register_variable'); - - php_register_variable_safe := GetProcAddress(PHPLib, 'php_register_variable_safe'); - - php_register_variable_ex := GetProcAddress(PHPLib, 'php_register_variable_ex'); - - php_output_startup := GetProcAddress(PHPLib, 'php_output_startup'); - - php_output_activate := GetProcAddress(PHPLib, 'php_output_activate'); - - php_output_set_status := GetProcAddress(PHPLib, 'php_output_set_status'); - - php_output_register_constants := GetProcAddress(PHPLib, 'php_output_register_constants'); - {$IFDEF PHP540} - php_start_ob_buffer := GetProcAddress(PHPLib, 'php_output_start_user'); - - php_start_ob_buffer_named := GetProcAddress(PHPLib, 'php_output_start_internal'); - - php_end_ob_buffer := GetProcAddress(PHPLib, 'php_output_end'); - - php_end_ob_buffers := GetProcAddress(PHPLib, 'php_output_end_all'); - - php_ob_get_buffer := GetProcAddress(PHPLib, 'php_output_get_contents'); - - php_ob_get_length := GetProcAddress(PHPLib, 'php_output_get_length'); - - php_output_set_implicit_flush :=GetProcAddress(PHPLib, 'php_output_set_implicit_flush'); - - php_get_output_start_filename := GetProcAddress(PHPLib, 'php_output_get_start_filename'); - - php_get_output_start_lineno := GetProcAddress(PHPLib, 'php_output_get_start_lineno'); - - php_output_handler_started := GetProcAddress(PHPLib, 'php_output_handler_started'); - {$ELSE} - php_start_ob_buffer := GetProcAddress(PHPLib, 'php_start_ob_buffer'); - - php_start_ob_buffer_named := GetProcAddress(PHPLib, 'php_start_ob_buffer_named'); - - php_end_ob_buffer := GetProcAddress(PHPLib, 'php_end_ob_buffer'); - - php_end_ob_buffers := GetProcAddress(PHPLib, 'php_end_ob_buffers'); - - php_ob_get_buffer := GetProcAddress(PHPLib, 'php_ob_get_buffer'); - - php_ob_get_length := GetProcAddress(PHPLib, 'php_ob_get_length'); - - php_start_implicit_flush := GetProcAddress(PHPLib, 'php_start_implicit_flush'); - - php_end_implicit_flush := GetProcAddress(PHPLib, 'php_end_implicit_flush'); - - php_get_output_start_filename := GetProcAddress(PHPLib, 'php_get_output_start_filename'); - - php_get_output_start_lineno := GetProcAddress(PHPLib, 'php_get_output_start_lineno'); - - php_ob_handler_used := GetProcAddress(PHPLib, 'php_ob_handler_used'); -{$ENDIF} - - php_ob_init_conflict := GetProcAddress(PHPLib, 'php_ob_init_conflict'); - - php_strtoupper := GetProcAddress(PHPLib, 'php_strtoupper'); - - php_strtolower := GetProcAddress(PHPLib, 'php_strtolower'); - - php_strtr := GetProcAddress(PHPLib, 'php_strtr'); - - php_stripcslashes := GetProcAddress(PHPLib, 'php_stripcslashes'); - - php_basename := GetProcAddress(PHPLib, 'php_basename'); - - php_dirname := GetProcAddress(PHPLib, 'php_dirname'); - - php_stristr := GetProcAddress(PHPLib, 'php_stristr'); - - php_str_to_str := GetProcAddress(PHPLib, 'php_str_to_str'); - - php_strip_tags := GetProcAddress(PHPLib, 'php_strip_tags'); - - php_implode := GetProcAddress(PHPLib, 'php_implode'); - - php_explode := GetProcAddress(PHPLib, 'php_explode'); - - php_info_html_esc := GetProcAddress(PHPLib, 'php_info_html_esc'); - - php_print_info_htmlhead := GetProcAddress(PHPLib, 'php_print_info_htmlhead'); - - php_print_info := GetProcAddress(PHPLib, 'php_print_info'); - - php_info_print_table_colspan_header := GetProcAddress(PHPLib, 'php_info_print_table_colspan_header'); - - php_info_print_box_start := GetProcAddress(PHPLib, 'php_info_print_box_start'); - - php_info_print_box_end := GetProcAddress(PHPLib, 'php_info_print_box_end'); - - php_info_print_hr := GetProcAddress(PHPLib, 'php_info_print_hr'); - - php_info_print_table_start := GetProcAddress(PHPLib, 'php_info_print_table_start'); - - php_info_print_table_row1 := GetProcAddress(PHPLib, 'php_info_print_table_row'); - - php_info_print_table_row2 := GetProcAddress(PHPLib, 'php_info_print_table_row'); - - php_info_print_table_row3 := GetProcAddress(PHPLib, 'php_info_print_table_row'); - - php_info_print_table_row4 := GetProcAddress(PHPLib, 'php_info_print_table_row'); - - php_info_print_table_row := GetProcAddress(PHPLib, 'php_info_print_table_row'); - - php_info_print_table_end := GetProcAddress(PHPLib, 'php_info_print_table_end'); - - php_body_write := GetProcAddress(PHPLib, 'php_body_write'); - - php_header_write := GetProcAddress(PHPLib, 'php_header_write'); - - php_log_err := GetProcAddress(PHPLib, 'php_log_err'); - - php_html_puts := GetProcAddress(PHPLib, 'php_html_puts'); - - _php_error_log := GetProcAddress(PHPLib, '_php_error_log'); - - php_print_credits := GetProcAddress(PHPLib, 'php_print_credits'); - - php_info_print_css := GetProcAddress(PHPLib, 'php_info_print_css'); - - php_set_sock_blocking := GetProcAddress(PHPLib, 'php_set_sock_blocking'); - - php_copy_file := GetProcAddress(PHPLib, 'php_copy_file'); - - {$IFDEF PHP4} - php_flock := GetProcAddress(PHPLib, 'php_flock'); - php_lookup_hostname := GetProcAddress(PHPLib, 'php_lookup_hostname'); - {$ENDIF} - - - php_header := GetProcAddress(PHPLib, 'php_header'); - - php_setcookie := GetProcAddress(PHPLib, 'php_setcookie'); - - php_escape_html_entities := GetProcAddress(PHPLib, 'php_escape_html_entities'); - - php_ini_long := GetProcAddress(PHPLib, 'zend_ini_long'); - - php_ini_double := GetProcAddress(PHPLib, 'zend_ini_double'); - - php_ini_string := GetProcAddress(PHPLib, 'zend_ini_string'); - - php_url_free := GetProcAddress(PHPLib, 'php_url_free'); - - php_url_parse := GetProcAddress(PHPLib, 'php_url_parse'); - - php_url_decode := GetProcAddress(PHPLib, 'php_url_decode'); - - php_raw_url_decode := GetProcAddress(PHPLib, 'php_raw_url_decode'); - - php_url_encode := GetProcAddress(PHPLib, 'php_url_encode'); - - php_raw_url_encode := GetProcAddress(PHPLib, 'php_raw_url_encode'); - - {$IFDEF PHP510} - php_register_extensions := GetProcAddress(PHPLib, 'php_register_extensions'); - {$ELSE} - php_startup_extensions := GetProcAddress(PHPLib, 'php_startup_extensions'); - {$ENDIF} - - php_error_docref0 := GetProcAddress(PHPLib, 'php_error_docref0'); - - php_error_docref := GetProcAddress(PHPLib, 'php_error_docref0'); - - php_error_docref1 := GetProcAddress(PHPLib, 'php_error_docref1'); - - php_error_docref2 := GetProcAddress(PHPLib, 'php_error_docref2'); - - - - {$IFNDEF QUIET_LOAD} - CheckPHPErrors; - {$ENDIF} - - Result := true; +function LoadPHP(const DllFileName: AnsiString = PHPWin) : boolean; + +begin + Result := false; + if not PHPLoaded then + begin + if not LoadZend(DllFileName) then + Exit; + end; + + sapi_globals_id := GetProcAddress(PHPLib, 'sapi_globals_id'); + + core_globals_id := GetProcAddress(PHPLib, 'core_globals_id'); + + php_default_post_reader := GetProcAddress(PHPLib, 'php_default_post_reader'); + + sapi_add_header_ex := GetProcAddress(PHPLib, 'sapi_add_header_ex'); + + php_request_startup := GetProcAddress(PHPLib, 'php_request_startup'); + + php_request_shutdown := GetProcAddress(PHPLib, 'php_request_shutdown'); + + php_module_startup := GetProcAddress(PHPLib, 'php_module_startup'); + + php_module_shutdown := GetProcAddress(PHPLib, 'php_module_shutdown'); + + php_module_shutdown_wrapper := GetProcAddress(PHPLib, 'php_module_shutdown_wrapper'); + + sapi_startup := GetProcAddress(PHPLib, 'sapi_startup'); + + sapi_shutdown := GetProcAddress(PHPLib, 'sapi_shutdown'); + + sapi_activate := GetProcAddress(PHPLib, 'sapi_activate'); + + sapi_deactivate := GetProcAddress(PHPLib, 'sapi_deactivate'); + + php_execute_script := GetProcAddress(PHPLib, 'php_execute_script'); + + php_handle_aborted_connection := GetProcAddress(PHPLib, 'php_handle_aborted_connection'); + + php_register_variable := GetProcAddress(PHPLib, 'php_register_variable'); + + php_register_variable_safe := GetProcAddress(PHPLib, 'php_register_variable_safe'); + + php_register_variable_ex := GetProcAddress(PHPLib, 'php_register_variable_ex'); + + php_output_startup := GetProcAddress(PHPLib, 'php_output_startup'); + + php_output_activate := GetProcAddress(PHPLib, 'php_output_activate'); + + php_output_set_status := GetProcAddress(PHPLib, 'php_output_set_status'); + + php_output_register_constants := GetProcAddress(PHPLib, 'php_output_register_constants'); + {$IFDEF PHP540} + php_start_ob_buffer := GetProcAddress(PHPLib, 'php_output_start_user'); + + php_start_ob_buffer_named := GetProcAddress(PHPLib, 'php_output_start_internal'); + + php_end_ob_buffer := GetProcAddress(PHPLib, 'php_output_end'); + + php_end_ob_buffers := GetProcAddress(PHPLib, 'php_output_end_all'); + + php_ob_get_buffer := GetProcAddress(PHPLib, 'php_output_get_contents'); + + php_ob_get_length := GetProcAddress(PHPLib, 'php_output_get_length'); + + php_output_set_implicit_flush :=GetProcAddress(PHPLib, 'php_output_set_implicit_flush'); + + php_get_output_start_filename := GetProcAddress(PHPLib, 'php_output_get_start_filename'); + + php_get_output_start_lineno := GetProcAddress(PHPLib, 'php_output_get_start_lineno'); + + php_output_handler_started := GetProcAddress(PHPLib, 'php_output_handler_started'); + {$ELSE} + php_start_ob_buffer := GetProcAddress(PHPLib, 'php_start_ob_buffer'); + + php_start_ob_buffer_named := GetProcAddress(PHPLib, 'php_start_ob_buffer_named'); + + php_end_ob_buffer := GetProcAddress(PHPLib, 'php_end_ob_buffer'); + + php_end_ob_buffers := GetProcAddress(PHPLib, 'php_end_ob_buffers'); + + php_ob_get_buffer := GetProcAddress(PHPLib, 'php_ob_get_buffer'); + + php_ob_get_length := GetProcAddress(PHPLib, 'php_ob_get_length'); + + php_start_implicit_flush := GetProcAddress(PHPLib, 'php_start_implicit_flush'); + + php_end_implicit_flush := GetProcAddress(PHPLib, 'php_end_implicit_flush'); + + php_get_output_start_filename := GetProcAddress(PHPLib, 'php_get_output_start_filename'); + + php_get_output_start_lineno := GetProcAddress(PHPLib, 'php_get_output_start_lineno'); + + php_ob_handler_used := GetProcAddress(PHPLib, 'php_ob_handler_used'); +{$ENDIF} + + php_ob_init_conflict := GetProcAddress(PHPLib, 'php_ob_init_conflict'); + + php_strtoupper := GetProcAddress(PHPLib, 'php_strtoupper'); + + php_strtolower := GetProcAddress(PHPLib, 'php_strtolower'); + + php_strtr := GetProcAddress(PHPLib, 'php_strtr'); + + php_stripcslashes := GetProcAddress(PHPLib, 'php_stripcslashes'); + + php_basename := GetProcAddress(PHPLib, 'php_basename'); + + php_dirname := GetProcAddress(PHPLib, 'php_dirname'); + + php_stristr := GetProcAddress(PHPLib, 'php_stristr'); + + php_str_to_str := GetProcAddress(PHPLib, 'php_str_to_str'); + + php_strip_tags := GetProcAddress(PHPLib, 'php_strip_tags'); + + php_implode := GetProcAddress(PHPLib, 'php_implode'); + + php_explode := GetProcAddress(PHPLib, 'php_explode'); + + php_info_html_esc := GetProcAddress(PHPLib, 'php_info_html_esc'); + + php_print_info_htmlhead := GetProcAddress(PHPLib, 'php_print_info_htmlhead'); + + php_print_info := GetProcAddress(PHPLib, 'php_print_info'); + + php_info_print_table_colspan_header := GetProcAddress(PHPLib, 'php_info_print_table_colspan_header'); + + php_info_print_box_start := GetProcAddress(PHPLib, 'php_info_print_box_start'); + + php_info_print_box_end := GetProcAddress(PHPLib, 'php_info_print_box_end'); + + php_info_print_hr := GetProcAddress(PHPLib, 'php_info_print_hr'); + + php_info_print_table_start := GetProcAddress(PHPLib, 'php_info_print_table_start'); + + php_info_print_table_row1 := GetProcAddress(PHPLib, 'php_info_print_table_row'); + + php_info_print_table_row2 := GetProcAddress(PHPLib, 'php_info_print_table_row'); + + php_info_print_table_row3 := GetProcAddress(PHPLib, 'php_info_print_table_row'); + + php_info_print_table_row4 := GetProcAddress(PHPLib, 'php_info_print_table_row'); + + php_info_print_table_row := GetProcAddress(PHPLib, 'php_info_print_table_row'); + + php_info_print_table_end := GetProcAddress(PHPLib, 'php_info_print_table_end'); + + php_body_write := GetProcAddress(PHPLib, 'php_body_write'); + + php_header_write := GetProcAddress(PHPLib, 'php_header_write'); + + php_log_err := GetProcAddress(PHPLib, 'php_log_err'); + + php_html_puts := GetProcAddress(PHPLib, 'php_html_puts'); + + _php_error_log := GetProcAddress(PHPLib, '_php_error_log'); + + php_print_credits := GetProcAddress(PHPLib, 'php_print_credits'); + + php_info_print_css := GetProcAddress(PHPLib, 'php_info_print_css'); + + php_set_sock_blocking := GetProcAddress(PHPLib, 'php_set_sock_blocking'); + + php_copy_file := GetProcAddress(PHPLib, 'php_copy_file'); + + {$IFDEF PHP4} + php_flock := GetProcAddress(PHPLib, 'php_flock'); + php_lookup_hostname := GetProcAddress(PHPLib, 'php_lookup_hostname'); + {$ENDIF} + + + php_header := GetProcAddress(PHPLib, 'php_header'); + + php_setcookie := GetProcAddress(PHPLib, 'php_setcookie'); + + php_escape_html_entities := GetProcAddress(PHPLib, 'php_escape_html_entities'); + + php_ini_long := GetProcAddress(PHPLib, 'zend_ini_long'); + + php_ini_double := GetProcAddress(PHPLib, 'zend_ini_double'); + + php_ini_string := GetProcAddress(PHPLib, 'zend_ini_string'); + + php_url_free := GetProcAddress(PHPLib, 'php_url_free'); + + php_url_parse := GetProcAddress(PHPLib, 'php_url_parse'); + + php_url_decode := GetProcAddress(PHPLib, 'php_url_decode'); + + php_raw_url_decode := GetProcAddress(PHPLib, 'php_raw_url_decode'); + + php_url_encode := GetProcAddress(PHPLib, 'php_url_encode'); + + php_raw_url_encode := GetProcAddress(PHPLib, 'php_raw_url_encode'); + + {$IFDEF PHP510} + php_register_extensions := GetProcAddress(PHPLib, 'php_register_extensions'); + {$ELSE} + php_startup_extensions := GetProcAddress(PHPLib, 'php_startup_extensions'); + {$ENDIF} + + php_error_docref0 := GetProcAddress(PHPLib, 'php_error_docref0'); + + php_error_docref := GetProcAddress(PHPLib, 'php_error_docref0'); + + php_error_docref1 := GetProcAddress(PHPLib, 'php_error_docref1'); + + php_error_docref2 := GetProcAddress(PHPLib, 'php_error_docref2'); + + + + {$IFNDEF QUIET_LOAD} + CheckPHPErrors; + {$ENDIF} + + Result := true; end; diff --git a/PHPCommon.pas b/Source/PHPCommon.pas similarity index 100% rename from PHPCommon.pas rename to Source/PHPCommon.pas diff --git a/PHPFunctions.pas b/Source/PHPFunctions.pas similarity index 100% rename from PHPFunctions.pas rename to Source/PHPFunctions.pas diff --git a/PHPLibrary.pas b/Source/PHPLibrary.pas similarity index 100% rename from PHPLibrary.pas rename to Source/PHPLibrary.pas diff --git a/PHPProjectWizard.pas b/Source/PHPProjectWizard.pas similarity index 100% rename from PHPProjectWizard.pas rename to Source/PHPProjectWizard.pas diff --git a/PHPProjectWizard.res b/Source/PHPProjectWizard.res similarity index 100% rename from PHPProjectWizard.res rename to Source/PHPProjectWizard.res diff --git a/PHPTypes.pas b/Source/PHPTypes.pas similarity index 100% rename from PHPTypes.pas rename to Source/PHPTypes.pas diff --git a/Php4DelphiGroup5.bpg b/Source/Php4DelphiGroup5.bpg similarity index 97% rename from Php4DelphiGroup5.bpg rename to Source/Php4DelphiGroup5.bpg index afac98c..c769d53 100644 --- a/Php4DelphiGroup5.bpg +++ b/Source/Php4DelphiGroup5.bpg @@ -1,23 +1,23 @@ -#------------------------------------------------------------------------------ -VERSION = BWS.01 -#------------------------------------------------------------------------------ -!ifndef ROOT -ROOT = $(MAKEDIR)\.. -!endif -#------------------------------------------------------------------------------ -MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** -DCC = $(ROOT)\bin\dcc32.exe $** -BRCC = $(ROOT)\bin\brcc32.exe $** -#------------------------------------------------------------------------------ -PROJECTS = php4DelphiR5.bpl php4DelphiD5.bpl -#------------------------------------------------------------------------------ -default: $(PROJECTS) -#------------------------------------------------------------------------------ - -php4DelphiR5.bpl: php4DelphiR5.dpk - $(DCC) - -php4DelphiD5.bpl: php4DelphiD5.dpk - $(DCC) - - +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = php4DelphiR5.bpl php4DelphiD5.bpl +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +php4DelphiR5.bpl: php4DelphiR5.dpk + $(DCC) + +php4DelphiD5.bpl: php4DelphiD5.dpk + $(DCC) + + diff --git a/Php4DelphiGroup7.bpg b/Source/Php4DelphiGroup7.bpg similarity index 97% rename from Php4DelphiGroup7.bpg rename to Source/Php4DelphiGroup7.bpg index a913e38..061fc88 100644 --- a/Php4DelphiGroup7.bpg +++ b/Source/Php4DelphiGroup7.bpg @@ -1,23 +1,23 @@ -#------------------------------------------------------------------------------ -VERSION = BWS.01 -#------------------------------------------------------------------------------ -!ifndef ROOT -ROOT = $(MAKEDIR)\.. -!endif -#------------------------------------------------------------------------------ -MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** -DCC = $(ROOT)\bin\dcc32.exe $** -BRCC = $(ROOT)\bin\brcc32.exe $** -#------------------------------------------------------------------------------ -PROJECTS = php4DelphiR7.bpl php4DelphiD7.bpl -#------------------------------------------------------------------------------ -default: $(PROJECTS) -#------------------------------------------------------------------------------ - -php4DelphiR7.bpl: php4DelphiR7.dpk - $(DCC) - -php4DelphiD7.bpl: php4DelphiD7.dpk - $(DCC) - - +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = php4DelphiR7.bpl php4DelphiD7.bpl +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +php4DelphiR7.bpl: php4DelphiR7.dpk + $(DCC) + +php4DelphiD7.bpl: php4DelphiD7.dpk + $(DCC) + + diff --git a/ZENDAPI.pas b/Source/ZENDAPI.pas similarity index 99% rename from ZENDAPI.pas rename to Source/ZENDAPI.pas index 3e1bd39..f9f353f 100644 --- a/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -685,45 +685,45 @@ procedure ZEND_PUTS(str: PAnsiChar); zend_register_internal_class : function(class_entry: pzend_class_entry; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; zend_register_internal_class_ex : function(class_entry: pzend_class_entry; parent_ce: pzend_class_entry; parent_name: PAnsiChar; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; function ZvalInt(z:zval):Integer; - function ZvalDouble(z:zval):Double; - function ZvalBool(z:zval):Boolean; - - function ZvalStrS(z:zval) : string; - function ZvalStr(z:zval) : AnsiString; - function ZvalStrW(z:zval) : WideString; - - procedure ZvalVAL(z:pzval; v:Boolean) overload; - procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG) overload; - procedure ZvalVAL(z:pzval) overload; + function ZvalDouble(z:zval):Double; + function ZvalBool(z:zval):Boolean; + + function ZvalStrS(z:zval) : string; + function ZvalStr(z:zval) : AnsiString; + function ZvalStrW(z:zval) : WideString; + + procedure ZvalVAL(z:pzval; v:Boolean) overload; + procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG) overload; + procedure ZvalVAL(z:pzval) overload; procedure ZvalVAL(z:pzval; v:Double) overload; procedure ZvalVAL(z: pzval; s: AnsiString; len: Integer = 0); overload; procedure ZvalString(z:pzval) overload; - procedure ZvalString(z:pzval; s:PAnsiChar; len:Integer = 0) overload; - procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0) overload; + procedure ZvalString(z:pzval; s:PAnsiChar; len:Integer = 0) overload; + procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0) overload; procedure ZvalString(z:pzval; s:string; len:Integer = 0) overload; -function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; -function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) - : Integer; overload; -function ZvalArrayAdd(z: pzval; key: AnsiString; Args: array of const) - : Integer; overload; - -function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; -function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) - : Boolean; overload; -function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; -function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) - : Boolean; overload; -function ZValArrayKeyDel(v: pzval; key: AnsiString): Boolean; overload; -function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; - -function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) - : Boolean; overload; -function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) - : Boolean; overload; - - function GetArgPZval(Args: TVarRec; const _type: Integer = IS_LONG; - Make: Boolean = false): pzval; +function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; +function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) + : Integer; overload; +function ZvalArrayAdd(z: pzval; key: AnsiString; Args: array of const) + : Integer; overload; + +function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; +function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) + : Boolean; overload; +function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; +function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) + : Boolean; overload; +function ZValArrayKeyDel(v: pzval; key: AnsiString): Boolean; overload; +function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; + +function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) + : Boolean; overload; +function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) + : Boolean; overload; + + function GetArgPZval(Args: TVarRec; const _type: Integer = IS_LONG; + Make: Boolean = false): pzval; procedure ZVAL_RESOURCE(value: pzval; l: longint); procedure ZVAL_BOOL(z: pzval; b: boolean); procedure ZVAL_NULL(z: pzval); @@ -967,312 +967,312 @@ procedure ZVAL_DOUBLE(z: pzval; d: double); z^.value.dval := d; end; procedure ZvalString(z:pzval); -begin - z^.value.str.len := 0; - z^.value.str.val := ''; - z^._type := IS_STRING; -end; - -procedure ZvalString(z:pzval; s:PAnsiChar; len:Integer = 0); -var - lens:Integer; -begin - if not assigned(s) then - ZvalString(z) - else begin - if len = 0 then - lens := Length(s) - else - lens := len; - - z^.value.str.len := lens; - z^.value.str.val := estrndup(s, lens); - z^._type := IS_STRING; - end; -end; - -procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0); -begin - if not assigned(s) then - ZvalString(z) - else - ZvalString(z, PAnsiChar(AnsiString(WideString(s))), len); -end; - -procedure ZvalString(z:pzval; s:string; len:Integer = 0); -var - _s:PWideChar; -begin - _s := PWideChar(s); - - if not assigned(_s) then - ZvalString(z) - else - ZvalString(z, _s, len); +begin + z^.value.str.len := 0; + z^.value.str.val := ''; + z^._type := IS_STRING; +end; + +procedure ZvalString(z:pzval; s:PAnsiChar; len:Integer = 0); +var + lens:Integer; +begin + if not assigned(s) then + ZvalString(z) + else begin + if len = 0 then + lens := Length(s) + else + lens := len; + + z^.value.str.len := lens; + z^.value.str.val := estrndup(s, lens); + z^._type := IS_STRING; + end; +end; + +procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0); +begin + if not assigned(s) then + ZvalString(z) + else + ZvalString(z, PAnsiChar(AnsiString(WideString(s))), len); +end; + +procedure ZvalString(z:pzval; s:string; len:Integer = 0); +var + _s:PWideChar; +begin + _s := PWideChar(s); + + if not assigned(_s) then + ZvalString(z) + else + ZvalString(z, _s, len); end; function ZvalInt; -begin - Result := z.value.lval; -end; - -function ZvalDouble; -begin - Result := z.value.dval; -end; - -function ZvalBool; -begin - Result := boolean(z.value.lval); -end; - -function ZvalStrS; -begin - Result := z.value.str.val; -end; - -function ZvalStr; -begin - Result := z.value.str.val; -end; - -function ZvalStrW; -begin - Result := WideString(z.value.str.val); -end; - -procedure ZvalVAL(z:pzval; v:Boolean); -Begin - z._type := IS_BOOL; - z.value.lval := integer(v); -End; - -procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); -Begin - z._type := _type; - z.value.lval := v; -End; - -procedure ZvalVAL(z:pzval); -Begin - z._type := IS_NULL; -End; - -procedure ZvalVAL(z:pzval; v:Double); -Begin - z._type := IS_LONG; - z.value.dval := v; +begin + Result := z.value.lval; +end; + +function ZvalDouble; +begin + Result := z.value.dval; +end; + +function ZvalBool; +begin + Result := boolean(z.value.lval); +end; + +function ZvalStrS; +begin + Result := z.value.str.val; +end; + +function ZvalStr; +begin + Result := z.value.str.val; +end; + +function ZvalStrW; +begin + Result := WideString(z.value.str.val); +end; + +procedure ZvalVAL(z:pzval; v:Boolean); +Begin + z._type := IS_BOOL; + z.value.lval := integer(v); +End; + +procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); +Begin + z._type := _type; + z.value.lval := v; +End; + +procedure ZvalVAL(z:pzval); +Begin + z._type := IS_NULL; +End; + +procedure ZvalVAL(z:pzval; v:Double); +Begin + z._type := IS_LONG; + z.value.dval := v; End; procedure ZvalVAL(z: pzval; s: AnsiString; len: Integer = 0); -var - lens: Integer; - AChar: PAnsiChar; -begin - AChar := PAnsiChar(s); - - if not assigned(AChar) then - ZVAL_NULL(z) - else - begin - if len = 0 then - lens := Length(AChar) - else - lens := len; - - z^.value.str.len := lens; - z^.value.str.val := _estrndup(AChar, lens, nil, 0, nil, 0); - z^._type := IS_STRING; - end; -end; - +var + lens: Integer; + AChar: PAnsiChar; +begin + AChar := PAnsiChar(s); + + if not assigned(AChar) then + ZVAL_NULL(z) + else + begin + if len = 0 then + lens := Length(AChar) + else + lens := len; + + z^.value.str.len := lens; + z^.value.str.val := _estrndup(AChar, lens, nil, 0, nil, 0); + z^._type := IS_STRING; + end; +end; + function AddElementZvalArray(z: pzval; Args: array of const; flag: Integer; - idx: uint = 0; len: uint = 0; const key: AnsiString = ''): Integer; -var - tmp: pzval; - arKey: PAnsiChar; -begin - Result := FAILURE; - if z._type <> IS_ARRAY then - exit; - - if len <> 0 then - begin - inc(len); - arKey := PAnsiChar(key); - idx := zend_hash_func(arKey, len); - end; - - tmp := GetArgPZval(Args[0], 1, true); - Result := _zend_hash_quick_add_or_update(z.value.ht, arKey, len, idx, tmp, - sizeof(pzval), nil, flag); -end; + idx: uint = 0; len: uint = 0; const key: AnsiString = ''): Integer; +var + tmp: pzval; + arKey: PAnsiChar; +begin + Result := FAILURE; + if z._type <> IS_ARRAY then + exit; + + if len <> 0 then + begin + inc(len); + arKey := PAnsiChar(key); + idx := zend_hash_func(arKey, len); + end; + + tmp := GetArgPZval(Args[0], 1, true); + Result := _zend_hash_quick_add_or_update(z.value.ht, arKey, len, idx, tmp, + sizeof(pzval), nil, flag); +end; // Add Next -function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; -begin - Result := FAILURE; - if z._type <> IS_ARRAY then - exit; - Result := AddElementZvalArray(z, Args, HASH_NEXT_INSERT, - z.value.ht.nNextFreeElement); -end; - -// Add Index -function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) - : Integer; overload; -begin - Result := AddElementZvalArray(z, Args, HASH_UPDATE, idx); -end; - -// Add Assoc -function ZvalArrayAdd(z: pzval; key: AnsiString; Args: array of const) - : Integer; overload; -begin - Result := AddElementZvalArray(z, Args, HASH_UPDATE, 0, Length(key), key); -end; - -function IsArrayRetVal(v: pzval): Boolean; -begin - Result := v._type = IS_ARRAY; -end; - -function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; -begin - Result := false; - if v._type <> IS_ARRAY then - exit; - - if v.value.ht.nNumOfElements = 0 then - exit; - - Result := zend_hash_exists(v.value.ht, PAnsiChar(key), Length(key) + 1) = 1; -end; - -function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; -begin - Result := false; - if (v._type <> IS_ARRAY) then - exit; - - if v.value.ht.nNumOfElements = 0 then - exit; - - Result := zend_hash_index_exists(v.value.ht, idx) = 1; -end; - -function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) - : Boolean; overload; -var - tmp: ppzval; -begin - Result := ZValArrayKeyExists(v, key); - if Result then - begin - pData := nil; - if ZValArrayKeyFind(v, key, tmp) then - pData := tmp^; - end; -end; - -function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) - : Boolean; overload; -var - tmp: ppzval; -begin - Result := ZValArrayKeyExists(v, idx); - if Result then - begin - pData := nil; - if ZValArrayKeyFind(v, idx, tmp) then - pData := tmp^; - end; -end; - -function ZValArrayKeyDel(v: pzval; key: AnsiString): Boolean; overload; -begin - Result := false; - if ZValArrayKeyExists(v, key) then - Result := zend_hash_del_key_or_index(v.value.ht, PAnsiChar(key), - Length(key) + 1, 0, HASH_DEL_KEY) = SUCCESS; -end; - -function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; -begin - Result := false; - if ZValArrayKeyExists(v, idx) then - Result := zend_hash_del_key_or_index(v.value.ht, nil, 0, idx, - HASH_DEL_INDEX) = SUCCESS; -end; - -function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) - : Boolean; overload; -var - keyStr: PAnsiChar; - KeyLength: uint; -begin - keyStr := PAnsiChar(key); - KeyLength := Length(key) + 1; - - Result := zend_hash_quick_find(v.value.ht, keyStr, KeyLength, - zend_hash_func(keyStr, KeyLength), pData) = SUCCESS; -end; - -function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) - : Boolean; overload; -begin - Result := zend_hash_quick_find(v.value.ht, nil, 0, idx, pData) = SUCCESS; +function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; +begin + Result := FAILURE; + if z._type <> IS_ARRAY then + exit; + Result := AddElementZvalArray(z, Args, HASH_NEXT_INSERT, + z.value.ht.nNextFreeElement); +end; + +// Add Index +function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) + : Integer; overload; +begin + Result := AddElementZvalArray(z, Args, HASH_UPDATE, idx); +end; + +// Add Assoc +function ZvalArrayAdd(z: pzval; key: AnsiString; Args: array of const) + : Integer; overload; +begin + Result := AddElementZvalArray(z, Args, HASH_UPDATE, 0, Length(key), key); +end; + +function IsArrayRetVal(v: pzval): Boolean; +begin + Result := v._type = IS_ARRAY; +end; + +function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; +begin + Result := false; + if v._type <> IS_ARRAY then + exit; + + if v.value.ht.nNumOfElements = 0 then + exit; + + Result := zend_hash_exists(v.value.ht, PAnsiChar(key), Length(key) + 1) = 1; +end; + +function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; +begin + Result := false; + if (v._type <> IS_ARRAY) then + exit; + + if v.value.ht.nNumOfElements = 0 then + exit; + + Result := zend_hash_index_exists(v.value.ht, idx) = 1; +end; + +function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) + : Boolean; overload; +var + tmp: ppzval; +begin + Result := ZValArrayKeyExists(v, key); + if Result then + begin + pData := nil; + if ZValArrayKeyFind(v, key, tmp) then + pData := tmp^; + end; +end; + +function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) + : Boolean; overload; +var + tmp: ppzval; +begin + Result := ZValArrayKeyExists(v, idx); + if Result then + begin + pData := nil; + if ZValArrayKeyFind(v, idx, tmp) then + pData := tmp^; + end; +end; + +function ZValArrayKeyDel(v: pzval; key: AnsiString): Boolean; overload; +begin + Result := false; + if ZValArrayKeyExists(v, key) then + Result := zend_hash_del_key_or_index(v.value.ht, PAnsiChar(key), + Length(key) + 1, 0, HASH_DEL_KEY) = SUCCESS; +end; + +function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; +begin + Result := false; + if ZValArrayKeyExists(v, idx) then + Result := zend_hash_del_key_or_index(v.value.ht, nil, 0, idx, + HASH_DEL_INDEX) = SUCCESS; +end; + +function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) + : Boolean; overload; +var + keyStr: PAnsiChar; + KeyLength: uint; +begin + keyStr := PAnsiChar(key); + KeyLength := Length(key) + 1; + + Result := zend_hash_quick_find(v.value.ht, keyStr, KeyLength, + zend_hash_func(keyStr, KeyLength), pData) = SUCCESS; +end; + +function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) + : Boolean; overload; +begin + Result := zend_hash_quick_find(v.value.ht, nil, 0, idx, pData) = SUCCESS; end; procedure MAKE_STD_ZVAL(out Result: pzval); -begin - ALLOC_ZVAL(Result); - INIT_PZVAL(Result); -end; - - - -function GetArgPZval; -begin - if Args._Reserved1 = 0 then // nil - begin - if Make then - MAKE_STD_ZVAL(Result); - Result._type := IS_NULL; - end - else if Args.VType = vtPointer then - Result := Args.VPointer - else - begin - if Make then - MAKE_STD_ZVAL(Result); - case Args.VType of - vtInteger: - ZvalVAL(Result, Args.VInteger, _type); - vtInt64: - ZvalVAL(Result, NativeInt(Args.VInt64^), _type); - vtBoolean: - ZvalVAL(Result, Args.VBoolean); - vtExtended: - ZvalVAL(Result, Args.VExtended^); - vtClass, vtObject: - ZvalVAL(Result, Args._Reserved1); - vtString: - ZvalVAL(Result, AnsiString(Args.VString^)); - vtAnsiString: - ZvalVAL(Result, PAnsiChar(Args.VAnsiString)); - vtUnicodeString: - ZvalVAL(Result, UnicodeString(Args._Reserved1)); - vtWideChar: - ZvalVAL(Result, AnsiString(Args.VWideChar)); - vtChar: - ZvalVAL(Result, Args.VChar); - vtPWideChar: - ZvalVAL(Result, Args.VPWideChar); - vtPChar: - ZvalVAL(Result, Args.VPChar); - vtWideString: - ZvalVAL(Result, PWideChar(Args.VWideString)); - end; - end; -end; - +begin + ALLOC_ZVAL(Result); + INIT_PZVAL(Result); +end; + + + +function GetArgPZval; +begin + if Args._Reserved1 = 0 then // nil + begin + if Make then + MAKE_STD_ZVAL(Result); + Result._type := IS_NULL; + end + else if Args.VType = vtPointer then + Result := Args.VPointer + else + begin + if Make then + MAKE_STD_ZVAL(Result); + case Args.VType of + vtInteger: + ZvalVAL(Result, Args.VInteger, _type); + vtInt64: + ZvalVAL(Result, NativeInt(Args.VInt64^), _type); + vtBoolean: + ZvalVAL(Result, Args.VBoolean); + vtExtended: + ZvalVAL(Result, Args.VExtended^); + vtClass, vtObject: + ZvalVAL(Result, Args._Reserved1); + vtString: + ZvalVAL(Result, AnsiString(Args.VString^)); + vtAnsiString: + ZvalVAL(Result, PAnsiChar(Args.VAnsiString)); + vtUnicodeString: + ZvalVAL(Result, UnicodeString(Args._Reserved1)); + vtWideChar: + ZvalVAL(Result, AnsiString(Args.VWideChar)); + vtChar: + ZvalVAL(Result, Args.VChar); + vtPWideChar: + ZvalVAL(Result, Args.VPWideChar); + vtPChar: + ZvalVAL(Result, Args.VPChar); + vtWideString: + ZvalVAL(Result, PWideChar(Args.VWideString)); + end; + end; +end; + procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); var @@ -1574,138 +1574,138 @@ function add_next_index_variant(arg: pzval; value: variant): integer; procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; var - i : integer; -begin - if _array_init(z, nil, 0) = FAILURE then // - begin - ZVAL_FALSE(z); - Exit; - end; - - if Length(arr) = 0 then - begin - z^.refcount := 1; - Exit; - end; - - for i := 0 to Length(arr)-1 do - begin - add_next_index_string(z, PAnsiChar(AnsiString(arr[i])), 1); - end; - Exit; + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; + + for i := 0 to Length(arr)-1 do + begin + add_next_index_string(z, PAnsiChar(AnsiString(arr[i])), 1); + end; + Exit; end; procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; var - i : integer; -begin - if _array_init(z, nil, 0) = FAILURE then // - begin - ZVAL_FALSE(z); - Exit; - end; - - if Length(arr) = 0 then - begin - z^.refcount := 1; - Exit; - end; - - for i := 0 to Length(arr)-1 do - begin - add_next_index_string(z, PansiChar(arr[i]), 1); - end; - Exit; + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; + + for i := 0 to Length(arr)-1 do + begin + add_next_index_string(z, PansiChar(arr[i]), 1); + end; + Exit; end; procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; var i: integer; -begin - if _array_init(z, nil, 0) = FAILURE then // - begin - ZVAL_FALSE(z); - Exit; - end; - - if Length(arr) = 0 then - begin - z^.refcount := 1; - Exit; - end; - - for i := 0 to Length(arr)-1 do - begin - add_next_index_string(z, PansiChar(AnsiString(arr[i])), 1); - end; - Exit; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; + + for i := 0 to Length(arr)-1 do + begin + add_next_index_string(z, PansiChar(AnsiString(arr[i])), 1); + end; + Exit; end; procedure ZVAL_ARRAY(z: pzval; arr: array of AnsiString); overload; -var +var i: integer; -begin - if _array_init(z, nil, 0) = FAILURE then // - begin - ZVAL_FALSE(z); - Exit; - end; - - if Length(arr) = 0 then - begin - z^.refcount := 1; - Exit; - end; - - for i := 0 to Length(arr)-1 do - begin - add_next_index_string(z, PansiChar(arr[i]), 1); - end; - Exit; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; + + for i := 0 to Length(arr)-1 do + begin + add_next_index_string(z, PansiChar(arr[i]), 1); + end; + Exit; end; procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; -var +var i: integer; -begin - if _array_init(z, nil, 0) = FAILURE then // - begin - ZVAL_FALSE(z); - Exit; - end; - - if Length(arr) = 0 then - begin - z^.refcount := 1; - Exit; - end; - - for i := 0 to Length(arr)-1 do - begin - add_next_index_variant(z, arr[i]); - end; - Exit; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; + + for i := 0 to Length(arr)-1 do + begin + add_next_index_variant(z, arr[i]); + end; + Exit; end; procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; var i: integer; -begin - if _array_init(z, nil, 0) = FAILURE then // - begin - ZVAL_FALSE(z); - Exit; - end; - - if Length(arr) = 0 then - begin - z^.refcount := 1; - Exit; - end; - - for i := 0 to Length(arr)-1 do - begin - add_next_index_long(z, arr[i]); - end; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + + if Length(arr) = 0 then + begin + z^.refcount := 1; + Exit; + end; + + for i := 0 to Length(arr)-1 do + begin + add_next_index_long(z, arr[i]); + end; Exit; end; @@ -1713,262 +1713,262 @@ procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; var i: integer; V: TVarData; -begin - if _array_init(z, nil, 0) = FAILURE then // - begin - ZVAL_FALSE(z); - Exit; - end; - - if arr.PVarArray.DimCount = 0 then - begin - ZVAL_FALSE(z); - Exit; - end; - - for i := 0 to arr.DimCount-1 do - begin - {V := TVarData( arr[i] ); - case V.VType of - varEmpty, varNull: - add_next_index_null(z); - varSmallInt: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VSmallInt))), 1); - varInteger: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VInteger))), 1); - varSingle: - add_next_index_string(z, PansiChar(AnsiString(V.VSingle.ToString())), 1); - varDouble: - add_next_index_double(z, V.VDouble); - varCurrency: - add_next_index_string(z, PansiChar(AnsiString(CurrToStr(V.VCurrency))), 1); - varDate: - add_next_index_string(z, PansiChar(AnsiString(DateTimeToStr(V.VDate))), 1); - varOleStr: - add_next_index_string(z, PansiChar(AnsiString(V.VOleStr)), 1); - varBoolean: - add_next_index_bool(z, V.VBoolean.ToInteger()); - varByte: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VByte))), 1); - varWord: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VWord))), 1); - varShortInt: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VShortInt))), 1); - varLongWord: - add_next_index_long(z, V.VLongWord); - varInt64: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VInt64))), 1); - varString: - add_next_index_string(z, PansiChar(AnsiString(V.VString)), 1); - {$IFDEF SUPPORTS_UNICODE_STRING}{ - varUString: - add_next_index_string(z, PansiChar(AnsiString(V.VUString)), 1); - {$ENDIF SUPPORTS_UNICODE_STRING} - {varArray, - varDispatch, - varError, - varUnknown, - varAny, - varByRef:}{ - varObject: - add_next_index_long(z, Integer( - end; } - add_next_index_variant(z, arr[i]); - end; - Exit; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + + if arr.PVarArray.DimCount = 0 then + begin + ZVAL_FALSE(z); + Exit; + end; + + for i := 0 to arr.DimCount-1 do + begin + {V := TVarData( arr[i] ); + case V.VType of + varEmpty, varNull: + add_next_index_null(z); + varSmallInt: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VSmallInt))), 1); + varInteger: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VInteger))), 1); + varSingle: + add_next_index_string(z, PansiChar(AnsiString(V.VSingle.ToString())), 1); + varDouble: + add_next_index_double(z, V.VDouble); + varCurrency: + add_next_index_string(z, PansiChar(AnsiString(CurrToStr(V.VCurrency))), 1); + varDate: + add_next_index_string(z, PansiChar(AnsiString(DateTimeToStr(V.VDate))), 1); + varOleStr: + add_next_index_string(z, PansiChar(AnsiString(V.VOleStr)), 1); + varBoolean: + add_next_index_bool(z, V.VBoolean.ToInteger()); + varByte: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VByte))), 1); + varWord: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VWord))), 1); + varShortInt: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VShortInt))), 1); + varLongWord: + add_next_index_long(z, V.VLongWord); + varInt64: + add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VInt64))), 1); + varString: + add_next_index_string(z, PansiChar(AnsiString(V.VString)), 1); + {$IFDEF SUPPORTS_UNICODE_STRING}{ + varUString: + add_next_index_string(z, PansiChar(AnsiString(V.VUString)), 1); + {$ENDIF SUPPORTS_UNICODE_STRING} + {varArray, + varDispatch, + varError, + varUnknown, + varAny, + varByRef:}{ + varObject: + add_next_index_long(z, Integer( + end; } + add_next_index_variant(z, arr[i]); + end; + Exit; end; procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of PAnsiChar; keyvals: Array of PAnsiChar); var - i : integer; -begin - if _array_init(z, nil, 0) = FAILURE then - begin - ZVAL_FALSE(z); - Exit; - end; - - if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then - begin - z^.refcount := 1; - Exit; - end; - - if Length(keynames) = Length(keyvals) then - begin - for i := 0 to Length(keynames)-1 do - begin - add_assoc_string_ex(z, keynames[i], StrLen(keynames[i]) + 1, keyvals[i], 1); - end; - Exit; - end - else - begin - ZVAL_FALSE(z); - Exit; - end; - + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; + + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; + + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, keynames[i], StrLen(keynames[i]) + 1, keyvals[i], 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; + end; procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of PWideChar); var - i : integer; -begin - if _array_init(z, nil, 0) = FAILURE then - begin - ZVAL_FALSE(z); - Exit; - end; - - if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then - begin - z^.refcount := 1; - Exit; - end; - - if Length(keynames) = Length(keyvals) then - begin - for i := 0 to Length(keynames)-1 do - begin - add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); - end; - Exit; - end - else - begin - ZVAL_FALSE(z); - Exit; - end; - + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; + + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; + + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; + end; procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overload; var - i : integer; -begin - if _array_init(z, nil, 0) = FAILURE then // - begin - ZVAL_FALSE(z); - Exit; - end; - //z^.refcount := Length(keynames); // - if (Length(keynames) = 0) then - begin - z^.refcount := 1; - Exit; - end; - - if Length(keynames) = Length(keyvals) then - begin - for i := 0 to Length(keynames)-1 do - begin - // - // - add_assoc_string_ex(z, PAnsiChar(AnsiString(keynames[i])), StrLen(PAnsiChar(AnsiString(keynames[i]))) + 1, - PAnsiChar(AnsiString(keyvals[i])), 1); - - // - end; - Exit; - end - else - begin - ZVAL_FALSE(z); - Exit; - end; - + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then // + begin + ZVAL_FALSE(z); + Exit; + end; + //z^.refcount := Length(keynames); // + if (Length(keynames) = 0) then + begin + z^.refcount := 1; + Exit; + end; + + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + // + // + add_assoc_string_ex(z, PAnsiChar(AnsiString(keynames[i])), StrLen(PAnsiChar(AnsiString(keynames[i]))) + 1, + PAnsiChar(AnsiString(keyvals[i])), 1); + + // + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; + end; procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of string); overload; var - i : integer; -begin - if _array_init(z, nil, 0) = FAILURE then - begin - ZVAL_FALSE(z); - Exit; - end; - - if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then - begin - z^.refcount := 1; - Exit; - end; - - if Length(keynames) = Length(keyvals) then - begin - for i := 0 to Length(keynames)-1 do - begin - add_assoc_string_ex(z, PAnsiChar(AnsiString(keynames[i])), StrLen(PAnsiChar(AnsiString(keynames[i]))) + 1, - PAnsiChar(AnsiString(keyvals[i])), 1); - end; - Exit; - end - else - begin - ZVAL_FALSE(z); - Exit; - end; - + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; + + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; + + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, PAnsiChar(AnsiString(keynames[i])), StrLen(PAnsiChar(AnsiString(keynames[i]))) + 1, + PAnsiChar(AnsiString(keyvals[i])), 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; + end; procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; var - i : integer; -begin - if _array_init(z, nil, 0) = FAILURE then - begin - ZVAL_FALSE(z); - Exit; - end; - - if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then - begin - z^.refcount := 1; - Exit; - end; - - if Length(keynames) = Length(keyvals) then - begin - for i := 0 to Length(keynames)-1 do - begin - add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); - end; - Exit; - end - else - begin - ZVAL_FALSE(z); - Exit; - end; - + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; + + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; + + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; + end; procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array of AnsiString); overload; var - i : integer; -begin - if _array_init(z, nil, 0) = FAILURE then - begin - ZVAL_FALSE(z); - Exit; - end; - - if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then - begin - z^.refcount := 1; - Exit; - end; - - if Length(keynames) = Length(keyvals) then - begin - for i := 0 to Length(keynames)-1 do - begin - add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); - end; - Exit; - end - else - begin - ZVAL_FALSE(z); - Exit; - end; - + i : integer; +begin + if _array_init(z, nil, 0) = FAILURE then + begin + ZVAL_FALSE(z); + Exit; + end; + + if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then + begin + z^.refcount := 1; + Exit; + end; + + if Length(keynames) = Length(keyvals) then + begin + for i := 0 to Length(keynames)-1 do + begin + add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + end; + Exit; + end + else + begin + ZVAL_FALSE(z); + Exit; + end; + end; function ZENDLoaded: boolean; begin @@ -2747,8 +2747,8 @@ function ALLOC_ZVAL: pzval; end; procedure ALLOC_ZVAL(out Result: pzval); -begin - Result := emalloc(sizeof(zval)); +begin + Result := emalloc(sizeof(zval)); end; procedure INIT_PZVAL(p: pzval); diff --git a/ZendTypes.pas b/Source/ZendTypes.pas similarity index 99% rename from ZendTypes.pas rename to Source/ZendTypes.pas index 5cfee75..52db09c 100644 --- a/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -1137,44 +1137,44 @@ zend_function_entry = record Tzend_function_entry = zend_function_entry; TZendFunctionEntry = zend_function_entry; P_zend_arg_info = ^_zend_arg_info; - zend_object_value = record - handle:Integer; - handlers:Pointer; + zend_object_value = record + handle:Integer; + handlers:Pointer; end; _zend_function_entry = record - fname : PAnsiChar; - handler : pointer; - arg_info : P_zend_arg_info; - num_args : uint; - flags : uint; + fname : PAnsiChar; + handler : pointer; + arg_info : P_zend_arg_info; + num_args : uint; + flags : uint; end; Pzend_module_entry = ^Tzend_module_entry; p_zend_module_entry = ^_zend_module_entry; - _zend_module_entry = record - size : word; - zend_api : dword; - zend_debug : byte; - zts : byte; - ini_entry : pointer; - deps : pointer; - name : PAnsiChar; - functions : Pointer; - module_startup_func : pointer; - module_shutdown_func : pointer; - request_startup_func : pointer; - request_shutdown_func : pointer; - info_func : pointer; - version : PAnsiChar; - globals_size : size_t; - globals_id_ptr : pointer; - globals_ctor : pointer; - globals_dtor : pointer; - post_deactivate_func : pointer; - module_started : integer; - _type : byte; - handle : pointer; - module_number : Integer; - build_id : PAnsiChar; + _zend_module_entry = record + size : word; + zend_api : dword; + zend_debug : byte; + zts : byte; + ini_entry : pointer; + deps : pointer; + name : PAnsiChar; + functions : Pointer; + module_startup_func : pointer; + module_shutdown_func : pointer; + request_startup_func : pointer; + request_shutdown_func : pointer; + info_func : pointer; + version : PAnsiChar; + globals_size : size_t; + globals_id_ptr : pointer; + globals_ctor : pointer; + globals_dtor : pointer; + post_deactivate_func : pointer; + module_started : integer; + _type : byte; + handle : pointer; + module_number : Integer; + build_id : PAnsiChar; end; Tzend_module_entry = record size: word; diff --git a/logos.pas b/Source/logos.pas similarity index 100% rename from logos.pas rename to Source/logos.pas diff --git a/packages/php4delphi Delphi 10 Seattle.groupproj b/Source/packages/php4delphi Delphi 10 Seattle.groupproj similarity index 100% rename from packages/php4delphi Delphi 10 Seattle.groupproj rename to Source/packages/php4delphi Delphi 10 Seattle.groupproj diff --git a/packages/php4delphi Delphi 10 Seattle.groupproj.local b/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local similarity index 100% rename from packages/php4delphi Delphi 10 Seattle.groupproj.local rename to Source/packages/php4delphi Delphi 10 Seattle.groupproj.local diff --git a/packages/php4delphi Delphi 10.1 Berlin.groupproj b/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj similarity index 100% rename from packages/php4delphi Delphi 10.1 Berlin.groupproj rename to Source/packages/php4delphi Delphi 10.1 Berlin.groupproj diff --git a/packages/php4delphi Delphi 10.1 Berlin.groupproj.local b/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local similarity index 100% rename from packages/php4delphi Delphi 10.1 Berlin.groupproj.local rename to Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local diff --git a/packages/php4delphi Delphi 10.2 Tokyo.groupproj b/Source/packages/php4delphi Delphi 10.2 Tokyo.groupproj similarity index 100% rename from packages/php4delphi Delphi 10.2 Tokyo.groupproj rename to Source/packages/php4delphi Delphi 10.2 Tokyo.groupproj diff --git a/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local b/Source/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local similarity index 100% rename from packages/php4delphi Delphi 10.2 Tokyo.groupproj.local rename to Source/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local diff --git a/packages/php4delphi Delphi 2010.groupproj b/Source/packages/php4delphi Delphi 2010.groupproj similarity index 100% rename from packages/php4delphi Delphi 2010.groupproj rename to Source/packages/php4delphi Delphi 2010.groupproj diff --git a/packages/php4delphi Delphi 2010.groupproj.local b/Source/packages/php4delphi Delphi 2010.groupproj.local similarity index 100% rename from packages/php4delphi Delphi 2010.groupproj.local rename to Source/packages/php4delphi Delphi 2010.groupproj.local diff --git a/packages/php4delphi Delphi 2011.groupproj b/Source/packages/php4delphi Delphi 2011.groupproj similarity index 100% rename from packages/php4delphi Delphi 2011.groupproj rename to Source/packages/php4delphi Delphi 2011.groupproj diff --git a/packages/php4delphi Delphi 2011.groupproj.local b/Source/packages/php4delphi Delphi 2011.groupproj.local similarity index 100% rename from packages/php4delphi Delphi 2011.groupproj.local rename to Source/packages/php4delphi Delphi 2011.groupproj.local diff --git a/packages/php4delphi Delphi XE1.groupproj b/Source/packages/php4delphi Delphi XE1.groupproj similarity index 100% rename from packages/php4delphi Delphi XE1.groupproj rename to Source/packages/php4delphi Delphi XE1.groupproj diff --git a/packages/php4delphi Delphi XE1.groupproj.local b/Source/packages/php4delphi Delphi XE1.groupproj.local similarity index 100% rename from packages/php4delphi Delphi XE1.groupproj.local rename to Source/packages/php4delphi Delphi XE1.groupproj.local diff --git a/packages/php4delphi Delphi XE2.groupproj b/Source/packages/php4delphi Delphi XE2.groupproj similarity index 100% rename from packages/php4delphi Delphi XE2.groupproj rename to Source/packages/php4delphi Delphi XE2.groupproj diff --git a/packages/php4delphi Delphi XE2.groupproj.local b/Source/packages/php4delphi Delphi XE2.groupproj.local similarity index 100% rename from packages/php4delphi Delphi XE2.groupproj.local rename to Source/packages/php4delphi Delphi XE2.groupproj.local diff --git a/packages/php4delphi Delphi XE3.groupproj b/Source/packages/php4delphi Delphi XE3.groupproj similarity index 100% rename from packages/php4delphi Delphi XE3.groupproj rename to Source/packages/php4delphi Delphi XE3.groupproj diff --git a/packages/php4delphi Delphi XE3.groupproj.local b/Source/packages/php4delphi Delphi XE3.groupproj.local similarity index 100% rename from packages/php4delphi Delphi XE3.groupproj.local rename to Source/packages/php4delphi Delphi XE3.groupproj.local diff --git a/packages/php4delphi Delphi XE4.groupproj b/Source/packages/php4delphi Delphi XE4.groupproj similarity index 100% rename from packages/php4delphi Delphi XE4.groupproj rename to Source/packages/php4delphi Delphi XE4.groupproj diff --git a/packages/php4delphi Delphi XE4.groupproj.local b/Source/packages/php4delphi Delphi XE4.groupproj.local similarity index 100% rename from packages/php4delphi Delphi XE4.groupproj.local rename to Source/packages/php4delphi Delphi XE4.groupproj.local diff --git a/packages/php4delphi Delphi XE5.groupproj b/Source/packages/php4delphi Delphi XE5.groupproj similarity index 100% rename from packages/php4delphi Delphi XE5.groupproj rename to Source/packages/php4delphi Delphi XE5.groupproj diff --git a/packages/php4delphi Delphi XE5.groupproj.local b/Source/packages/php4delphi Delphi XE5.groupproj.local similarity index 100% rename from packages/php4delphi Delphi XE5.groupproj.local rename to Source/packages/php4delphi Delphi XE5.groupproj.local diff --git a/packages/php4delphi Delphi XE6.groupproj b/Source/packages/php4delphi Delphi XE6.groupproj similarity index 100% rename from packages/php4delphi Delphi XE6.groupproj rename to Source/packages/php4delphi Delphi XE6.groupproj diff --git a/packages/php4delphi Delphi XE6.groupproj.local b/Source/packages/php4delphi Delphi XE6.groupproj.local similarity index 100% rename from packages/php4delphi Delphi XE6.groupproj.local rename to Source/packages/php4delphi Delphi XE6.groupproj.local diff --git a/packages/php4delphi Delphi XE7.groupproj b/Source/packages/php4delphi Delphi XE7.groupproj similarity index 100% rename from packages/php4delphi Delphi XE7.groupproj rename to Source/packages/php4delphi Delphi XE7.groupproj diff --git a/packages/php4delphi Delphi XE7.groupproj.local b/Source/packages/php4delphi Delphi XE7.groupproj.local similarity index 100% rename from packages/php4delphi Delphi XE7.groupproj.local rename to Source/packages/php4delphi Delphi XE7.groupproj.local diff --git a/packages/php4delphi Delphi XE8.groupproj b/Source/packages/php4delphi Delphi XE8.groupproj similarity index 100% rename from packages/php4delphi Delphi XE8.groupproj rename to Source/packages/php4delphi Delphi XE8.groupproj diff --git a/packages/php4delphi Delphi XE8.groupproj.local b/Source/packages/php4delphi Delphi XE8.groupproj.local similarity index 100% rename from packages/php4delphi Delphi XE8.groupproj.local rename to Source/packages/php4delphi Delphi XE8.groupproj.local diff --git a/packages/php4delphi Delphi XE8_prjgroup.tvsconfig b/Source/packages/php4delphi Delphi XE8_prjgroup.tvsconfig similarity index 100% rename from packages/php4delphi Delphi XE8_prjgroup.tvsconfig rename to Source/packages/php4delphi Delphi XE8_prjgroup.tvsconfig diff --git a/php4App.dll b/Source/php4App.dll similarity index 100% rename from php4App.dll rename to Source/php4App.dll diff --git a/php4App.dpr b/Source/php4App.dpr similarity index 100% rename from php4App.dpr rename to Source/php4App.dpr diff --git a/php4App.dproj b/Source/php4App.dproj similarity index 100% rename from php4App.dproj rename to Source/php4App.dproj diff --git a/php4App.dproj.local b/Source/php4App.dproj.local similarity index 100% rename from php4App.dproj.local rename to Source/php4App.dproj.local diff --git a/php4App.identcache b/Source/php4App.identcache similarity index 100% rename from php4App.identcache rename to Source/php4App.identcache diff --git a/php4App.res b/Source/php4App.res similarity index 100% rename from php4App.res rename to Source/php4App.res diff --git a/php4App.stat b/Source/php4App.stat similarity index 100% rename from php4App.stat rename to Source/php4App.stat diff --git a/php4AppIntf.pas b/Source/php4AppIntf.pas similarity index 100% rename from php4AppIntf.pas rename to Source/php4AppIntf.pas diff --git a/php4AppUnit.pas b/Source/php4AppUnit.pas similarity index 100% rename from php4AppUnit.pas rename to Source/php4AppUnit.pas diff --git a/php4App_Icon.ico b/Source/php4App_Icon.ico similarity index 100% rename from php4App_Icon.ico rename to Source/php4App_Icon.ico diff --git a/php4Applications/PHP 4.4.6/php4App.dll b/Source/php4Applications/PHP 4.4.6/php4App.dll similarity index 100% rename from php4Applications/PHP 4.4.6/php4App.dll rename to Source/php4Applications/PHP 4.4.6/php4App.dll diff --git a/php4Applications/PHP 5.2.11/php4App.dll b/Source/php4Applications/PHP 5.2.11/php4App.dll similarity index 100% rename from php4Applications/PHP 5.2.11/php4App.dll rename to Source/php4Applications/PHP 5.2.11/php4App.dll diff --git a/php4Applications/PHP 5.3.0/php4App.dll b/Source/php4Applications/PHP 5.3.0/php4App.dll similarity index 100% rename from php4Applications/PHP 5.3.0/php4App.dll rename to Source/php4Applications/PHP 5.3.0/php4App.dll diff --git a/php4Applications/PHP4/php4App.dll b/Source/php4Applications/PHP4/php4App.dll similarity index 100% rename from php4Applications/PHP4/php4App.dll rename to Source/php4Applications/PHP4/php4App.dll diff --git a/php4Applications/PHP511/php4App.dll b/Source/php4Applications/PHP511/php4App.dll similarity index 100% rename from php4Applications/PHP511/php4App.dll rename to Source/php4Applications/PHP511/php4App.dll diff --git a/php4Applications/PHP512/php4App.dll b/Source/php4Applications/PHP512/php4App.dll similarity index 100% rename from php4Applications/PHP512/php4App.dll rename to Source/php4Applications/PHP512/php4App.dll diff --git a/php4Delphi2005.bdsgroup b/Source/php4Delphi2005.bdsgroup similarity index 97% rename from php4Delphi2005.bdsgroup rename to Source/php4Delphi2005.bdsgroup index 0b60915..5026922 100644 --- a/php4Delphi2005.bdsgroup +++ b/Source/php4Delphi2005.bdsgroup @@ -1,20 +1,20 @@ - - - - - - - - - - - - - php4DelphiR2005.bdsproj - php4DelphiD2005.bdsproj - php4DelphiR2005.bpl php4DelphiD2005.bpl - - - - + + + + + + + + + + + + + php4DelphiR2005.bdsproj + php4DelphiD2005.bdsproj + php4DelphiR2005.bpl php4DelphiD2005.bpl + + + + diff --git a/php4Delphi2006.bdsgroup b/Source/php4Delphi2006.bdsgroup similarity index 97% rename from php4Delphi2006.bdsgroup rename to Source/php4Delphi2006.bdsgroup index 2ddd51d..2e4aad3 100644 --- a/php4Delphi2006.bdsgroup +++ b/Source/php4Delphi2006.bdsgroup @@ -1,20 +1,20 @@ - - - - - - - - - - - - - php4DelphiR2006.bdsproj - PHP4DelphiD2006.bdsproj - php4DelphiR2006.bpl PHP4DelphiD2006.bpl - - - - + + + + + + + + + + + + + php4DelphiR2006.bdsproj + PHP4DelphiD2006.bdsproj + php4DelphiR2006.bpl PHP4DelphiD2006.bpl + + + + diff --git a/php4DelphiD2005.bdsproj b/Source/php4DelphiD2005.bdsproj similarity index 97% rename from php4DelphiD2005.bdsproj rename to Source/php4DelphiD2005.bdsproj index b9f3f2b..031f57f 100644 --- a/php4DelphiD2005.bdsproj +++ b/Source/php4DelphiD2005.bdsproj @@ -1,165 +1,165 @@ - - - - - - - - - - - - php4DelphiD2005.dpk - - - 7.0 - - - 8 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - - - 0 - 0 - 1 - False - False - False - 16384 - 1048576 - 4194304 - php4Delphi (design-time) - - - - - - - - rtl;vcl;dbrtl;vcldb;vclx;adortl;dbxcds;dbexpress;vclib;ibxpress;IntrawebDB_72_90;Intraweb_72_90;xmlrtl;vclie;inet;inetdbbde;inetdbxpress;indy;dclOfficeXP;VclSmp;dsnap;soaprtl;inetdb;bdertl;vcldbx;webdsnap;websnap;vclactnband;vclshlctrls;dsnapcon;teeui;teedb;tee;Rave60VCL;php4DelphiR2005 - - - False - - - - - - False - - - - - - False - - - - $00000000 - - - - True - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1049 - 1251 - - - 1.0.0.0 - 1.0.0.0 - - - + + + + + + + + + + + + php4DelphiD2005.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + php4Delphi (design-time) + + + + + + + + rtl;vcl;dbrtl;vcldb;vclx;adortl;dbxcds;dbexpress;vclib;ibxpress;IntrawebDB_72_90;Intraweb_72_90;xmlrtl;vclie;inet;inetdbbde;inetdbxpress;indy;dclOfficeXP;VclSmp;dsnap;soaprtl;inetdb;bdertl;vcldbx;webdsnap;websnap;vclactnband;vclshlctrls;dsnapcon;teeui;teedb;tee;Rave60VCL;php4DelphiR2005 + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + 1.0.0.0 + 1.0.0.0 + + + diff --git a/php4DelphiD2005.dpk b/Source/php4DelphiD2005.dpk similarity index 95% rename from php4DelphiD2005.dpk rename to Source/php4DelphiD2005.dpk index a31731e..c306478 100644 --- a/php4DelphiD2005.dpk +++ b/Source/php4DelphiD2005.dpk @@ -1,48 +1,48 @@ package php4DelphiD2005; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi (design-time)'} -{$DESIGNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (design-time)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + rrequires - rtl, - vcl, - designide, - vclactnband, - vclx, - php4DelphiR2005; - + rtl, + vcl, + designide, + vclactnband, + vclx, + php4DelphiR2005; + ocontains - PHPProjectWizard in 'PHPProjectWizard.pas', - php4DelphiReg in 'php4DelphiReg.pas', - php4DelphiWeb in 'php4DelphiWeb.pas', - phpWeb in 'phpWeb.pas', - phpAbout in 'phpAbout.pas' {dlgAbout}; - + PHPProjectWizard in 'PHPProjectWizard.pas', + php4DelphiReg in 'php4DelphiReg.pas', + php4DelphiWeb in 'php4DelphiWeb.pas', + phpWeb in 'phpWeb.pas', + phpAbout in 'phpAbout.pas' {dlgAbout}; + d. diff --git a/php4DelphiD2005.dproj b/Source/php4DelphiD2005.dproj similarity index 100% rename from php4DelphiD2005.dproj rename to Source/php4DelphiD2005.dproj diff --git a/php4DelphiD2005.dproj.local b/Source/php4DelphiD2005.dproj.local similarity index 100% rename from php4DelphiD2005.dproj.local rename to Source/php4DelphiD2005.dproj.local diff --git a/php4DelphiD2005.res b/Source/php4DelphiD2005.res similarity index 100% rename from php4DelphiD2005.res rename to Source/php4DelphiD2005.res diff --git a/php4DelphiD2005.stat b/Source/php4DelphiD2005.stat similarity index 100% rename from php4DelphiD2005.stat rename to Source/php4DelphiD2005.stat diff --git a/php4DelphiD2005_Icon.ico b/Source/php4DelphiD2005_Icon.ico similarity index 100% rename from php4DelphiD2005_Icon.ico rename to Source/php4DelphiD2005_Icon.ico diff --git a/php4DelphiD2007.dpk b/Source/php4DelphiD2007.dpk similarity index 100% rename from php4DelphiD2007.dpk rename to Source/php4DelphiD2007.dpk diff --git a/php4DelphiD2007.dproj b/Source/php4DelphiD2007.dproj similarity index 100% rename from php4DelphiD2007.dproj rename to Source/php4DelphiD2007.dproj diff --git a/php4DelphiD2007.dproj.local b/Source/php4DelphiD2007.dproj.local similarity index 100% rename from php4DelphiD2007.dproj.local rename to Source/php4DelphiD2007.dproj.local diff --git a/php4DelphiD2007.res b/Source/php4DelphiD2007.res similarity index 100% rename from php4DelphiD2007.res rename to Source/php4DelphiD2007.res diff --git a/php4DelphiD2007.stat b/Source/php4DelphiD2007.stat similarity index 100% rename from php4DelphiD2007.stat rename to Source/php4DelphiD2007.stat diff --git a/php4DelphiD2007_Icon.ico b/Source/php4DelphiD2007_Icon.ico similarity index 100% rename from php4DelphiD2007_Icon.ico rename to Source/php4DelphiD2007_Icon.ico diff --git a/php4DelphiD2009.dpk b/Source/php4DelphiD2009.dpk similarity index 100% rename from php4DelphiD2009.dpk rename to Source/php4DelphiD2009.dpk diff --git a/php4DelphiD2009.dproj b/Source/php4DelphiD2009.dproj similarity index 100% rename from php4DelphiD2009.dproj rename to Source/php4DelphiD2009.dproj diff --git a/php4DelphiD2009.dproj.local b/Source/php4DelphiD2009.dproj.local similarity index 100% rename from php4DelphiD2009.dproj.local rename to Source/php4DelphiD2009.dproj.local diff --git a/php4DelphiD2009.res b/Source/php4DelphiD2009.res similarity index 100% rename from php4DelphiD2009.res rename to Source/php4DelphiD2009.res diff --git a/php4DelphiD2009.stat b/Source/php4DelphiD2009.stat similarity index 100% rename from php4DelphiD2009.stat rename to Source/php4DelphiD2009.stat diff --git a/php4DelphiD2009_Icon.ico b/Source/php4DelphiD2009_Icon.ico similarity index 100% rename from php4DelphiD2009_Icon.ico rename to Source/php4DelphiD2009_Icon.ico diff --git a/php4DelphiD2010.dpk b/Source/php4DelphiD2010.dpk similarity index 100% rename from php4DelphiD2010.dpk rename to Source/php4DelphiD2010.dpk diff --git a/php4DelphiD2010.dproj b/Source/php4DelphiD2010.dproj similarity index 100% rename from php4DelphiD2010.dproj rename to Source/php4DelphiD2010.dproj diff --git a/php4DelphiD2010.dproj.local b/Source/php4DelphiD2010.dproj.local similarity index 100% rename from php4DelphiD2010.dproj.local rename to Source/php4DelphiD2010.dproj.local diff --git a/php4DelphiD2010.identcache b/Source/php4DelphiD2010.identcache similarity index 100% rename from php4DelphiD2010.identcache rename to Source/php4DelphiD2010.identcache diff --git a/php4DelphiD2010.res b/Source/php4DelphiD2010.res similarity index 100% rename from php4DelphiD2010.res rename to Source/php4DelphiD2010.res diff --git a/php4DelphiD2010.stat b/Source/php4DelphiD2010.stat similarity index 90% rename from php4DelphiD2010.stat rename to Source/php4DelphiD2010.stat index 8f85970..1d4bad9 100644 --- a/php4DelphiD2010.stat +++ b/Source/php4DelphiD2010.stat @@ -3,7 +3,7 @@ EditorSecs=287 DesignerSecs=1 InspectorSecs=1 CompileSecs=15416 -OtherSecs=174 +OtherSecs=107 StartTime=04.03.2019 21:55:53 RealKeys=0 EffectiveKeys=0 diff --git a/php4DelphiD2010_Icon.ico b/Source/php4DelphiD2010_Icon.ico similarity index 100% rename from php4DelphiD2010_Icon.ico rename to Source/php4DelphiD2010_Icon.ico diff --git a/php4DelphiD5.dpk b/Source/php4DelphiD5.dpk similarity index 95% rename from php4DelphiD5.dpk rename to Source/php4DelphiD5.dpk index 48e15ec..1a98ba0 100644 --- a/php4DelphiD5.dpk +++ b/Source/php4DelphiD5.dpk @@ -1,45 +1,45 @@ package php4DelphiD5; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi (Design)'} -{$DESIGNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (Design)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + requires - vcl, - php4DelphiR5, - dsnide50; - + vcl, + php4DelphiR5, + dsnide50; + contains - PHPProjectWizard in 'PHPProjectWizard.pas', - php4DelphiReg in 'php4DelphiReg.pas', - phpAbout in 'phpAbout.pas' {dlgAbout}, - phpWeb in 'phpWeb.pas', - php4DelphiWeb in 'php4DelphiWeb.pas'; - + PHPProjectWizard in 'PHPProjectWizard.pas', + php4DelphiReg in 'php4DelphiReg.pas', + phpAbout in 'phpAbout.pas' {dlgAbout}, + phpWeb in 'phpWeb.pas', + php4DelphiWeb in 'php4DelphiWeb.pas'; + END. diff --git a/php4DelphiD5.dproj b/Source/php4DelphiD5.dproj similarity index 100% rename from php4DelphiD5.dproj rename to Source/php4DelphiD5.dproj diff --git a/php4DelphiD5.dproj.local b/Source/php4DelphiD5.dproj.local similarity index 100% rename from php4DelphiD5.dproj.local rename to Source/php4DelphiD5.dproj.local diff --git a/php4DelphiD5.res b/Source/php4DelphiD5.res similarity index 100% rename from php4DelphiD5.res rename to Source/php4DelphiD5.res diff --git a/php4DelphiD5.stat b/Source/php4DelphiD5.stat similarity index 100% rename from php4DelphiD5.stat rename to Source/php4DelphiD5.stat diff --git a/php4DelphiD5_Icon.ico b/Source/php4DelphiD5_Icon.ico similarity index 100% rename from php4DelphiD5_Icon.ico rename to Source/php4DelphiD5_Icon.ico diff --git a/php4DelphiD6.dpk b/Source/php4DelphiD6.dpk similarity index 95% rename from php4DelphiD6.dpk rename to Source/php4DelphiD6.dpk index 7c1f4c3..fb713db 100644 --- a/php4DelphiD6.dpk +++ b/Source/php4DelphiD6.dpk @@ -1,45 +1,45 @@ package php4DelphiD6; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi'} -{$DESIGNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + rrequires - rtl, - designide, - php4DelphiR6; - + rtl, + designide, + php4DelphiR6; + ocontains - PHPProjectWizard in 'PHPProjectWizard.pas', - php4DelphiReg in 'php4DelphiReg.pas', - phpWeb in 'phpWeb.pas', - php4DelphiWeb in 'php4DelphiWeb.pas', - phpAbout in 'phpAbout.pas' {dlgAbout}; - + PHPProjectWizard in 'PHPProjectWizard.pas', + php4DelphiReg in 'php4DelphiReg.pas', + phpWeb in 'phpWeb.pas', + php4DelphiWeb in 'php4DelphiWeb.pas', + phpAbout in 'phpAbout.pas' {dlgAbout}; + d. diff --git a/php4DelphiD6.dproj b/Source/php4DelphiD6.dproj similarity index 100% rename from php4DelphiD6.dproj rename to Source/php4DelphiD6.dproj diff --git a/php4DelphiD6.dproj.local b/Source/php4DelphiD6.dproj.local similarity index 100% rename from php4DelphiD6.dproj.local rename to Source/php4DelphiD6.dproj.local diff --git a/php4DelphiD6.res b/Source/php4DelphiD6.res similarity index 100% rename from php4DelphiD6.res rename to Source/php4DelphiD6.res diff --git a/php4DelphiD6.stat b/Source/php4DelphiD6.stat similarity index 100% rename from php4DelphiD6.stat rename to Source/php4DelphiD6.stat diff --git a/php4DelphiD6_Icon.ico b/Source/php4DelphiD6_Icon.ico similarity index 100% rename from php4DelphiD6_Icon.ico rename to Source/php4DelphiD6_Icon.ico diff --git a/php4DelphiD7.dpk b/Source/php4DelphiD7.dpk similarity index 95% rename from php4DelphiD7.dpk rename to Source/php4DelphiD7.dpk index 68906e2..d19798b 100644 --- a/php4DelphiD7.dpk +++ b/Source/php4DelphiD7.dpk @@ -1,48 +1,48 @@ package php4DelphiD7; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi (design-time)'} -{$DESIGNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (design-time)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + requires - rtl, - vcl, - designide, - vclactnband, - vclx, - php4DelphiR7; - + rtl, + vcl, + designide, + vclactnband, + vclx, + php4DelphiR7; + contains - PHPProjectWizard in 'PHPProjectWizard.pas', - php4DelphiReg in 'php4DelphiReg.pas', - php4DelphiWeb in 'php4DelphiWeb.pas', - phpWeb in 'phpWeb.pas', - phpAbout in 'phpAbout.pas' {dlgAbout}; - + PHPProjectWizard in 'PHPProjectWizard.pas', + php4DelphiReg in 'php4DelphiReg.pas', + php4DelphiWeb in 'php4DelphiWeb.pas', + phpWeb in 'phpWeb.pas', + phpAbout in 'phpAbout.pas' {dlgAbout}; + end. diff --git a/php4DelphiD7.dproj b/Source/php4DelphiD7.dproj similarity index 100% rename from php4DelphiD7.dproj rename to Source/php4DelphiD7.dproj diff --git a/php4DelphiD7.dproj.local b/Source/php4DelphiD7.dproj.local similarity index 100% rename from php4DelphiD7.dproj.local rename to Source/php4DelphiD7.dproj.local diff --git a/php4DelphiD7.res b/Source/php4DelphiD7.res similarity index 100% rename from php4DelphiD7.res rename to Source/php4DelphiD7.res diff --git a/php4DelphiD7.stat b/Source/php4DelphiD7.stat similarity index 100% rename from php4DelphiD7.stat rename to Source/php4DelphiD7.stat diff --git a/php4DelphiD7_Icon.ico b/Source/php4DelphiD7_Icon.ico similarity index 100% rename from php4DelphiD7_Icon.ico rename to Source/php4DelphiD7_Icon.ico diff --git a/php4DelphiR2005.bdsproj b/Source/php4DelphiR2005.bdsproj similarity index 97% rename from php4DelphiR2005.bdsproj rename to Source/php4DelphiR2005.bdsproj index 95bf597..d142614 100644 --- a/php4DelphiR2005.bdsproj +++ b/Source/php4DelphiR2005.bdsproj @@ -1,165 +1,165 @@ - - - - - - - - - - - - php4DelphiR2005.dpk - - - 7.0 - - - 8 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - - - 0 - 0 - 1 - False - False - False - 16384 - 1048576 - 4194304 - php4Delphi (run-rime) - - - - - - - - rtl;vcl;dbrtl;vcldb;vclx;adortl;dbxcds;dbexpress;vclib;ibxpress;IntrawebDB_72_90;Intraweb_72_90;xmlrtl;vclie;inet;inetdbbde;inetdbxpress;indy;dclOfficeXP;VclSmp;dsnap;soaprtl;inetdb;bdertl;vcldbx;webdsnap;websnap;vclactnband;vclshlctrls;dsnapcon;teeui;teedb;tee;Rave60VCL;php4DelphiR2005 - - - False - - - - - - False - - - - - - False - - - - $00000000 - - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1049 - 1251 - - - 1.0.0.0 - 1.0.0.0 - - - + + + + + + + + + + + + php4DelphiR2005.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + php4Delphi (run-rime) + + + + + + + + rtl;vcl;dbrtl;vcldb;vclx;adortl;dbxcds;dbexpress;vclib;ibxpress;IntrawebDB_72_90;Intraweb_72_90;xmlrtl;vclie;inet;inetdbbde;inetdbxpress;indy;dclOfficeXP;VclSmp;dsnap;soaprtl;inetdb;bdertl;vcldbx;webdsnap;websnap;vclactnband;vclshlctrls;dsnapcon;teeui;teedb;tee;Rave60VCL;php4DelphiR2005 + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + 1.0.0.0 + 1.0.0.0 + + + diff --git a/php4DelphiR2005.dpk b/Source/php4DelphiR2005.dpk similarity index 95% rename from php4DelphiR2005.dpk rename to Source/php4DelphiR2005.dpk index 5b88e5d..4385116 100644 --- a/php4DelphiR2005.dpk +++ b/Source/php4DelphiR2005.dpk @@ -1,51 +1,51 @@ package php4DelphiR2005; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi (run-rime)'} -{$RUNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (run-rime)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + rrequires - rtl, - vcl; - + rtl, + vcl; + ocontains - ZENDAPI in 'ZENDAPI.pas', - DelphiFunctions in 'DelphiFunctions.pas', - php4delphi in 'php4delphi.pas', - PHPAPI in 'PHPAPI.pas', - phpModules in 'phpModules.pas', - PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', - PHPFunctions in 'PHPFunctions.pas', - PHPTypes in 'PHPTypes.pas', - ZENDTypes in 'ZENDTypes.pas', - phpClass in 'phpClass.pas', - PHPCommon in 'PHPCommon.pas'; - + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + PHPCommon in 'PHPCommon.pas'; + d. diff --git a/php4DelphiR2005.dproj b/Source/php4DelphiR2005.dproj similarity index 100% rename from php4DelphiR2005.dproj rename to Source/php4DelphiR2005.dproj diff --git a/php4DelphiR2005.dproj.local b/Source/php4DelphiR2005.dproj.local similarity index 100% rename from php4DelphiR2005.dproj.local rename to Source/php4DelphiR2005.dproj.local diff --git a/php4DelphiR2005.res b/Source/php4DelphiR2005.res similarity index 100% rename from php4DelphiR2005.res rename to Source/php4DelphiR2005.res diff --git a/php4DelphiR2005.stat b/Source/php4DelphiR2005.stat similarity index 100% rename from php4DelphiR2005.stat rename to Source/php4DelphiR2005.stat diff --git a/php4DelphiR2005_Icon.ico b/Source/php4DelphiR2005_Icon.ico similarity index 100% rename from php4DelphiR2005_Icon.ico rename to Source/php4DelphiR2005_Icon.ico diff --git a/php4DelphiR2006.bdsproj b/Source/php4DelphiR2006.bdsproj similarity index 100% rename from php4DelphiR2006.bdsproj rename to Source/php4DelphiR2006.bdsproj diff --git a/php4DelphiR2006.dpk b/Source/php4DelphiR2006.dpk similarity index 95% rename from php4DelphiR2006.dpk rename to Source/php4DelphiR2006.dpk index d011f16..124371d 100644 --- a/php4DelphiR2006.dpk +++ b/Source/php4DelphiR2006.dpk @@ -1,51 +1,51 @@ package php4DelphiR2006; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi (run-rime)'} -{$RUNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (run-rime)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + rrequires - rtl, - vcl; - + rtl, + vcl; + ocontains - ZENDAPI in 'ZENDAPI.pas', - DelphiFunctions in 'DelphiFunctions.pas', - php4delphi in 'php4delphi.pas', - PHPAPI in 'PHPAPI.pas', - phpModules in 'phpModules.pas', - PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', - PHPFunctions in 'PHPFunctions.pas', - PHPTypes in 'PHPTypes.pas', - ZENDTypes in 'ZENDTypes.pas', - phpClass in 'phpClass.pas', - PHPCommon in 'PHPCommon.pas'; - + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + PHPCommon in 'PHPCommon.pas'; + d. diff --git a/php4DelphiR2006.dproj b/Source/php4DelphiR2006.dproj similarity index 100% rename from php4DelphiR2006.dproj rename to Source/php4DelphiR2006.dproj diff --git a/php4DelphiR2006.dproj.local b/Source/php4DelphiR2006.dproj.local similarity index 100% rename from php4DelphiR2006.dproj.local rename to Source/php4DelphiR2006.dproj.local diff --git a/php4DelphiR2006.res b/Source/php4DelphiR2006.res similarity index 100% rename from php4DelphiR2006.res rename to Source/php4DelphiR2006.res diff --git a/php4DelphiR2006.stat b/Source/php4DelphiR2006.stat similarity index 100% rename from php4DelphiR2006.stat rename to Source/php4DelphiR2006.stat diff --git a/php4DelphiR2006_Icon.ico b/Source/php4DelphiR2006_Icon.ico similarity index 100% rename from php4DelphiR2006_Icon.ico rename to Source/php4DelphiR2006_Icon.ico diff --git a/php4DelphiR2007.bpl b/Source/php4DelphiR2007.bpl similarity index 100% rename from php4DelphiR2007.bpl rename to Source/php4DelphiR2007.bpl diff --git a/php4DelphiR2007.dpk b/Source/php4DelphiR2007.dpk similarity index 100% rename from php4DelphiR2007.dpk rename to Source/php4DelphiR2007.dpk diff --git a/php4DelphiR2007.dproj b/Source/php4DelphiR2007.dproj similarity index 100% rename from php4DelphiR2007.dproj rename to Source/php4DelphiR2007.dproj diff --git a/php4DelphiR2007.dproj.local b/Source/php4DelphiR2007.dproj.local similarity index 100% rename from php4DelphiR2007.dproj.local rename to Source/php4DelphiR2007.dproj.local diff --git a/php4DelphiR2007.res b/Source/php4DelphiR2007.res similarity index 100% rename from php4DelphiR2007.res rename to Source/php4DelphiR2007.res diff --git a/php4DelphiR2007.stat b/Source/php4DelphiR2007.stat similarity index 100% rename from php4DelphiR2007.stat rename to Source/php4DelphiR2007.stat diff --git a/php4DelphiR2007_Icon.ico b/Source/php4DelphiR2007_Icon.ico similarity index 100% rename from php4DelphiR2007_Icon.ico rename to Source/php4DelphiR2007_Icon.ico diff --git a/php4DelphiR2009.dpk b/Source/php4DelphiR2009.dpk similarity index 100% rename from php4DelphiR2009.dpk rename to Source/php4DelphiR2009.dpk diff --git a/php4DelphiR2009.dproj b/Source/php4DelphiR2009.dproj similarity index 100% rename from php4DelphiR2009.dproj rename to Source/php4DelphiR2009.dproj diff --git a/php4DelphiR2009.dproj.local b/Source/php4DelphiR2009.dproj.local similarity index 100% rename from php4DelphiR2009.dproj.local rename to Source/php4DelphiR2009.dproj.local diff --git a/php4DelphiR2009.res b/Source/php4DelphiR2009.res similarity index 100% rename from php4DelphiR2009.res rename to Source/php4DelphiR2009.res diff --git a/php4DelphiR2009.stat b/Source/php4DelphiR2009.stat similarity index 100% rename from php4DelphiR2009.stat rename to Source/php4DelphiR2009.stat diff --git a/php4DelphiR2009_Icon.ico b/Source/php4DelphiR2009_Icon.ico similarity index 100% rename from php4DelphiR2009_Icon.ico rename to Source/php4DelphiR2009_Icon.ico diff --git a/php4DelphiR2010.dpk b/Source/php4DelphiR2010.dpk similarity index 100% rename from php4DelphiR2010.dpk rename to Source/php4DelphiR2010.dpk diff --git a/php4DelphiR2010.dproj b/Source/php4DelphiR2010.dproj similarity index 100% rename from php4DelphiR2010.dproj rename to Source/php4DelphiR2010.dproj diff --git a/php4DelphiR2010.dproj.local b/Source/php4DelphiR2010.dproj.local similarity index 100% rename from php4DelphiR2010.dproj.local rename to Source/php4DelphiR2010.dproj.local diff --git a/php4DelphiR2010.identcache b/Source/php4DelphiR2010.identcache similarity index 100% rename from php4DelphiR2010.identcache rename to Source/php4DelphiR2010.identcache diff --git a/php4DelphiR2010.stat b/Source/php4DelphiR2010.stat similarity index 100% rename from php4DelphiR2010.stat rename to Source/php4DelphiR2010.stat diff --git a/php4DelphiR2010_Icon.ico b/Source/php4DelphiR2010_Icon.ico similarity index 100% rename from php4DelphiR2010_Icon.ico rename to Source/php4DelphiR2010_Icon.ico diff --git a/php4DelphiR5.dpk b/Source/php4DelphiR5.dpk similarity index 96% rename from php4DelphiR5.dpk rename to Source/php4DelphiR5.dpk index 83d6866..e1c6298 100644 --- a/php4DelphiR5.dpk +++ b/Source/php4DelphiR5.dpk @@ -1,50 +1,50 @@ package php4DelphiR5; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'PHP4Delphi (run-time)'} -{$RUNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'PHP4Delphi (run-time)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + requires - vcl; - + vcl; + contains - ZENDAPI in 'ZENDAPI.pas', - DelphiFunctions in 'DelphiFunctions.pas', - php4delphi in 'php4delphi.pas', - PHPAPI in 'PHPAPI.pas', - PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', - phpFunctions in 'phpFunctions.pas', - PHPTypes in 'PHPTypes.pas', - ZENDTypes in 'ZENDTypes.pas', - phpClass in 'phpClass.pas', - phpModules in 'phpModules.pas', - PHPCommon in 'PHPCommon.pas'; - + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + phpFunctions in 'phpFunctions.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + phpModules in 'phpModules.pas', + PHPCommon in 'PHPCommon.pas'; + END. diff --git a/php4DelphiR5.dproj b/Source/php4DelphiR5.dproj similarity index 100% rename from php4DelphiR5.dproj rename to Source/php4DelphiR5.dproj diff --git a/php4DelphiR5.dproj.local b/Source/php4DelphiR5.dproj.local similarity index 100% rename from php4DelphiR5.dproj.local rename to Source/php4DelphiR5.dproj.local diff --git a/php4DelphiR5.identcache b/Source/php4DelphiR5.identcache similarity index 100% rename from php4DelphiR5.identcache rename to Source/php4DelphiR5.identcache diff --git a/php4DelphiR5.res b/Source/php4DelphiR5.res similarity index 100% rename from php4DelphiR5.res rename to Source/php4DelphiR5.res diff --git a/php4DelphiR5.stat b/Source/php4DelphiR5.stat similarity index 100% rename from php4DelphiR5.stat rename to Source/php4DelphiR5.stat diff --git a/php4DelphiR5_Icon.ico b/Source/php4DelphiR5_Icon.ico similarity index 100% rename from php4DelphiR5_Icon.ico rename to Source/php4DelphiR5_Icon.ico diff --git a/php4DelphiR6.dpk b/Source/php4DelphiR6.dpk similarity index 95% rename from php4DelphiR6.dpk rename to Source/php4DelphiR6.dpk index 408d3a0..b96a100 100644 --- a/php4DelphiR6.dpk +++ b/Source/php4DelphiR6.dpk @@ -1,51 +1,51 @@ package php4DelphiR6; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi (run-time)'} -{$RUNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (run-time)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + rrequires - rtl, - vcl; - + rtl, + vcl; + ocontains - ZENDAPI in 'ZENDAPI.pas', - DelphiFunctions in 'DelphiFunctions.pas', - php4delphi in 'php4delphi.pas', - PHPAPI in 'PHPAPI.pas', - phpModules in 'phpModules.pas', - PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', - PHPFunctions in 'PHPFunctions.pas', - ZendTypes in 'ZendTypes.pas', - phpTypes in 'phpTypes.pas', - phpClass in 'phpClass.pas', - PHPCommon in 'PHPCommon.pas'; - + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + ZendTypes in 'ZendTypes.pas', + phpTypes in 'phpTypes.pas', + phpClass in 'phpClass.pas', + PHPCommon in 'PHPCommon.pas'; + d. diff --git a/php4DelphiR6.dproj b/Source/php4DelphiR6.dproj similarity index 100% rename from php4DelphiR6.dproj rename to Source/php4DelphiR6.dproj diff --git a/php4DelphiR6.dproj.local b/Source/php4DelphiR6.dproj.local similarity index 100% rename from php4DelphiR6.dproj.local rename to Source/php4DelphiR6.dproj.local diff --git a/php4DelphiR6.res b/Source/php4DelphiR6.res similarity index 100% rename from php4DelphiR6.res rename to Source/php4DelphiR6.res diff --git a/php4DelphiR6.stat b/Source/php4DelphiR6.stat similarity index 100% rename from php4DelphiR6.stat rename to Source/php4DelphiR6.stat diff --git a/php4DelphiR6_Icon.ico b/Source/php4DelphiR6_Icon.ico similarity index 100% rename from php4DelphiR6_Icon.ico rename to Source/php4DelphiR6_Icon.ico diff --git a/php4DelphiR7.dpk b/Source/php4DelphiR7.dpk similarity index 95% rename from php4DelphiR7.dpk rename to Source/php4DelphiR7.dpk index c9c30ff..cbc7fef 100644 --- a/php4DelphiR7.dpk +++ b/Source/php4DelphiR7.dpk @@ -1,51 +1,51 @@ package php4DelphiR7; {$R *.res} -{$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES ON} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'php4Delphi (run-rime)'} -{$RUNONLY} -{$IMPLICITBUILD OFF} - +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (run-rime)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + requires - rtl, - vcl; - + rtl, + vcl; + contains - ZENDAPI in 'ZENDAPI.pas', - DelphiFunctions in 'DelphiFunctions.pas', - php4delphi in 'php4delphi.pas', - PHPAPI in 'PHPAPI.pas', - phpModules in 'phpModules.pas', - PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', - PHPFunctions in 'PHPFunctions.pas', - PHPTypes in 'PHPTypes.pas', - ZENDTypes in 'ZENDTypes.pas', - phpClass in 'phpClass.pas', - PHPCommon in 'PHPCommon.pas'; - + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', + PHPLibrary in 'PHPLibrary.pas', + phpCustomLibrary in 'phpCustomLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + PHPCommon in 'PHPCommon.pas'; + end. diff --git a/php4DelphiR7.dproj b/Source/php4DelphiR7.dproj similarity index 100% rename from php4DelphiR7.dproj rename to Source/php4DelphiR7.dproj diff --git a/php4DelphiR7.dproj.local b/Source/php4DelphiR7.dproj.local similarity index 100% rename from php4DelphiR7.dproj.local rename to Source/php4DelphiR7.dproj.local diff --git a/php4DelphiR7.identcache b/Source/php4DelphiR7.identcache similarity index 100% rename from php4DelphiR7.identcache rename to Source/php4DelphiR7.identcache diff --git a/php4DelphiR7.res b/Source/php4DelphiR7.res similarity index 100% rename from php4DelphiR7.res rename to Source/php4DelphiR7.res diff --git a/php4DelphiR7.stat b/Source/php4DelphiR7.stat similarity index 100% rename from php4DelphiR7.stat rename to Source/php4DelphiR7.stat diff --git a/php4DelphiR7_Icon.ico b/Source/php4DelphiR7_Icon.ico similarity index 100% rename from php4DelphiR7_Icon.ico rename to Source/php4DelphiR7_Icon.ico diff --git a/php4DelphiReg.pas b/Source/php4DelphiReg.pas similarity index 100% rename from php4DelphiReg.pas rename to Source/php4DelphiReg.pas diff --git a/php4DelphiSplash.res b/Source/php4DelphiSplash.res similarity index 100% rename from php4DelphiSplash.res rename to Source/php4DelphiSplash.res diff --git a/php4DelphiWeb.pas b/Source/php4DelphiWeb.pas similarity index 100% rename from php4DelphiWeb.pas rename to Source/php4DelphiWeb.pas diff --git a/php4delphi.cnt b/Source/php4delphi.cnt similarity index 97% rename from php4delphi.cnt rename to Source/php4delphi.cnt index 4f5b776..6f05ded 100644 --- a/php4delphi.cnt +++ b/Source/php4delphi.cnt @@ -1,19 +1,19 @@ -:Base php4delphi.hlp>MAIN -:Title php4Delphi help system -1 php4Delphi Units -2 php4delphi unit=php4delphi_unit -2 phpFunctions unit=phpfunctions_unit -2 phpLibrary unit=phplibrary_unit -1 php4Delphi Components -2 TpsvPHP component=TpsvPHP_Component -2 TPHPLibrary component=TPHPLibrary_component -1 php4Delphi Classes -2 TPHPVariable class=TPHPVariable_component -2 TPHPVariables class=TPHPVariables_component -2 TPHPConstant class=TPHPConstant_component -2 TPHPConstants class=TPHPConstants_component -2 TPHPFunction class=TPHPFunction_component -2 TPHPFunctions class=TPHPFunctions_component -2 TFunctionParam class=TFunctionParam_component -2 TFunctionParams class=TFunctionParams_component -2 TZendVariable class=TZendVariable_component +:Base php4delphi.hlp>MAIN +:Title php4Delphi help system +1 php4Delphi Units +2 php4delphi unit=php4delphi_unit +2 phpFunctions unit=phpfunctions_unit +2 phpLibrary unit=phplibrary_unit +1 php4Delphi Components +2 TpsvPHP component=TpsvPHP_Component +2 TPHPLibrary component=TPHPLibrary_component +1 php4Delphi Classes +2 TPHPVariable class=TPHPVariable_component +2 TPHPVariables class=TPHPVariables_component +2 TPHPConstant class=TPHPConstant_component +2 TPHPConstants class=TPHPConstants_component +2 TPHPFunction class=TPHPFunction_component +2 TPHPFunctions class=TPHPFunctions_component +2 TFunctionParam class=TFunctionParam_component +2 TFunctionParams class=TFunctionParams_component +2 TZendVariable class=TZendVariable_component diff --git a/php4delphi.dcr b/Source/php4delphi.dcr similarity index 100% rename from php4delphi.dcr rename to Source/php4delphi.dcr diff --git a/php4delphi.pas b/Source/php4delphi.pas similarity index 100% rename from php4delphi.pas rename to Source/php4delphi.pas diff --git a/phpAbout.dfm b/Source/phpAbout.dfm similarity index 100% rename from phpAbout.dfm rename to Source/phpAbout.dfm diff --git a/phpAbout.pas b/Source/phpAbout.pas similarity index 100% rename from phpAbout.pas rename to Source/phpAbout.pas diff --git a/phpApp.pas b/Source/phpApp.pas similarity index 100% rename from phpApp.pas rename to Source/phpApp.pas diff --git a/phpClass.pas b/Source/phpClass.pas similarity index 100% rename from phpClass.pas rename to Source/phpClass.pas diff --git a/phpModules.pas b/Source/phpModules.pas similarity index 100% rename from phpModules.pas rename to Source/phpModules.pas diff --git a/phpWeb.pas b/Source/phpWeb.pas similarity index 100% rename from phpWeb.pas rename to Source/phpWeb.pas diff --git a/zend_dynamic_array.pas b/Source/zend_dynamic_array.pas similarity index 100% rename from zend_dynamic_array.pas rename to Source/zend_dynamic_array.pas From 59885e20b4cb97bc0d00d7cbecb9163bd7f01815 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 4 Mar 2019 23:16:19 +0200 Subject: [PATCH 07/54] Moved --- php4DelphiR2010.res => Source/php4DelphiR2010.res | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename php4DelphiR2010.res => Source/php4DelphiR2010.res (100%) diff --git a/php4DelphiR2010.res b/Source/php4DelphiR2010.res similarity index 100% rename from php4DelphiR2010.res rename to Source/php4DelphiR2010.res From fa021348ecd772f5f3111b64814bff095ffc9859 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 5 Mar 2019 00:24:42 +0200 Subject: [PATCH 08/54] Converted help file --- php4delphi.chm | Bin 0 -> 41012 bytes Source/php4delphi.cnt => php4delphi.cnt | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 php4delphi.chm rename Source/php4delphi.cnt => php4delphi.cnt (100%) diff --git a/php4delphi.chm b/php4delphi.chm new file mode 100644 index 0000000000000000000000000000000000000000..e2c03609796fbc0319c70f27c3c461cced8e0594 GIT binary patch literal 41012 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 literal 0 HcmV?d00001 diff --git a/Source/php4delphi.cnt b/php4delphi.cnt similarity index 100% rename from Source/php4delphi.cnt rename to php4delphi.cnt From 0d547964e0e7140547dab050933732aa5c58c6db Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 5 Mar 2019 01:01:58 +0200 Subject: [PATCH 09/54] Some updates --- Source/php4DelphiR2010.stat | 4 ++-- Source/php4delphi.pas | 3 ++- php4delphi.chw | Bin 0 -> 18251 bytes 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 php4delphi.chw diff --git a/Source/php4DelphiR2010.stat b/Source/php4DelphiR2010.stat index b978fd4..e17819a 100644 --- a/Source/php4DelphiR2010.stat +++ b/Source/php4DelphiR2010.stat @@ -1,9 +1,9 @@ [Stats] -EditorSecs=2911 +EditorSecs=2805 DesignerSecs=1 InspectorSecs=3 CompileSecs=63757 -OtherSecs=325 +OtherSecs=299 StartTime=29.07.4016 22:02:01 RealKeys=0 EffectiveKeys=0 diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 7c12600..e44832e 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -40,6 +40,7 @@ interface PHPCommon, WinApi.WinSock, ZendTypes, PHPTypes, PHPAPI, ZENDAPI, DelphiFunctions, phpFunctions, strUtils, varUtils, + {$IFDEF soulengine_build} VCL.Dialogs, {$ENDIF} System.UITypes; type @@ -924,6 +925,7 @@ function php_delphi_log_message(msg : Pchar) : integer; cdecl; MessageBox(0, msg, 'PHP4Delphi', MB_OK); result := 0; end; +{$ENDIF} { Request sender/dispatcher } {$IFDEF PHP510} @@ -961,7 +963,6 @@ procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; end; end; -{$ENDIF} { TpsvCustomPHP } constructor TpsvCustomPHP.Create(AOwner: TComponent); diff --git a/php4delphi.chw b/php4delphi.chw new file mode 100644 index 0000000000000000000000000000000000000000..58d0e2bf16a4f972d11c2dd0abca35b366ceec4a GIT binary patch literal 18251 zcmeHOU2Ggz6~0bW8V5(LOPZ2^gK<+QY2&V)7#yc*>3Y{c+xQRfALA9u@sx(*X zPuugQx!lJ)zWWA+n%%s)8$GtE$K zMc(51W?uhZ-MI9+zQdneA&>Kf&0H887(dWk!R&?qvv_d-enh`5r~3Py<#qiscrvWs zL}SR^q>}i36Q>ORY~j7mvG&`hx;2{NG@@n^_7_yO_E3)ObyS6r7DB6GID%x64#2$& znD+~A8=gD33G|yr&+|w!-o|kc2!7Wpeg=9kV!SGnQx2&r>m_L|-YqOnD55gJ+CUGh zB^*PNla2e?d44!l^);EO-`1@-~i=2l_E# ztO%p=N|4bCbW#|f6Gr11rv>@EAWwkHRi^#@o=2Nz1pigRpTSHE@TN81Yy-bKC(KvC z90DtY`Lftq&qqEiyzgt?vYLc$!K=4jkk^5%l}trwM-8j06CRw>b1UJhksp6j`uJsF z9~InnH>Vs5VQoWd8{|$%2jniu6y!7{2e|}Uf;<7C75@mKh6VV1Rcy`c1+A%j1gF#* z5#Cz?JikutKQ4IIWzPOc!oQYLUIy)xtf1S09tPgV3YOFyG#`e&%6gr+O5VnCT7u_i&5xPh1GNLg%Y$&Vx59VV$!%3 z%$<;nkVmDL<<(v+tQz-J5<4=1-we)YAQkOfWz5CK3kCOfGB8F_w_fS>6RW-Y_jb^X z+J*HjSYvvGw6^q`2L-Vvg!O`tMV&8UH&FASD0H9jUe-Jda~gN~YS2i>gz+jEjM8cJ zy@WlQ!HnIF5%hLoI|ctkjZa`jm@ntuP@LnTdPI;v(?~}DJhb*UuG|jbx*&^?r-bus zcHnCJ)NXx6Esmil8y=CsFJB0AI$pTII3;~t`ua02#(|oJ2QY>&!y=4(Jo7fPW`ySEckKQDXVS9m2~!A{V0r)9POyE+;v(4wq`Au zMo){-z}qxS*zrI%vrHNM1$dOVk;|ye;|bw<_uu+sGm?{^YQS$kI&%TpC1Jbs^jiD? zz}1LnKH>2yc++}*tPF-4#!q7D7d(E-!=W#;V)J`4kt@RZyob>^o0bIs72uggOYl`j zn_5oo)Sr8D7}47}mJ;qa^jKq<)d*J1or5Z>8UK{i_dPuG@$81Xq8EX9VE!w{<)xYcb{q*@=;YyuZ}(Hj=9tW5~WK>>_5$ z)n`@6SnF*EaM=n5Yj?hXux-4@aj2@ zS@~yoKy`ZRix&M+k8{>6VebT+Ymh+?vKbqT^_pyo7FXpvy=SQt>3ETF`n~y zD1cvklPbgOlJJ6!^vArx{vMM4@|Zj0d2=6RmLY3Gv$)$h7I&<-X-x%tW)<7`&5Buz zoGh>#&Ht~rbZ8F07`UV0dT%RLjNz>ln&&h6DRsLhyp7eL*e*K1GMAG5*;RI2$IraS zuKRm_kKb1y!ov88Zpar#1{jY^wMUvA}b4WzoohEOw@c#Ru|-bua39ghr7(7CH|teh}^u?{n6H(e6$A2j#he-B_xqfUR-{Y@j5P1o&0m-;v*`c7fp z0++YI2x0|k-yyt^i|5aM^`r5fnxl3!VFis=dk??I#q(y$`mv^DtN|CtpKa<{n}ii> z!V1!GoA5rOc_r+h%VN#?G42xVIgNGR@*7w2%pJ7ZMUCG0_nXtgTLSMmq9ni9)xKTT z>vUGoPYRm#j(?tTEVK}!Mo85vmuG;dRp(Ln_#-g!%)HFH%zm83mpyp@2t@D=fX9~v z>3rRCzEU->75R=q=C=cw&A!&K0wC`P0lXj$Ssf66190J+DevAc-1&jrZ1&jrZ1^#<1p#PLA1by~EzW&DS$g?-D zw?B76y*BmAr!&tXfxn5$uM1N9+kv>1m}d23LAFCwr}Jl9yvOedyv4?I-fIQ-qt9%5 z7R%a&ewR zsg>RD+rKUW3KimoOi``u*b-hBZIzRSN~T!OhaL4x-RIv1=gPoH^x)ya{@$L!*rC3j zzP=dFh7Jz&^!7%2ql10JgVBNL)o{E}sU{04o0H)B=KjM&%-9vXY9(jq{qKYr+caYV zV*z6UV*z6UV*z6UV*z6UV*z6UV*z6UV*z6UV*z6UV*z6UV*z6UV*z6UV*z6UV*z6U RV}UvgyxQ^`{Qr}7^)G6X;l2O> literal 0 HcmV?d00001 From 0b7e66d289d9d7b2adcc2648bb582eba059a940f Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 5 Mar 2019 11:44:53 +0200 Subject: [PATCH 10/54] Update readme.txt --- readme.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/readme.txt b/readme.txt index 316d066..dea8fcd 100644 --- a/readme.txt +++ b/readme.txt @@ -39,7 +39,6 @@ History: * Compatible with PHP 5.6.0 * Compatible with PHP 5.6 * Compatible with Delphi 2011, XE8, Seattle, Berlin -* Deleted Sample Class * Added Partial Unicode Support 7.3 Jan 2019 From 0fdbc50841595b75545431b289975278733f4e2d Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 5 Mar 2019 13:17:50 +0200 Subject: [PATCH 11/54] Some php7 migration PHP7 is coming! --- Source/PHP.INC | 6 +- Source/ZENDAPI.pas | 129 +++++++++++++++++++++++++++++-------------- Source/ZendTypes.pas | 12 ++-- 3 files changed, 99 insertions(+), 48 deletions(-) diff --git a/Source/PHP.INC b/Source/PHP.INC index 3f7ef73..73c7da3 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -62,7 +62,7 @@ backward compatibility between PHP versions. {$DEFINE ZEND_WIN32} {$DEFINE PHP_COMPILER_ID} {$ENDIF} - {$IFDEF PHP700} + {$IFDEF PHP7} {$DEFINE COMPILER_VC14} {$DEFINE PHP560} {$ENDIF} @@ -84,7 +84,9 @@ backward compatibility between PHP versions. {$IFDEF PHP_COMPILER_ID} {.$DEFINE COMPILER_VC6} {$DEFINE COMPILER_VC9} - {$IFDEF PHP550} {$DEFINE COMPILER_VC11} {$ENDIF} + {$IFNDEF PHP7} + {$IFDEF PHP550} {$DEFINE COMPILER_VC11} {$ENDIF} + {$ENDIF} {$ENDIF} {$IFDEF PHP5} diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index f9f353f..287cdd8 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -32,7 +32,7 @@ interface const PHPWin = {$IFDEF PHP_DEBUG} -{$IFDEF PHP700} +{$IFDEF PHP7} 'php7phpdbg.dll' {$ELSE} {$IFDEF PHP5} @@ -43,7 +43,7 @@ interface {$ENDIF} {$ELSE} {$IFDEF PHP5} - {$IFDEF PHP700} + {$IFDEF PHP7} {$IFDEF LINUX} 'php7ts.so' {$ENDIF} @@ -86,10 +86,10 @@ function ZENDLoaded: boolean; {Memory management functions} var - {$IFDEF PHP700} - zend_strndup : function(const s: PChar; length: integer): PChar; cdecl; - {$ELSE} + {$IFNDEF PHP7} zend_strndup : function(s: PAnsiChar; length: Integer): PAnsiChar; cdecl; + {$ELSE} + zend_strndup : function(s:PAnsiChar; length:size_t):PAnsiChar; cdecl; {$ENDIF} _emalloc : function(size: size_t; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; _efree : procedure(ptr: pointer; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint); cdecl; @@ -119,9 +119,9 @@ function STR_EMPTY_ALLOC : PAnsiChar; var zend_register_resource : function (rsrc_result : pzval; rsrc_pointer : pointer; rsrc_type : integer) : integer; cdecl; - zend_fetch_resource : function (passed_id : ppzval; TSRMLS_DC : pointer; default_id : integer; resource_type_name : PAnsiChar; found_resource_type : pointer; num_resource_types: integer; resource_type: integer) : pointer; cdecl; + zend_fetch_resource : function (passed_id :{$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; TSRMLS_DC : pointer; default_id : integer; resource_type_name : PAnsiChar; found_resource_type : pointer; num_resource_types: integer; resource_type: integer) : pointer; cdecl; zend_list_insert : function (ptr : pointer; _type: integer) : integer; cdecl; - {$IFNDEF PHP700} + {$IFNDEF PHP7} _zend_list_addref : function (id : integer; TSRMLS_DC : pointer) : integer; cdecl; _zend_list_delete : function (id : integer; TSRMLS_DC : pointer) : integer; cdecl; _zend_list_find : function (id : integer; _type : pointer; TSRMLS_DC : pointer) : pointer; cdecl; @@ -536,14 +536,16 @@ procedure convert_to_string(op: pzval); zend_indent : procedure; cdecl; ZendGetParameters : function: integer; cdecl; - zend_get_params_ex : function(param_count : Integer; Args : ppzval) :integer; cdecl varargs; + zend_get_params_ex : function(param_count : Integer; Args : {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) :integer; cdecl varargs; function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; -function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; +function zend_get_parameters(ht: integer; param_count: integer; Params: array of +{$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}): integer; var - _zend_get_parameters_array_ex : function(param_count: integer; argument_array: pppzval; TSRMLS_CC: pointer): integer; cdecl; + _zend_get_parameters_array_ex : function(param_count: integer; argument_array: + {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}; TSRMLS_CC: pointer): integer; cdecl; procedure dispose_pzval_array(Params: pzval_array); @@ -601,7 +603,7 @@ procedure dispose_pzval_array(Params: pzval_array); TSRMLS_DC: Pointer): integer; cdecl; call_user_function_ex : function(function_table: PHashTable; object_pp: pzval; - function_name: pzval; return_ptr_ptr: ppzval; param_count: zend_uint; + function_name: pzval; return_ptr_ptr: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; param_count: zend_uint; params: pzval_array; no_separation: zend_uint; symbol_table: PHashTable; TSRMLS_DC: Pointer): integer; cdecl; @@ -752,8 +754,8 @@ procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; function ToStrA(V: Variant): AnsiString; function ToStr(V: Variant): String; function toWChar(s: PAnsiChar): PWideChar; -function ZendToVariant(const Value: pppzval): Variant; overload; -function ZendToVariant(const Value: ppzval): Variant; overload; +function ZendToVariant(const Value: {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}): Variant; overload; +function ZendToVariant(const Value: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}): Variant; overload; procedure ZVAL_STRING(z: pzval; s: PAnsiChar; duplicate: boolean); procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); @@ -804,14 +806,14 @@ function strdup(strSource : PAnsiChar) : PAnsiChar; cdecl; external MSCRT name {$ELSE} function DupStr(strSource : PAnsiChar) : PAnsiChar; cdecl; {$ENDIF} - +{$IFNDEF PHP7} function ZEND_FAST_ALLOC: pzval; function ALLOC_ZVAL: pzval; overload; procedure ALLOC_ZVAL(out Result: pzval); overload; +{$ENDIF} procedure INIT_PZVAL(p: pzval); function MAKE_STD_ZVAL: pzval; overload; procedure MAKE_STD_ZVAL(out Result: pzval); overload; - {$IFNDEF QUIET_LOAD} procedure CheckZendErrors; {$ENDIF} @@ -1161,7 +1163,7 @@ function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) : Boolean; overload; var - tmp: ppzval; + tmp: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; begin Result := ZValArrayKeyExists(v, key); if Result then @@ -1175,7 +1177,7 @@ function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) : Boolean; overload; var - tmp: ppzval; + tmp: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; begin Result := ZValArrayKeyExists(v, idx); if Result then @@ -1202,7 +1204,7 @@ function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; HASH_DEL_INDEX) = SUCCESS; end; -function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) +function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) : Boolean; overload; var keyStr: PAnsiChar; @@ -1215,14 +1217,16 @@ function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) zend_hash_func(keyStr, KeyLength), pData) = SUCCESS; end; -function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) +function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) : Boolean; overload; begin Result := zend_hash_quick_find(v.value.ht, nil, 0, idx, pData) = SUCCESS; end; procedure MAKE_STD_ZVAL(out Result: pzval); begin - ALLOC_ZVAL(Result); + {$IFNDEF PHP7} + ALLOC_ZVAL(Result); + {$ENDIF} INIT_PZVAL(Result); end; @@ -1424,7 +1428,7 @@ function toWChar(s: PAnsiChar): PWideChar; Result := PWideChar(ss); end; -function ZendToVariant(const Value: pppzval): Variant; overload; +function ZendToVariant(const Value: {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}): Variant; overload; Var S: String; begin @@ -1436,7 +1440,7 @@ function ZendToVariant(const Value: pppzval): Variant; overload; end; end; -function ZendToVariant(const Value: ppzval): Variant; overload; +function ZendToVariant(const Value: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}): Variant; overload; Var S: String; begin @@ -1452,7 +1456,7 @@ function ZendToVariant(const Value: ppzval): Variant; overload; procedure HashToArray(HT: PHashTable; var AR: TArrayVariant); overload; Var Len,I: Integer; - tmp : pppzval; + tmp : {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}; begin len := zend_hash_num_elements(HT); SetLength(AR,len); @@ -2029,7 +2033,7 @@ function LoadZEND(const DllFilename: AnsiString = PHPWin) : boolean; zend_register_resource := GetProcAddress(PHPLib, 'zend_register_resource'); zend_fetch_resource := GetProcAddress(PHPLib, 'zend_fetch_resource'); zend_list_insert := GetProcAddress(PHPLib, 'zend_list_insert'); - {$IFNDEF PHP700} + {$IFNDEF PHP7} _zend_list_addref := GetProcAddress(PHPLib, '_zend_list_addref'); _zend_list_delete := GetProcAddress(PHPLib, '_zend_list_delete'); _zend_list_find := GetProcAddress(PHPLib, '_zend_list_find'); @@ -2053,33 +2057,72 @@ function LoadZEND(const DllFilename: AnsiString = PHPWin) : boolean; ts_free_id := GetProcAddress(PHPLib, 'ts_free_id'); // -- zend_strndup - zend_strndup := GetProcAddress(PHPLib, 'zend_strndup'); - + zend_strndup := GetProcAddress(PHPLib, + {$IFNDEF PHP7} + 'zend_strndup' + {$ELSE} + 'zend_strndup@@8' + {$ENDIF}); // -- _emalloc - _emalloc := GetProcAddress(PHPLib, '_emalloc'); + _emalloc := GetProcAddress(PHPLib, + {$IFNDEF PHP7} + '_emalloc' + {$ELSE} + '_emalloc@@4' + {$ENDIF}); // -- _efree - _efree := GetProcAddress(PHPLib, '_efree'); + _efree := GetProcAddress(PHPLib, + {$IFNDEF PHP7} + '_efree' + {$ELSE} + '_efree@@4' + {$ENDIF}); // -- _ecalloc - _ecalloc := GetProcAddress(PHPLib, '_ecalloc'); + _ecalloc := GetProcAddress(PHPLib, + {$IFNDEF PHP7} + '_ecalloc' + {$ELSE} + '_ecalloc@@8' + {$ENDIF}); // -- _erealloc - _erealloc := GetProcAddress(PHPLib, '_erealloc'); + _erealloc := GetProcAddress(PHPLib, + {$IFNDEF PHP7} + '_erealloc' + {$else} + '_erealloc@@8' + {$ENDIF}); // -- _estrdup - _estrdup := GetProcAddress(PHPLib, '_estrdup'); + _estrdup := GetProcAddress(PHPLib, + {$IFNDEF PHP7} + '_estrdup' + {$ELSE} + '_estrdup@@4' + {$ENDIF}); // -- _estrndup - _estrndup := GetProcAddress(PHPLib, '_estrndup'); + _estrndup := GetProcAddress(PHPLib, + {$IFNDEF PHP7} + '_estrndup' + {$ELSE} + '_estrndup@@8' + {$ENDIF}); // -- _estrndup Unicode - _estrndupu := GetProcAddress(PHPLib, '_estrndup'); + _estrndupu := GetProcAddress(PHPLib, + {$IFNDEF PHP7} + '_estrndup' + {$ELSE} + '_estrndup@@8' + {$ENDIF}); // -- zend_set_memory_limit zend_set_memory_limit := GetProcAddress(PHPLib, 'zend_set_memory_limit'); @@ -2735,7 +2778,7 @@ procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: P class_container.handle_property_set := nil; {$ENDIF} end; - +{$IFNDEF PHP7} function ZEND_FAST_ALLOC: pzval; begin Result := emalloc(sizeof(zval)); @@ -2750,7 +2793,7 @@ procedure ALLOC_ZVAL(out Result: pzval); begin Result := emalloc(sizeof(zval)); end; - +{$ENDIF} procedure INIT_PZVAL(p: pzval); begin p^.refcount := 1; @@ -2770,7 +2813,9 @@ procedure UNLOCK_ZVAL(p: pzval); function MAKE_STD_ZVAL: pzval; begin - Result := ALLOC_ZVAL; + {$IFNDEF PHP7} + Result := ALLOC_ZVAL; + {$ENDIF} INIT_PZVAL(Result); end; @@ -2793,7 +2838,7 @@ function zend_get_parameters_ex(number: integer; var Params: pzval_array): integ function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; var i : integer; - p: pppzval; + p: {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}; begin SetLength(Params, number); if number = 0 then @@ -2803,15 +2848,16 @@ function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS end; for i := 0 to number - 1 do New(Params[i]); - + {$IFNDEF PHP700} p := emalloc(number * sizeOf(ppzval)); + {$ENDIF} Result := _zend_get_parameters_array_ex(number, p, TSRMLS_DC); for i := 0 to number - 1 do begin - Params[i]^ := p^^; + {$IFNDEF PHP700}Params[i]^ := p^^ {$ELSE}Params[i] := p{$ENDIF}; if i <> number then - inc(integer(p^), sizeof(ppzval)); + inc(integer({$IFNDEF PHP700}p^{$ELSE}p{$ENDIF}), sizeof({$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF})); end; efree(p); @@ -2877,7 +2923,7 @@ procedure CheckZendErrors; if @zend_register_resource = nil then raise EPHP4DelphiException.Create('zend_register_resource'); if @zend_fetch_resource = nil then raise EPHP4DelphiException.Create('zend_fetch_resource'); if @zend_list_insert = nil then raise EPHP4DelphiException.Create('zend_list_insert'); - {$IFNDEF PHP700} + {$IFNDEF PHP7} if @_zend_list_addref = nil then raise EPHP4DelphiException.Create('zend_list_addref'); if @_zend_list_delete = nil then raise EPHP4DelphiException.Create('zend_list_delete'); if @_zend_list_find = nil then raise EPHP4DelphiException.Create('_zend_list_find'); @@ -2890,6 +2936,7 @@ procedure CheckZendErrors; if @ts_allocate_id = nil then raise EPHP4DelphiException.Create('ts_allocate_id'); if @ts_free_id = nil then raise EPHP4DelphiException.Create('ts_free_id'); if @zend_strndup = nil then raise EPHP4DelphiException.Create('zend_strndup'); + if @_emalloc = nil then raise EPHP4DelphiException.Create('_emalloc'); if @_efree = nil then raise EPHP4DelphiException.Create('_efree'); if @_ecalloc = nil then raise EPHP4DelphiException.Create('_ecalloc'); diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index 52db09c..a138bd5 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -340,7 +340,7 @@ interface //zend_modules.h const -{$IFDEF PHP700} +{$IFDEF PHP7} ZEND_MODULE_API_NO = 20151012; {$ELSE} {$IFDEF PHP530} @@ -489,8 +489,10 @@ interface uint = longword; PINT = ^Integer; size_t = cardinal; + {$IFNDEF PHP700} ppointer = ^pointer; pppointer = ^ppointer; + {$ENDIF} PStat = ^TStat; TStat = record @@ -921,10 +923,10 @@ zvalue_value = record 4 : (obj : _zend_object_value); {$ENDIF} end; - + {$IFNDEF PHP700} pppzval = ^ppzval; ppzval = ^pzval; - + {$ENDIF} {$IFDEF PHP4} Pzval = ^zval; @@ -946,7 +948,7 @@ zval = record {$ENDIF} ppzval_array = ^pzval_array; - pzval_array = array of ppzval; + pzval_array = array of {$IFNDEF PHP700} ppzval{$ELSE} pzval{$ENDIF}; pzval_array_ex = array of pzval; @@ -1429,7 +1431,7 @@ type _zend_property_info = record Pzend_executor_globals = ^zend_executor_globals; zend_executor_globals = record - return_value_ptr_ptr : ppzval; + return_value_ptr_ptr : {$IFNDEF PHP700} ppzval{$ELSE} pzval{$ENDIF}; uninitialized_zval : zval; uninitialized_zval_ptr : pzval; From 00bfbe248c547bbfccd29c3aea6a9410a5245694 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 5 Mar 2019 13:44:34 +0200 Subject: [PATCH 12/54] Update readme.txt --- readme.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.txt b/readme.txt index dea8fcd..99870f9 100644 --- a/readme.txt +++ b/readme.txt @@ -35,6 +35,7 @@ design-time and run-time packages for Delphi 5 through Delphi Berlin History: 7.4 Feb 2019 + * Compatible with PHP 5.5.0 * Compatible with PHP 5.6.0 * Compatible with PHP 5.6 @@ -42,6 +43,7 @@ History: * Added Partial Unicode Support 7.3 Jan 2019 + * Compatible with PHP 5.4.0 7.2 Oct 2009 From db0f4c03fe64f2d77f621777d14082d20d6f4777 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 5 Mar 2019 13:49:46 +0200 Subject: [PATCH 13/54] PHP4D 7.4 --- ...p4delphi Delphi 10 Seattle.groupproj.local | 10 ++++---- ...elphi Delphi 10 Seattle_prjgroup.tvsconfig | 2 ++ Source/php4DelphiD2010.dproj | 22 +++++++++--------- Source/php4DelphiD2010.identcache | Bin 1140 -> 1252 bytes Source/php4DelphiR2010.identcache | Bin 779 -> 856 bytes Source/phpAbout.dfm | 4 ++-- 6 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 Source/packages/php4delphi Delphi 10 Seattle_prjgroup.tvsconfig diff --git a/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local b/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local index 1029ef3..34e88de 100644 --- a/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local +++ b/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local @@ -1,12 +1,12 @@  - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 1899.12.30 00:00:00.000.120,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - + diff --git a/Source/packages/php4delphi Delphi 10 Seattle_prjgroup.tvsconfig b/Source/packages/php4delphi Delphi 10 Seattle_prjgroup.tvsconfig new file mode 100644 index 0000000..d430780 --- /dev/null +++ b/Source/packages/php4delphi Delphi 10 Seattle_prjgroup.tvsconfig @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Source/php4DelphiD2010.dproj b/Source/php4DelphiD2010.dproj index d0ed8de..e8ebf40 100644 --- a/Source/php4DelphiD2010.dproj +++ b/Source/php4DelphiD2010.dproj @@ -136,7 +136,16 @@ True - + + + 0 + .dll;.bpl + + + 1 + .dylib + + Contents\Resources @@ -475,16 +484,7 @@ 1 - - - 0 - .dll;.bpl - - - 1 - .dylib - - + diff --git a/Source/php4DelphiD2010.identcache b/Source/php4DelphiD2010.identcache index 40fde7545675fbf69f488ffd62e84beaf1ffeea3..f052e40a753e61e1e98d8c93c72cb604d2085691 100644 GIT binary patch literal 1252 zcmbu;%L;-(6b4`)p(knOD(E7b8dOLZgqV$&Lr&<-Fc-p}KCNgm+UDfa#mE02eau>6-Y%qR!X>&fET6#rWJ{(j!jNPCEOBfQBiW_Mi$V&+40iUpr#^I9rAq^2<@`o z2VSzVDIY;~!9v3dO*tDx3lU!Ms{NCkBgih|NZA!m@_Ey6W?wGAVeY%_0j@TPN!NeX zQ!9oOK@RRSK|2~!+tOTSvbD7(;&MrxjP}G>{Wx-Nw4Dn%v=nk%if|1R$!}2Tls+<9 T+U9?I8wrU#onL2a@Y_ED6Bm|f literal 1140 zcmbu8%L>9U5Jme5eu=B%3q^}nE2tDv1j(jtf=1dT4KwFO!I?|xL9$rNiKH%K20_G897}#9nLg1+BC!h_Kw#BWd7^5onE)Yv_)@kf z7dH-cJwd#75zx|n`qLJ(<=Eu)*8I7e2JIkIR(oTKK@h7uNV(DOYNim~Z`Dh~GEF(F URi_VORe!U=_!z>lL;Vc%1QPjaC;$Ke diff --git a/Source/php4DelphiR2010.identcache b/Source/php4DelphiR2010.identcache index b7e3702e8d499a5c5dcf5fc0ea7f5bde67a82a5d..5b0f86d658b95dacad4bb9f0c21ad55579d1f2ed 100644 GIT binary patch literal 856 zcmbW#y$-@46b0b!zKfHSi9ZCaHBr+v%?4?77Oez$ ci@DCSb&VTS4RX3sn{5nIf3&dad!y4}Z$Ii2sQ>@~ literal 779 zcmb`_%L>9U5Czcg{TEl_qX<$`wSr0(x{=xR5ojPUk_PGD8(kHvpbx^3zvL}?f^^&Qsb#;s5vL80crl%m%}R zJVZ;WRjjO$%55|(nFtl-vA>p+$`To+pr?466^3{RnJ{)3qx{tUx2i9?^CI0Z>S99G UXWrP_j`4O-U5CRXqIOBwFVbK1egFUf diff --git a/Source/phpAbout.dfm b/Source/phpAbout.dfm index e936de1..b2826e6 100644 --- a/Source/phpAbout.dfm +++ b/Source/phpAbout.dfm @@ -1205,7 +1205,7 @@ object dlgAbout: TdlgAbout Alignment = taCenter Anchors = [] AutoSize = False - Caption = 'Copyright (c) 2002-2009, Serhiy Perevoznyk'#13#10'All Rights Reserved' + Caption = 'Copyright (c) 2002-2019 Serhiy Perevoznyk, Andrew Zenin'#13#10'All Rights Reserved' end object labVersion: TLabel Left = 4 @@ -1214,7 +1214,7 @@ object dlgAbout: TdlgAbout Height = 13 Alignment = taCenter AutoSize = False - Caption = 'Version 6.0' + Caption = 'Version 7.4' Layout = tlCenter end object btnOK: TButton From d50a36f7a0f7f5420fe5f0a144a585e3407bcb3b Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 5 Mar 2019 13:52:37 +0200 Subject: [PATCH 14/54] small changes --- ...p4delphi Delphi 10 Seattle.groupproj.local | 10 ++++----- Source/php4DelphiD2010.dproj | 22 +++++++++---------- Source/php4DelphiR2010.stat | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local b/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local index 34e88de..744d98c 100644 --- a/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local +++ b/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local @@ -1,12 +1,12 @@  - 1899.12.30 00:00:00.000.120,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj + 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj + 1899.12.30 00:00:00.000.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj + 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - + diff --git a/Source/php4DelphiD2010.dproj b/Source/php4DelphiD2010.dproj index e8ebf40..d0ed8de 100644 --- a/Source/php4DelphiD2010.dproj +++ b/Source/php4DelphiD2010.dproj @@ -136,16 +136,7 @@ True - - - 0 - .dll;.bpl - - - 1 - .dylib - - + Contents\Resources @@ -484,7 +475,16 @@ 1 - + + + 0 + .dll;.bpl + + + 1 + .dylib + + diff --git a/Source/php4DelphiR2010.stat b/Source/php4DelphiR2010.stat index e17819a..87735bf 100644 --- a/Source/php4DelphiR2010.stat +++ b/Source/php4DelphiR2010.stat @@ -2,8 +2,8 @@ EditorSecs=2805 DesignerSecs=1 InspectorSecs=3 -CompileSecs=63757 -OtherSecs=299 +CompileSecs=74754 +OtherSecs=343 StartTime=29.07.4016 22:02:01 RealKeys=0 EffectiveKeys=0 From 31aa1d557b810535df00a729c3232d10b58727ff Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Wed, 6 Mar 2019 22:26:26 +0200 Subject: [PATCH 15/54] Restored credits --- Source/DelphiFunctions.pas | 14 ++--- Source/PHPAPI.pas | 126 ++++++++++++++++++------------------- Source/ZendTypes.pas | 93 ++++++++++++++++++++++++++- 3 files changed, 160 insertions(+), 73 deletions(-) diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index 873315f..f5d25e6 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -132,7 +132,7 @@ procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} -{$IFDEF PHP510} +{$IFDEF PHP5} procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ELSE} @@ -177,7 +177,7 @@ procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} begin - ZVAL_STRING(return_value, PAnsiChar(DateToStr(Date)), true); + ZVAL_STRING(return_value, zend_pchar(DateToStr(Date)), true); end; //proto float delphi_date(void) @@ -581,17 +581,17 @@ procedure delphi_set_property_handler(_object : pzval; member : pzval; value : p end; {$IFDEF PHP510} -function delphi_call_method(method : PAnsiChar; ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; +function delphi_call_method(method : zend_pchar; ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; {$ELSE} -function delphi_call_method(method : PAnsiChar; ht : integer; return_value : pzval; this_ptr : pzval; +function delphi_call_method(method : zend_pchar; ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; {$ENDIF} begin end; -function delphi_get_method(_object : pzval; method_name : PAnsiChar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; +function delphi_get_method(_object : pzval; method_name : zend_pchar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; begin @@ -600,7 +600,7 @@ function delphi_get_method(_object : pzval; method_name : PAnsiChar; method_len {$ENDIF} -{$IFDEF PHP510} +{$IFDEF PHP5} procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ELSE} @@ -608,7 +608,7 @@ procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} var - properties : array[0..3] of PAnsiChar; + properties : array[0..3] of zend_pchar; begin properties[0] := 'name'; properties[1] := 'last'; diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index e5fcffc..7ebe714 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -63,17 +63,17 @@ interface sapi_activate: procedure (p : pointer); cdecl; sapi_deactivate: procedure (p : pointer); cdecl; - sapi_add_header_ex: function(header_line : PAnsiChar; header_line_len : uint; duplicated : zend_bool; replace : zend_bool; TSRMLS_DC : pointer) : integer; cdecl; + sapi_add_header_ex: function(header_line : zend_pchar; header_line_len : uint; duplicated : zend_bool; replace : zend_bool; TSRMLS_DC : pointer) : integer; cdecl; php_execute_script : function (primary_file: pointer; TSRMLS_D : pointer) : Integer; cdecl; php_handle_aborted_connection: procedure; cdecl; - php_register_variable: procedure(_var : PAnsiChar; val: PAnsiChar; track_vars_array: pointer; TSRMLS_DC : pointer); cdecl; + php_register_variable: procedure(_var : zend_pchar; val: zend_pchar; track_vars_array: pointer; TSRMLS_DC : pointer); cdecl; // binary-safe version - php_register_variable_safe: procedure(_var : PAnsiChar; val : PAnsiChar; val_len : integer; track_vars_array : pointer; TSRMLS_DC : pointer); cdecl; - php_register_variable_ex: procedure(_var : PAnsiChar; val : pzval; track_vars_array : pointer; TSRMLS_DC : pointer); cdecl; + php_register_variable_safe: procedure(_var : zend_pchar; val : zend_pchar; val_len : integer; track_vars_array : pointer; TSRMLS_DC : pointer); cdecl; + php_register_variable_ex: procedure(_var : zend_pchar; val : pzval; track_vars_array : pointer; TSRMLS_DC : pointer); cdecl; //php_output.h php_output_startup: procedure(); cdecl; @@ -84,12 +84,12 @@ interface {$IFDEF PHP540} php_output_set_status: procedure(status: integer; TSRMLS_DC : pointer); cdecl; php_output_get_status: function(TSRMLS_DC : pointer) : integer; cdecl; - php_output_get_start_filename: function (TSRMLS_D : pointer) : PAnsiChar; cdecl; + php_output_get_start_filename: function (TSRMLS_D : pointer) : zend_pchar; cdecl; php_output_get_start_lineno: function (TSRMLS_D : pointer) : integer; cdecl; php_output_start_default: function (TSRMLS_D : pointer) : integer; cdecl; php_start_ob_buffer: function (output_handler : pzval; chunk_size : uint; flags:uint; TSRMLS_DC : pointer) : integer; cdecl; - php_start_ob_buffer_named: function (const output_handler_name : PAnsiChar; chunk_size : uint; flags:uint; TSRMLS_DC : pointer) : integer; cdecl; + php_start_ob_buffer_named: function (const output_handler_name : zend_pchar; chunk_size : uint; flags:uint; TSRMLS_DC : pointer) : integer; cdecl; php_end_ob_buffer: function (TSRMLS_DC : pointer): integer; cdecl; php_end_ob_buffers: procedure (TSRMLS_DC : pointer); cdecl; @@ -97,29 +97,29 @@ interface php_ob_get_length: function (p : pzval; TSRMLS_DC : pointer) : integer; cdecl; php_output_set_implicit_flush: procedure(flush: uint; TSRMLS_DS: pointer); cdecl; - php_get_output_start_filename: function (TSRMLS_D : pointer) : PAnsiChar; cdecl; + php_get_output_start_filename: function (TSRMLS_D : pointer) : zend_pchar; cdecl; php_get_output_start_lineno: function (TSRMLS_D : pointer) : integer; cdecl; - php_output_handler_started: function (name: PAnsiChar; name_len: uint): integer; cdecl; + php_output_handler_started: function (name: zend_pchar; name_len: uint): integer; cdecl; - php_ob_init_conflict: function (handler_new : PAnsiChar; handler_new_len: uint; - handler_set : PAnsiChar; handler_set_len: uint; TSRMLS_DC : pointer) : integer; cdecl; + php_ob_init_conflict: function (handler_new : zend_pchar; handler_new_len: uint; + handler_set : zend_pchar; handler_set_len: uint; TSRMLS_DC : pointer) : integer; cdecl; {$ELSE} php_output_set_status: procedure(status: boolean; TSRMLS_DC : pointer); cdecl; php_output_get_status: function(TSRMLS_DC : pointer) : boolean; cdecl; php_start_ob_buffer: function (output_handler : pzval; chunk_size : uint; erase : boolean; TSRMLS_DC : pointer) : integer; cdecl; - php_start_ob_buffer_named: function (const output_handler_name : PAnsiChar; chunk_size : uint; erase : boolean; TSRMLS_DC : pointer) : integer; cdecl; + php_start_ob_buffer_named: function (const output_handler_name : zend_pchar; chunk_size : uint; erase : boolean; TSRMLS_DC : pointer) : integer; cdecl; php_end_ob_buffer: procedure (send_buffer : boolean; just_flush : boolean; TSRMLS_DC : pointer); cdecl; php_end_ob_buffers: procedure (send_buffer : boolean; TSRMLS_DC : pointer); cdecl; php_ob_get_buffer: function (p : pzval; TSRMLS_DC : pointer) : integer; cdecl; php_ob_get_length: function (p : pzval; TSRMLS_DC : pointer) : integer; cdecl; php_start_implicit_flush: procedure (TSRMLS_D : pointer); cdecl; php_end_implicit_flush: procedure (TSRMLS_D : pointer); cdecl; - php_get_output_start_filename: function (TSRMLS_D : pointer) : PAnsiChar; cdecl; + php_get_output_start_filename: function (TSRMLS_D : pointer) : zend_pchar; cdecl; php_get_output_start_lineno: function (TSRMLS_D : pointer) : integer; cdecl; - php_ob_handler_used: function (handler_name : PAnsiChar; TSRMLS_DC : pointer) : integer; cdecl; - php_ob_init_conflict: function (handler_new : PAnsiChar; handler_set : PAnsiChar; TSRMLS_DC : pointer) : integer; cdecl; + php_ob_handler_used: function (handler_name : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; + php_ob_init_conflict: function (handler_new : zend_pchar; handler_set : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; {$ENDIF} //php_output.h @@ -130,34 +130,34 @@ function GetSymbolsTable : PHashTable; function GetTrackHash(Name : AnsiString) : PHashTable; function GetSAPIGlobals : Psapi_globals_struct; overload; function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; -//procedure phperror(Error : PAnsiChar); +//procedure phperror(Error : zend_pchar); var php_default_post_reader : procedure; //php_string.h -php_strtoupper: function (s : PAnsiChar; len : size_t) : PAnsiChar; cdecl; -php_strtolower: function (s : PAnsiChar; len : size_t) : PAnsiChar; cdecl; +php_strtoupper: function (s : zend_pchar; len : size_t) : zend_pchar; cdecl; +php_strtolower: function (s : zend_pchar; len : size_t) : zend_pchar; cdecl; -php_strtr: function (str : PAnsiChar; len : Integer; str_from : PAnsiChar; - str_to : PAnsiChar; trlen : Integer) : PAnsiChar; cdecl; +php_strtr: function (str : zend_pchar; len : Integer; str_from : zend_pchar; + str_to : zend_pchar; trlen : Integer) : zend_pchar; cdecl; -php_stripcslashes: procedure (str : PAnsiChar; len : PInteger); cdecl; +php_stripcslashes: procedure (str : zend_pchar; len : PInteger); cdecl; -php_basename: function (str : PAnsiChar; len : size_t; suffix : PAnsiChar; - sufflen : size_t) : PAnsiChar; cdecl; +php_basename: function (str : zend_pchar; len : size_t; suffix : zend_pchar; + sufflen : size_t) : zend_pchar; cdecl; -php_dirname: procedure (str : PAnsiChar; len : Integer); cdecl; +php_dirname: procedure (str : zend_pchar; len : Integer); cdecl; -php_stristr: function (s : PByte; t : PByte; s_len : size_t; t_len : size_t) : PAnsiChar; cdecl; +php_stristr: function (s : PByte; t : PByte; s_len : size_t; t_len : size_t) : zend_pchar; cdecl; -php_str_to_str: function (haystack : PAnsiChar; length : Integer; needle : PAnsiChar; - needle_len : Integer; str : PAnsiChar; str_len : Integer; - _new_length : PInteger) : PAnsiChar; cdecl; +php_str_to_str: function (haystack : zend_pchar; length : Integer; needle : zend_pchar; + needle_len : Integer; str : zend_pchar; str_len : Integer; + _new_length : PInteger) : zend_pchar; cdecl; -php_strip_tags: procedure (rbuf : PAnsiChar; len : Integer; state : PInteger; - allow : PAnsiChar; allow_len : Integer); cdecl; +php_strip_tags: procedure (rbuf : zend_pchar; len : Integer; state : PInteger; + allow : zend_pchar; allow_len : Integer); cdecl; php_implode: procedure (var delim : zval; var arr : zval; var return_value : zval); cdecl; @@ -168,36 +168,36 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; var -php_info_html_esc: function (str : PAnsiChar; TSRMLS_DC : pointer) : PAnsiChar; cdecl; +php_info_html_esc: function (str : zend_pchar; TSRMLS_DC : pointer) : zend_pchar; cdecl; php_print_info_htmlhead: procedure (TSRMLS_D : pointer); cdecl; -php_log_err: procedure (err_msg : PAnsiChar; TSRMLS_DC : pointer); cdecl; +php_log_err: procedure (err_msg : zend_pchar; TSRMLS_DC : pointer); cdecl; -php_html_puts: procedure (str : PAnsiChar; str_len : integer; TSRMLS_DC : pointer); cdecl; +php_html_puts: procedure (str : zend_pchar; str_len : integer; TSRMLS_DC : pointer); cdecl; -_php_error_log: function (opt_err : integer; msg : PAnsiChar; opt: PAnsiChar; headers: PAnsiChar; TSRMLS_DC : pointer) : integer; cdecl; +_php_error_log: function (opt_err : integer; msg : zend_pchar; opt: zend_pchar; headers: zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; php_print_credits: procedure (flag : integer); cdecl; php_info_print_css: procedure(); cdecl; php_set_sock_blocking: function (socketd : integer; block : integer; TSRMLS_DC : pointer) : integer; cdecl; -php_copy_file: function (src : PAnsiChar; dest : PAnsiChar; TSRMLS_DC : pointer) : integer; cdecl; +php_copy_file: function (src : zend_pchar; dest : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; var php_escape_html_entities: function (old : PByte; oldlen : integer; newlen : PINT; all : integer; - quote_style : integer; hint_charset: PAnsiChar; TSRMLS_DC : pointer) : PAnsiChar; cdecl; + quote_style : integer; hint_charset: zend_pchar; TSRMLS_DC : pointer) : zend_pchar; cdecl; var -php_ini_long: function (name : PAnsiChar; name_length : uint; orig : Integer) : Longint; cdecl; +php_ini_long: function (name : zend_pchar; name_length : uint; orig : Integer) : Longint; cdecl; -php_ini_double: function(name : PAnsiChar; name_length : uint; orig : Integer) : Double; cdecl; +php_ini_double: function(name : zend_pchar; name_length : uint; orig : Integer) : Double; cdecl; -php_ini_string: function(name : PAnsiChar; name_length : uint; orig : Integer) : PAnsiChar; cdecl; +php_ini_string: function(name : zend_pchar; name_length : uint; orig : Integer) : zend_pchar; cdecl; function zval2variant(value : zval) : variant; procedure variant2zval(value : variant; var z : pzval); @@ -206,16 +206,16 @@ procedure variant2zval(value : variant; var z : pzval); var php_url_free: procedure (theurl : pphp_url); cdecl; -php_url_parse: function (str : PAnsiChar) : pphp_url; cdecl; -php_url_decode: function (str : PAnsiChar; len : Integer) : Integer; cdecl; +php_url_parse: function (str : zend_pchar) : pphp_url; cdecl; +php_url_decode: function (str : zend_pchar; len : Integer) : Integer; cdecl; { return value: length of decoded string } -php_raw_url_decode: function (str : PAnsiChar; len : Integer) : Integer; cdecl; +php_raw_url_decode: function (str : zend_pchar; len : Integer) : Integer; cdecl; { return value: length of decoded string } -php_url_encode: function (s : PAnsiChar; len : Integer; new_length : PInteger) : PAnsiChar; cdecl; +php_url_encode: function (s : zend_pchar; len : Integer; new_length : PInteger) : zend_pchar; cdecl; -php_raw_url_encode: function (s : PAnsiChar; len : Integer; new_length : PInteger) : PAnsiChar; cdecl; +php_raw_url_encode: function (s : zend_pchar; len : Integer; new_length : PInteger) : zend_pchar; cdecl; {$IFDEF PHP510} php_register_extensions: function (ptr : pointer; count: integer; TSRMLS_DC: pointer) : integer; cdecl; @@ -223,11 +223,11 @@ procedure variant2zval(value : variant; var z : pzval); php_startup_extensions: function (ptr: pointer; count : integer) : integer; cdecl; {$ENDIF} -php_error_docref0: procedure (const docref : PAnsiChar; TSRMLS_DC : pointer; _type : integer; const Msg : PAnsiChar); cdecl; -php_error_docref: procedure (const docref : PAnsiChar; TSRMLS_DC : pointer; _type : integer; const Msg : PAnsiChar); cdecl; +php_error_docref0: procedure (const docref : zend_pchar; TSRMLS_DC : pointer; _type : integer; const Msg : zend_pchar); cdecl; +php_error_docref: procedure (const docref : zend_pchar; TSRMLS_DC : pointer; _type : integer; const Msg : zend_pchar); cdecl; -php_error_docref1: procedure (const docref : PAnsiChar; TSRMLS_DC : pointer; const param1 : PAnsiChar; _type: integer; Msg : PAnsiChar); cdecl; -php_error_docref2: procedure (const docref : PAnsiChar; TSRMLS_DC : pointer; const param1 : PAnsiChar; const param2 : PAnsiChar; _type : integer; Msg : PAnsiChar); cdecl; +php_error_docref1: procedure (const docref : zend_pchar; TSRMLS_DC : pointer; const param1 : zend_pchar; _type: integer; Msg : zend_pchar); cdecl; +php_error_docref2: procedure (const docref : zend_pchar; TSRMLS_DC : pointer; const param1 : zend_pchar; const param2 : zend_pchar; _type : integer; Msg : zend_pchar); cdecl; sapi_globals_id : pointer; core_globals_id : pointer; @@ -242,7 +242,7 @@ function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals; -procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : PAnsiChar; AHandler : pointer); +procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : zend_pchar; AHandler : pointer); function LoadPHP(const DllFileName: AnsiString = PHPWin) : boolean; @@ -263,7 +263,7 @@ function ValueToFloat(Value : AnsiString) : extended; php_info_print_table_colspan_header: procedure (num_cols : Integer; - header : PAnsiChar); cdecl; + header : zend_pchar); cdecl; php_info_print_box_start: procedure (bg : Integer); cdecl; @@ -272,21 +272,21 @@ function ValueToFloat(Value : AnsiString) : extended; php_info_print_hr: procedure; cdecl; php_info_print_table_start: procedure; cdecl; -php_info_print_table_row1: procedure(n1 : integer; c1: PAnsiChar); cdecl; -php_info_print_table_row2: procedure (n2 : integer; c1, c2 : PAnsiChar); cdecl; -php_info_print_table_row3: procedure (n3 : integer; c1, c2, c3 : PAnsiChar); cdecl; -php_info_print_table_row4: procedure (n4 : integer; c1, c2, c3, c4 : PAnsiChar); cdecl; -php_info_print_table_row : procedure (n2 : integer; c1, c2 : pAnsiChar); cdecl; +php_info_print_table_row1: procedure(n1 : integer; c1: zend_pchar); cdecl; +php_info_print_table_row2: procedure (n2 : integer; c1, c2 : zend_pchar); cdecl; +php_info_print_table_row3: procedure (n3 : integer; c1, c2, c3 : zend_pchar); cdecl; +php_info_print_table_row4: procedure (n4 : integer; c1, c2, c3, c4 : zend_pchar); cdecl; +php_info_print_table_row : procedure (n2 : integer; c1, c2 : zend_pchar); cdecl; php_info_print_table_end: procedure (); cdecl; -php_body_write: function (const str : PAnsiChar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; -php_header_write: function (const str : PAnsiChar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; +php_body_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; +php_header_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; php_header: function() : integer; cdecl; -php_setcookie: function (name : PAnsiChar; name_len : integer; value : PAnsiChar; value_len: integer; - expires : longint; path : PAnsiChar; path_len : integer; domain : PAnsiChar; domain_len : integer; +php_setcookie: function (name : zend_pchar; name_len : integer; value : zend_pchar; value_len: integer; + expires : longint; path : zend_pchar; path_len : integer; domain : zend_pchar; domain_len : integer; secure : integer; TSRMLS_DC : pointer) : integer; cdecl; @@ -372,7 +372,7 @@ function GetTrackHash(Name : AnsiString) : PHashTable; if Assigned(Arr) then begin new(data); - ret := zend_hash_find(arr, PAnsiChar(Name), Length(Name)+1, Data); + ret := zend_hash_find(arr, zend_pchar(Name), Length(Name)+1, Data); if ret = SUCCESS then begin Result := data^^^.value.ht; @@ -495,7 +495,7 @@ procedure variant2zval(value : variant;var z : pzval); ZVAL_NULL(z); Exit; end; - // MessageBoxA(0, PAnsiChar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ; + // MessageBoxA(0, zend_pchar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ; case TVarData(Value).VType of varString : //Peter Enz begin @@ -513,7 +513,7 @@ procedure variant2zval(value : variant;var z : pzval); begin S := string(TVarData(Value).VUString); - ZVAL_STRING(z, PAnsiChar(AnsiString(S)), true); + ZVAL_STRING(z, zend_pchar(AnsiString(S)), true); end; varOleStr : //Peter Enz @@ -573,7 +573,7 @@ function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals; -procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : PAnsiChar; AHandler : pointer); +procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : zend_pchar; AHandler : pointer); begin AFunction.fname := AName; @@ -586,7 +586,7 @@ procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : PAnsiChar; A end; -{procedure phperror(Error : PAnsiChar); +{procedure phperror(Error : zend_pchar); begin zend_error(E_PARSE, Error); end; } diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index a138bd5..4fb0be4 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -476,14 +476,44 @@ interface ZEND_INI_STAGE_DEACTIVATE = (1 shl 3); ZEND_INI_STAGE_RUNTIME = (1 shl 4); +{ Common Types } type zend_uint = uint; zend_bool = boolean; - zend_uchar = AnsiChar; + zend_uchar = {$IFDEF PHP_UNICE}Utf8Char{$ELSE}AnsiChar{$ENDIF}; zend_ulong = ulong; + zend_long = integer; + zend_pchar = {$IFDEF PHP_UNICE}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; + {$IFDEF PHP7} + _zend_refcounted_h = record + refcount : cardinal; + u : record + case longint of + 0 : ( v : record + _type : zend_uchar; + flags : zend_uchar; + gc_info : word; + end ); + 1 : ( type_info : cardinal ); + end; + end; + zend_refcounted_h = _zend_refcounted_h; + _zend_refcounted = record + gc : zend_refcounted_h; + end; + zend_refcounted = _zend_refcounted; + zend_string = record + gc : zend_refcounted_h; + h : zend_ulong; + len : size_t; + val : zend_pchar; + end; + {$ENDIF} zend_ushort = word; unsigned_char = byte; - +{ Common Types } +type + pzend_string = {$IFDEF PHP_UNICE}PUTF8Char{$ELSE}PAnsiChar{$ENDIF}; type uint = longword; @@ -847,8 +877,16 @@ Tzend_class_entry = record Pzend_Object = ^Tzend_object; PPzend_Object = ^PZend_Object; _zend_object = record + {$IFDEF PHP7} + gc : zend_refcounted_h; + handle : cardinal; + handlers : P_zend_object_handlers; + {$ENDIF} ce: Pzend_class_entry; properties: PHashTable; + {$IFDEF PHP7} + properties_table : array[0..0] of zval; + {$ENDIF} {$IFDEF PHP5} in_get_set : cardinal; {$ENDIF} @@ -908,9 +946,31 @@ _zend_object_value = record {$ENDIF} Pzvalue_value = ^zvalue_value; + {$IFDEF PHP7} + zvalue_value = Packed record + case longint of + 0 : ( lval : zend_long ); + 1 : ( dval : double ); + 2 : ( counted : P_zend_refcounted ); + 3 : ( str : Pzend_string ); + 4 : ( arr : Pzend_array ); + 5 : ( obj : Pzend_object ); + 6 : ( res : Pzend_resource ); + 7 : ( ref : P_zend_reference ); + 8 : ( ast : P_zend_ast_ref ); + 9 : ( zv : Pzval ); + 10 : ( ptr : pointer ); + 11 : ( ce : P_zend_class_entry ); + 12 : ( func : P_zend_function ); + 13 : ( ww : Packed record + w1 : cardinal; + w2 : cardinal; + end ); + end; + {$ELSE} zvalue_value = record case longint of - 0: (lval: longint); + 0: (lval: zend_long); 1: (dval: double); 2: (str: record val: {$IFDEF PHP_UNICE}PUTF8Char{$ELSE}PAnsiChar{$ENDIF}; @@ -923,6 +983,7 @@ zvalue_value = record 4 : (obj : _zend_object_value); {$ENDIF} end; + {$ENDIF} {$IFNDEF PHP700} pppzval = ^ppzval; ppzval = ^pzval; @@ -939,6 +1000,32 @@ zval = record Tzval = zval; {$ELSE} pzval = ^zval; + {$IFDEF PHP7} + _zval_struct = Packed record + value : zend_value; + u1 : Packed record + case longint of + 0 : ( v : record + _type : zend_uchar; + type_flags : zend_uchar; + const_flags : zend_uchar; + reserved : zend_uchar; + end ); + 1 : ( type_info : cardinal ); + end; + u2 : Packed record + case longint of + 0 : ( var_flags : LongWord ); + 1 : ( next : cardinal ); + 2 : ( cache_slot : cardinal ); + 3 : ( lineno : cardinal ); + 4 : ( num_args : cardinal ); + 5 : ( fe_pos : cardinal ); + 6 : ( fe_iter_idx : cardinal ); + end; + end; + zval = _zval_struct; + {$ENDIF} zval = record value : zvalue_value; refcount : zend_uint; From 1d10085252ce2b347e7c33380fbe5538baa6bafa Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Wed, 6 Mar 2019 22:26:41 +0200 Subject: [PATCH 16/54] Update php4delphi.pas --- Source/php4delphi.pas | 148 ++++++++++++++++++++++++++++-------------- 1 file changed, 98 insertions(+), 50 deletions(-) diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index e44832e..a71541c 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -477,6 +477,7 @@ procedure TPHPMemoryStream.SetInitialSize(ASize: integer); { Startup functions } function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; begin + RegisterInternalClasses(TSRMLS_DC); RESULT := SUCCESS; end; @@ -1779,57 +1780,104 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); end; procedure TPHPEngine.RefreshLibrary; -var - cnt, offset : integer; - HashName : AnsiString; -begin - SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 2); - - PHP_FUNCTION(FLibraryEntryTable[0], 'InputBox', @delphi_input_box); - - - for cnt := 0 to FHash.Count - 1 do - begin - HashName := FHash[cnt]; - - {$IFNDEF COMPILER_VC9} - FLibraryEntryTable[cnt+1].fname := strdup(PAnsiChar(HashName)); - {$ELSE} - FLibraryEntryTable[cnt+1].fname := DupStr(PAnsiChar(HashName)); - {$ENDIF} - - FLibraryEntryTable[cnt+1].handler := @DispatchRequest; - {$IFDEF PHP4} - FLibraryEntryTable[cnt+1].func_arg_types := nil; - {$ENDIF} - end; - - offset := FHash.Count + 1; - for cnt := 0 to MyFuncs.Count - 1 do - begin - HashName := MyFuncs[cnt]; - {$IFNDEF COMPILER_VC9} - FLibraryEntryTable[cnt+offset].fname := strdup(PAnsiChar(HashName)); - {$ELSE} - FLibraryEntryTable[cnt+offset].fname := DupStr(PAnsiChar(HashName)); - {$ENDIF} - - FLibraryEntryTable[cnt+offset].handler := MyFuncs.Objects[ cnt ]; - {$IFDEF PHP4} - FLibraryEntryTable[cnt+offset].func_arg_types := nil; - {$ENDIF} - end; - - - FLibraryEntryTable[FHash.Count+MyFuncs.Count+1].fname := nil; - FLibraryEntryTable[FHash.Count+MyFuncs.Count+1].handler := nil; - {$IFDEF PHP4} - FLibraryEntryTable[FHash.Count+MyFuncs.Count+1].func_arg_types := nil; - {$ENDIF} - - FLibraryModule.functions := @FLibraryEntryTable[0]; +var + cnt, offset : integer; + HashName : AnsiString; +begin + SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 13); + + PHP_FUNCTION(FLibraryEntryTable[0], 'delphi_date', @delphi_date); + PHP_FUNCTION(FLibraryEntryTable[1], 'delphi_extract_file_dir', @delphi_extract_file_dir); + PHP_FUNCTION(FLibraryEntryTable[2], 'delphi_extract_file_drive', @delphi_extract_file_drive); + PHP_FUNCTION(FLibraryEntryTable[3], 'delphi_extract_file_name', @delphi_extract_file_name); + + FLibraryEntryTable[4].fname := 'delphi_extract_file_ext'; + FLibraryEntryTable[4].handler := @delphi_extract_file_ext; + {$IFDEF PHP4} + FLibraryEntryTable[4].func_arg_types := nil; + {$ELSE} + FLibraryEntryTable[4].arg_info := nil; + {$ENDIF} + + FLibraryEntryTable[5].fname := 'delphi_show_message'; + FLibraryEntryTable[5].handler := @delphi_show_message; + {$IFDEF PHP4} + FLibraryEntryTable[5].func_arg_types := nil; + {$ELSE} + FLibraryEntryTable[5].arg_info := nil; + {$ENDIF} + + FLibraryEntryTable[6].fname := 'register_delphi_object'; + FLibraryEntryTable[6].handler := @register_delphi_object; + {$IFDEF PHP4} + FLibraryEntryTable[6].func_arg_types := nil; + {$ELSE} + FLibraryEntryTable[6].arg_info := nil; + {$ENDIF} + + FLibraryEntryTable[7].fname := 'delphi_get_author'; + FLibraryEntryTable[7].handler := @delphi_get_author; + {$IFDEF PHP4} + FLibraryEntryTable[7].func_arg_types := nil; + {$ELSE} + FLibraryEntryTable[7].arg_info := nil; + {$ENDIF} + + FLibraryEntryTable[8].fname := 'delphi_str_date'; + FLibraryEntryTable[8].handler := @delphi_str_date; + {$IFDEF PHP4} + FLibraryEntryTable[8].func_arg_types := nil; + {$ELSE} + FLibraryEntryTable[8].arg_info := nil; + {$ENDIF} + + + PHP_FUNCTION(FLibraryEntryTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); + PHP_FUNCTION(FLibraryEntryTable[10], 'InputBox', @delphi_input_box); + PHP_FUNCTION(FLibraryEntryTable[11], 'register_delphi_component', @register_delphi_component); + + + for cnt := 0 to FHash.Count - 1 do + begin + HashName := FHash[cnt]; + + {$IFNDEF COMPILER_VC9} + FLibraryEntryTable[cnt+12].fname := strdup(PAnsiChar(HashName)); + {$ELSE} + FLibraryEntryTable[cnt+12].fname := DupStr(PAnsiChar(HashName)); + {$ENDIF} + + FLibraryEntryTable[cnt+12].handler := @DispatchRequest; + {$IFDEF PHP4} + FLibraryEntryTable[cnt+12].func_arg_types := nil; + {$ENDIF} + end; + + offset := FHash.Count + 12; + for cnt := 0 to MyFuncs.Count - 1 do + begin + HashName := MyFuncs[cnt]; + {$IFNDEF COMPILER_VC9} + FLibraryEntryTable[cnt+offset].fname := strdup(PAnsiChar(HashName)); + {$ELSE} + FLibraryEntryTable[cnt+offset].fname := DupStr(PAnsiChar(HashName)); + {$ENDIF} + + FLibraryEntryTable[cnt+offset].handler := MyFuncs.Objects[ cnt ]; + {$IFDEF PHP4} + FLibraryEntryTable[cnt+offset].func_arg_types := nil; + {$ENDIF} + end; + + + FLibraryEntryTable[FHash.Count+MyFuncs.Count+12].fname := nil; + FLibraryEntryTable[FHash.Count+MyFuncs.Count+12].handler := nil; + {$IFDEF PHP4} + FLibraryEntryTable[FHash.Count+MyFuncs.Count+12].func_arg_types := nil; + {$ENDIF} + + FLibraryModule.functions := @FLibraryEntryTable[0]; end; - procedure TPHPEngine.StartupEngine; var i : integer; From 64f8eda7ae1c0901b05ce86bf8fb76c7a2668030 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Thu, 7 Mar 2019 16:52:33 +0200 Subject: [PATCH 17/54] #4 Added Unicode Support, yep, now it's full compatible with UTF-8 --- Source/DelphiFunctions.pas | 6 +- Source/PHPAPI.pas | 60 +++- Source/PHPCommon.pas | 42 +-- Source/PHPFunctions.pas | 42 +-- Source/PHPLibrary.pas | 23 +- Source/PHPProjectWizard.pas | 2 +- Source/PHPTypes.pas | 142 ++++----- Source/ZENDAPI.pas | 493 +++++++++++++++--------------- Source/ZendTypes.pas | 102 ++++--- Source/php4AppIntf.pas | 17 +- Source/php4AppUnit.pas | 68 ++--- Source/php4DelphiD2010.identcache | Bin 1252 -> 1252 bytes Source/php4DelphiR2010.identcache | Bin 856 -> 856 bytes Source/php4DelphiR2010.stat | 6 +- Source/php4delphi.pas | 167 +++++----- Source/phpClass.pas | 83 ++--- Source/phpModules.pas | 54 ++-- Source/zend_dynamic_array.pas | 4 +- 18 files changed, 683 insertions(+), 628 deletions(-) diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index f5d25e6..f17ed18 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -333,7 +333,7 @@ function delphi_set_property_handler(property_reference : Pzend_property_referen element : pzend_list_element; prop : pzend_overloaded_element; p : pointer; - propname : AnsiString; + propname : zend_ustr; // --> hupu, 2006.06.01 // pt : TTypeKind; {$IFDEF VERSION7} @@ -409,7 +409,7 @@ procedure delphi_get_property_handler(val : pzval; property_reference : PZend_pr element : pzend_list_element; prop : pzend_overloaded_element; p : pointer; - propname : AnsiString; + propname : zend_ustr; // --> hupu, 2006.06.01 // pt : TTypeKind; {$IFDEF VERSION7} @@ -522,7 +522,7 @@ procedure delphi_call_function(ht : integer; return_value : pzval; this_ptr : pz element : pzend_list_element; prop : pzend_overloaded_element; p : pointer; - MethodName : AnsiString; + MethodName : zend_ustr; Params : pzval_array; M, D : integer; begin diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index 7ebe714..bc220cd 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -127,7 +127,7 @@ interface function GetSymbolsTable : PHashTable; -function GetTrackHash(Name : AnsiString) : PHashTable; +function GetTrackHash(Name : zend_ustr) : PHashTable; function GetSAPIGlobals : Psapi_globals_struct; overload; function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; //procedure phperror(Error : zend_pchar); @@ -244,7 +244,7 @@ function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals; procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : zend_pchar; AHandler : pointer); -function LoadPHP(const DllFileName: AnsiString = PHPWin) : boolean; +function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; procedure UnloadPHP; @@ -254,8 +254,8 @@ function PHPLoaded : boolean; procedure CheckPHPErrors; {$ENDIF} -function FloatToValue(Value: Extended): AnsiString; -function ValueToFloat(Value : AnsiString) : extended; +function FloatToValue(Value: Extended): zend_ustr; +function ValueToFloat(Value : zend_ustr) : extended; var @@ -357,7 +357,7 @@ function GetSymbolsTable : PHashTable; {$ENDIF} -function GetTrackHash(Name : AnsiString) : PHashTable; +function GetTrackHash(Name : zend_ustr) : PHashTable; var data : ^ppzval; arr : PHashTable; @@ -431,7 +431,7 @@ function zval2variant(value : zval) : variant; IS_NULL : Result := NULL; IS_LONG : Result := Value.value.lval; IS_DOUBLE : Result := Value.value.dval; - IS_STRING : Result := AnsiString(Value.Value.str.val); + IS_STRING : Result := zend_ustr(Value.Value.str.val); IS_BOOL : Result := Boolean(Value.Value.lval); else Result := NULL; @@ -495,7 +495,7 @@ procedure variant2zval(value : variant;var z : pzval); ZVAL_NULL(z); Exit; end; - // MessageBoxA(0, zend_pchar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ; + // MessageBoxA(0, zend_pchar(zend_ustr( TVarData(Value).VType.ToString)), '', 0 ) ; case TVarData(Value).VType of varString : //Peter Enz begin @@ -513,7 +513,7 @@ procedure variant2zval(value : variant;var z : pzval); begin S := string(TVarData(Value).VUString); - ZVAL_STRING(z, zend_pchar(AnsiString(S)), true); + ZVAL_STRING(z, zend_pchar(zend_ustr(S)), true); end; varOleStr : //Peter Enz @@ -604,7 +604,7 @@ procedure php_end_implicit_flush(TSRMLS_D : pointer); {$ENDIF} -function LoadPHP(const DllFileName: AnsiString = PHPWin) : boolean; +function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; begin Result := false; @@ -927,7 +927,7 @@ function GetFilesVariables : pzval; end; -function FloatToValue(Value: Extended): AnsiString; +function FloatToValue(Value: Extended): zend_ustr; var {$IFDEF VERSION12} c: WideChar; @@ -944,7 +944,7 @@ function FloatToValue(Value: Extended): AnsiString; end; end; -function ValueToFloat(Value : AnsiString) : extended; +function ValueToFloat(Value : zend_ustr) : extended; var {$IFDEF VERSION12} c: WideChar; @@ -962,16 +962,52 @@ function ValueToFloat(Value : AnsiString) : extended; end; +{$IFDEF Linux} +function GetPHPVersion: TPHPFileInfo; +begin + +end; +{$ELSE} function GetPHPVersion: TPHPFileInfo; var - FileName: AnsiString; + FileName: {$IFDEF PHP_UNICE}String{$ELSE}AnsiString{$ENDIF}; + InfoSize, Wnd: DWORD; + VerBuf: Pointer; + FI: PVSFixedFileInfo; + VerSize: DWORD; begin Result.MajorVersion := 0; Result.MinorVersion := 0; Result.Release := 0; Result.Build := 0; FileName := PHPWin; + {$IFDEF PHP_UNICE} + InfoSize := GetFileVersionInfoSize(PWideChar(Filename), Wnd); + {$ELSE} + InfoSize := GetFileVersionInfoSizeA(PAnsiChar(FileName), Wnd); + {$ENDIF} + if InfoSize <> 0 then + begin + GetMem(VerBuf, InfoSize); + try + {$IFDEF PHP_UNICE} + if GetFileVersionInfo(PWideChar(FileName), Wnd, InfoSize, VerBuf) then + {$ELSE} + if GetFileVersionInfoA(PAnsiChar(FileName), Wnd, InfoSize, VerBuf) then + {$ENDIF} + if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then + begin + Result.MajorVersion := HIWORD(FI.dwFileVersionMS); + Result.MinorVersion := LOWORD(FI.dwFileVersionMS); + Result.Release := HIWORD(FI.dwFileVersionLS); + Result.Build := LOWORD(FI.dwFileVersionLS); + end; + finally + FreeMem(VerBuf); + end; + end; end; +{$ENDIF} initialization {$IFDEF PHP4DELPHI_AUTOLOAD} diff --git a/Source/PHPCommon.pas b/Source/PHPCommon.pas index 15422bc..d594f7c 100644 --- a/Source/PHPCommon.pas +++ b/Source/PHPCommon.pas @@ -46,8 +46,8 @@ EPHPErrorEx = class(Exception); TPHPVariable = class(TCollectionItem) private - FName : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF}; - FValue : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF}; + FName : zend_ustr; + FValue : zend_ustr; function GetAsBoolean: boolean; function GetAsFloat: double; function GetAsInteger: integer; @@ -59,11 +59,11 @@ TPHPVariable = class(TCollectionItem) public property AsInteger : integer read GetAsInteger write SetAsInteger; property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; - property AsString : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF} read FValue write FValue; + property AsString : zend_ustr read FValue write FValue; property AsFloat : double read GetAsFloat write SetAsFloat; published - property Name : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF} read FName write FName; - property Value : {$IFDEF PHP_UNICE}UTf8String{$ELSE}AnsiString{$ENDIF} read FValue write FValue; + property Name : zend_ustr read FName write FName; + property Value : zend_ustr read FValue write FValue; end; TPHPVariables = class(TCollection) @@ -76,22 +76,22 @@ TPHPVariables = class(TCollection) public function Add: TPHPVariable; constructor Create(AOwner: TComponent); - function GetVariables : AnsiString; - function IndexOf(AName : AnsiString) : integer; - procedure AddRawString(AString : AnsiString); + function GetVariables : zend_ustr; + function IndexOf(AName : zend_ustr) : integer; + procedure AddRawString(AString : zend_ustr); property Items[Index: Integer]: TPHPVariable read GetItem write SetItem; default; - function ByName(AName : AnsiString) : TPHPVariable; + function ByName(AName : zend_ustr) : TPHPVariable; end; TPHPConstant = class(TCollectionItem) private - FName : AnsiString; - FValue : AnsiString; + FName : zend_ustr; + FValue : zend_ustr; protected function GetDisplayName : string; override; published - property Name : AnsiString read FName write FName; - property Value : AnsiString read FValue write FValue; + property Name : zend_ustr read FName write FName; + property Value : zend_ustr read FValue write FValue; end; TPHPConstants = class(TCollection) @@ -104,7 +104,7 @@ TPHPConstants = class(TCollection) public function Add: TPHPConstant; constructor Create(AOwner: TComponent); - function IndexOf(AName : AnsiString) : integer; + function IndexOf(AName : zend_ustr) : integer; property Items[Index: Integer]: TPHPConstant read GetItem write SetItem; default; end; @@ -125,7 +125,7 @@ TPHPHeaders = class(TCollection) public function Add: TPHPHeader; constructor Create(AOwner: TComponent); - function GetHeaders : AnsiString; + function GetHeaders : zend_ustr; property Items[Index: Integer]: TPHPHeader read GetItem write SetItem; default; end; @@ -171,7 +171,7 @@ function TPHPVariables.GetOwner : TPersistent; Result := FOwner; end; -function TPHPVariables.GetVariables: AnsiString; +function TPHPVariables.GetVariables: zend_ustr; var i : integer; begin for i := 0 to Count - 1 do @@ -182,7 +182,7 @@ function TPHPVariables.GetVariables: AnsiString; end; end; -function TPHPVariables.IndexOf(AName: AnsiString): integer; +function TPHPVariables.IndexOf(AName: zend_ustr): integer; var i : integer; begin @@ -197,7 +197,7 @@ function TPHPVariables.IndexOf(AName: AnsiString): integer; end; end; -procedure TPHPVariables.AddRawString(AString : AnsiString); +procedure TPHPVariables.AddRawString(AString : zend_ustr); var SL : TStringList; i : integer; @@ -227,7 +227,7 @@ procedure TPHPVariables.AddRawString(AString : AnsiString); SL.Free; end; -function TPHPVariables.ByName(AName: AnsiString): TPHPVariable; +function TPHPVariables.ByName(AName: zend_ustr): TPHPVariable; var i : integer; begin @@ -359,7 +359,7 @@ function TPHPConstants.GetOwner: TPersistent; Result := FOwner; end; -function TPHPConstants.IndexOf(AName: AnsiString): integer; +function TPHPConstants.IndexOf(AName: zend_ustr): integer; var i : integer; begin @@ -408,7 +408,7 @@ function TPHPHeaders.GetOwner : TPersistent; Result := FOwner; end; -function TPHPHeaders.GetHeaders: AnsiString; +function TPHPHeaders.GetHeaders: zend_ustr; var i : integer; begin for i := 0 to Count - 1 do diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index 6bf6806..4f192ae 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -32,10 +32,10 @@ TZendVariable = class procedure SetAsBoolean(const Value: boolean); function GetAsFloat: double; function GetAsInteger: integer; - function GetAsString: AnsiString; + function GetAsString: zend_ustr; procedure SetAsFloat(const Value: double); procedure SetAsInteger(const Value: integer); - procedure SetAsString(const Value: AnsiString); + procedure SetAsString(const Value: zend_ustr); function GetAsDate: TDateTime; function GetAsDateTime: TDateTime; function GetAsTime: TDateTime; @@ -54,7 +54,7 @@ TZendVariable = class property AsZendVariable : Pzval read FValue write FValue; property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; property AsInteger : integer read GetAsInteger write SetAsInteger; - property AsString : AnsiString read GetAsString write SetAsString; + property AsString : zend_ustr read GetAsString write SetAsString; property AsFloat : double read GetAsFloat write SetAsFloat; property AsDate : TDateTime read GetAsDate write SetAsDate; property AsTime : TDateTime read GetAsTime write SetAsTime; @@ -111,12 +111,12 @@ TFunctionParams = class(TCollection) TPHPFunction = class(TCollectionItem) private FOnExecute : TPHPExecute; - FFunctionName : AnsiString; + FFunctionName : zend_ustr; FTag : integer; FFunctionParams: TFunctionParams; - FDescription: AnsiString; + FDescription: zend_ustr; procedure SetFunctionParams(const Value: TFunctionParams); - procedure _SetDisplayName(const value : AnsiString); + procedure _SetDisplayName(const value : zend_ustr); public constructor Create(Collection : TCollection); override; destructor Destroy; override; @@ -124,11 +124,11 @@ TPHPFunction = class(TCollectionItem) procedure SetDisplayName(const Value: string); override; procedure AssignTo(Dest: TPersistent); override; published - property FunctionName : AnsiString read FFunctionName write _SetDisplayName; + property FunctionName : zend_ustr read FFunctionName write _SetDisplayName; property Tag : integer read FTag write FTag; property Parameters: TFunctionParams read FFunctionParams write SetFunctionParams; property OnExecute : TPHPExecute read FOnExecute write FOnExecute; - property Description : AnsiString read FDescription write FDescription; + property Description : zend_ustr read FDescription write FDescription; end; TPHPFunctions = class(TCollection) @@ -142,7 +142,7 @@ TPHPFunctions = class(TCollection) public constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass); virtual; function Add : TPHPFunction; - function FunctionByName(const AName : AnsiString) : TPHPFunction; + function FunctionByName(const AName : zend_ustr) : TPHPFunction; property Items[Index: Integer]: TPHPFunction read GetItem write SetItem; default; end; @@ -199,7 +199,7 @@ constructor TPHPFunctions.Create(AOwner: TPersistent; ItemClass: TCollectionItem FOwner := AOwner; end; -function TPHPFunctions.FunctionByName(const AName: AnsiString): TPHPFunction; +function TPHPFunctions.FunctionByName(const AName: zend_ustr): TPHPFunction; var cnt : integer; begin @@ -308,25 +308,25 @@ procedure TPHPFunction.SetDisplayName(const Value: string); var I: Integer; F: TPHPFunction; - NameValue : AnsiString; + NameValue : zend_ustr; begin NameValue := Value; - if AnsiCompareText(NameValue, FFunctionName) <> 0 then + if {$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(NameValue, FFunctionName) <> 0 then begin if Collection <> nil then for I := 0 to Collection.Count - 1 do begin F := TPHPFunctions(Collection).Items[I]; if (F <> Self) and (F is TPHPFunction) and - (AnsiCompareText(NameValue, F.FunctionName) = 0) then + ({$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(NameValue, F.FunctionName) = 0) then raise Exception.CreateFmt('Duplicate function name: %s', [Value]); end; - FFunctionName := AnsiLowerCase(Value); + FFunctionName := {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF}(Value); Changed(False); end; end; -procedure TPHPFunction._SetDisplayName(const Value: AnsiString); +procedure TPHPFunction._SetDisplayName(const Value: zend_ustr); var NewName : string; begin @@ -476,14 +476,14 @@ procedure TFunctionParam.SetDisplayName(const Value: string); I: Integer; F: TFunctionParam; begin - if AnsiCompareText(Value, FName) <> 0 then + if {$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, FName) <> 0 then begin if Collection <> nil then for I := 0 to Collection.Count - 1 do begin F := TFunctionParams(Collection).Items[I]; if ((F <> Self) and (F is TFunctionParam) and - (AnsiCompareText(Value, F.Name) = 0)) then + ({$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, F.Name) = 0)) then raise Exception.Create('Duplicate parameter name'); end; FName := Value; @@ -570,7 +570,7 @@ function TZendVariable.GetAsDateTime: TDateTime; {$IFDEF VERSION5} function StrToFloatDef(const S: string; const Default: Extended): Extended; begin - if not TextToFloat(PAnsiChar(S), Result, fvExtended) then + if not TextToFloat(zend_pchar(S), Result, fvExtended) then Result := Default; end; {$ENDIF} @@ -611,7 +611,7 @@ function TZendVariable.GetAsInteger: integer; end; end; -function TZendVariable.GetAsString: AnsiString; +function TZendVariable.GetAsString: zend_ustr; begin if not Assigned(FValue) then begin @@ -759,13 +759,13 @@ procedure TZendVariable.SetAsInteger(const Value: integer); ZVAL_LONG(FValue, Value); end; -procedure TZendVariable.SetAsString(const Value: AnsiString); +procedure TZendVariable.SetAsString(const Value: zend_ustr); begin if not Assigned(FValue) then begin Exit; end; - ZVAL_STRINGL(FValue, PAnsiChar(Value), Length(Value), true); + ZVAL_STRINGL(FValue, zend_pchar(Value), Length(Value), true); end; procedure TZendVariable.SetAsTime(const Value: TDateTime); diff --git a/Source/PHPLibrary.pas b/Source/PHPLibrary.pas index b2fec34..531998f 100644 --- a/Source/PHPLibrary.pas +++ b/Source/PHPLibrary.pas @@ -55,7 +55,7 @@ TPHPSimpleLibrary = class(TCustomPHPLibrary) function GetInputArgAsFloat(AIndex:integer):double; function GetInputArgAsDateTime(AIndex:integer):TDateTime; public - procedure RegisterMethod(AName : AnsiString; ADescription : AnsiString; AProc : TDispatchProc; AParams : array of TParamType); virtual; + procedure RegisterMethod(AName : zend_ustr; ADescription : zend_ustr; AProc : TDispatchProc; AParams : array of TParamType); virtual; constructor Create(AOwner : TComponent); override; destructor Destroy; override; end; @@ -168,7 +168,7 @@ procedure TPHPSimpleLibrary._Execute(Sender: TObject; ReturnValue := FRetValue; end; -procedure TPHPSimpleLibrary.RegisterMethod(AName: AnsiString; ADescription : AnsiString; +procedure TPHPSimpleLibrary.RegisterMethod(AName: zend_ustr; ADescription : zend_ustr; AProc: TDispatchProc; AParams: array of TParamType); var Func : TPHPFunction; @@ -177,7 +177,8 @@ procedure TPHPSimpleLibrary.RegisterMethod(AName: AnsiString; ADescription : Ans O : TDispatchObject; begin Func := TPHPFunction(Functions.Add); - Func.FunctionName := AnsiLowerCase(AName); + Func.FunctionName := + {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF}(AName); Func.Description := ADescription; for cnt := 0 to Length(AParams) - 1 do @@ -351,22 +352,30 @@ procedure TPHPSystemLibrary.CompareTextProc; procedure TPHPSystemLibrary.AnsiUpperCaseProc; begin - ReturnOutputArg( AnsiUpperCase( GetInputArgAsString( 0 ) ) ); + ReturnOutputArg( + {$IFDEF PHP_UNICE}UpperCase{$ELSE}AnsiUpperCase{$ENDIF}( GetInputArgAsString( 0 ) ) + ); end; procedure TPHPSystemLibrary.AnsiLowerCaseProc; begin - ReturnOutputArg( AnsiLowerCase( GetInputArgAsString( 0 ) ) ); + ReturnOutputArg( + {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF}( GetInputArgAsString( 0 ) ) + ); end; procedure TPHPSystemLibrary.AnsiCompareStrProc; begin - ReturnOutputArg( AnsiCompareStr( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); + ReturnOutputArg( + {$IFDEF PHP_UNICE}CompareStr{$ELSE}AnsiCompareStr{$ENDIF}( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) + ); end; procedure TPHPSystemLibrary.AnsiCompareTextProc; begin - ReturnOutputArg( AnsiCompareText( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); + ReturnOutputArg( + {$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) + ); end; diff --git a/Source/PHPProjectWizard.pas b/Source/PHPProjectWizard.pas index 5033554..49edc4a 100644 --- a/Source/PHPProjectWizard.pas +++ b/Source/PHPProjectWizard.pas @@ -268,7 +268,7 @@ function TPHPProjectCreator.GetFileName: string; begin try TempFileName := ProjGroup.Projects[i].FileName; - if {$IF PHP560}CompareFileName{$ELSE}AnsiCompareFileName{$ENDIF}(ExtractFileName(TempFileName), ExtractFileName(TempFileName2)) = 0 then + if {$IFDEF PHP_UNICE}CompareFileName{$ELSE}AnsiCompareFileName{$ENDIF}(ExtractFileName(TempFileName), ExtractFileName(TempFileName2)) = 0 then begin Found := True; Break; diff --git a/Source/PHPTypes.pas b/Source/PHPTypes.pas index 6ee9d44..5dbbbc6 100644 --- a/Source/PHPTypes.pas +++ b/Source/PHPTypes.pas @@ -27,7 +27,7 @@ interface {$ENDIF} const - TRequestName : array [0..3] of AnsiString = + TRequestName : array [0..3] of zend_ustr = ('GET', 'PUT', 'POST', @@ -58,7 +58,7 @@ interface const - short_track_vars_names : array [0..5] of AnsiString = + short_track_vars_names : array [0..5] of zend_ustr = ('_POST', '_GET', '_COOKIE', @@ -136,7 +136,7 @@ interface Psapi_header_struct = ^Tsapi_header_struct; sapi_header_struct = record - header : PAnsiChar; + header : zend_pchar; header_len : uint; {$IFNDEF PHP530} replace : zend_bool; @@ -150,8 +150,8 @@ interface headers : zend_llist; http_response_code : Integer; send_default_content_type : Byte; - mimetype : PAnsiChar; - http_status_line : PAnsiChar; + mimetype : zend_pchar; + http_status_line : zend_pchar; end; Tsapi_headers_struct = sapi_headers_struct; @@ -159,7 +159,7 @@ interface Psapi_post_entry = ^Tsapi_post_entry; sapi_post_entry = record - content_type : PAnsiChar; + content_type : zend_pchar; content_type_len : uint; post_reader : pointer; //void (*post_reader)(TSRMLS_D); post_handler : pointer; //void (*post_handler)(char *content_type_dup, void *arg TSRMLS_DC); @@ -175,38 +175,38 @@ interface Psapi_request_info = ^Tsapi_request_info; sapi_request_info = record - request_method : PAnsiChar; - query_string : PAnsiChar; - post_data : PAnsiChar; - raw_post_data : PAnsiChar; - cookie_data : PAnsiChar; + request_method : zend_pchar; + query_string : zend_pchar; + post_data : zend_pchar; + raw_post_data : zend_pchar; + cookie_data : zend_pchar; content_length : Longint; post_data_length : uint; raw_post_data_length : uint; - path_translated : PAnsiChar; - request_uri : PAnsiChar; - content_type : PAnsiChar; + path_translated : zend_pchar; + request_uri : zend_pchar; + content_type : zend_pchar; headers_only : zend_bool; no_headers : zend_bool; {$IFDEF PHP5} headers_read : zend_bool; {$ENDIF} post_entry : PSapi_post_entry; - content_type_dup : PAnsiChar; + content_type_dup : zend_pchar; //for HTTP authentication - auth_user : PAnsiChar; - auth_password : PAnsiChar; + auth_user : zend_pchar; + auth_password : zend_pchar; {$IFDEF PHP510} - auth_digest : PAnsiChar; + auth_digest : zend_pchar; {$ENDIF} //this is necessary for the CGI SAPI module - argv0 : PAnsiChar; + argv0 : zend_pchar; //this is necessary for Safe Mode - current_user : PAnsiChar; + current_user : zend_pchar; current_user_length : Integer; //this is necessary for CLI module argc : Integer; - argv : ^PAnsiChar; + argv : ^zend_pchar; {$IFDEF PHP510} proto_num : integer; {$ENDIF} @@ -216,7 +216,7 @@ interface Psapi_header_line = ^Tsapi_header_line; sapi_header_line = record - line : PAnsiChar; + line : zend_pchar; line_len : uint; response_code : Longint; end; @@ -231,8 +231,8 @@ interface read_post_bytes : Integer; headers_sent : Byte; global_stat : stat; - default_mimetype : PAnsiChar; - default_charset : PAnsiChar; + default_mimetype : zend_pchar; + default_charset : zend_pchar; rfc1867_uploaded_files : PHashTable; post_max_size : Longint; options : Integer; @@ -254,8 +254,8 @@ interface sapi_module_struct = record - name : PAnsiChar; - pretty_name : PAnsiChar; + name : zend_pchar; + pretty_name : zend_pchar; startup : TModuleStartupFunc; //int (*startup)(struct _sapi_module_struct *sapi_module); @@ -273,29 +273,29 @@ interface flush : pointer; stat : pointer; getenv : pointer; - + sapi_error : pointer; - + header_handler : pointer; send_headers : pointer; send_header : pointer; - + read_post : pointer; read_cookies : pointer; - + register_server_variables : pointer; log_message : pointer; get_request_time : pointer; terminate_process : pointer; - php_ini_path_override : PAnsiChar; + php_ini_path_override : zend_pchar; block_interruptions : pointer; unblock_interruptions : pointer; default_post_reader : pointer; treat_data : pointer; - executable_location : PAnsiChar; + executable_location : zend_pchar; php_ini_ignore : Integer; @@ -306,14 +306,14 @@ interface force_http_10 : pointer; get_target_uid : pointer; get_target_gid : pointer; - + input_filter : pointer; - + ini_defaults : pointer; - + phpinfo_as_text : integer; - ini_entries : PAnsiChar; + ini_entries : zend_pchar; additional_functions: Pointer; input_filter_init : Pointer; @@ -326,22 +326,22 @@ interface PPHP_URL = ^TPHP_URL; Tphp_url = record - scheme : PAnsiChar; - user : PAnsiChar; - pass : PAnsiChar; - host : PAnsiChar; + scheme : zend_pchar; + user : zend_pchar; + pass : zend_pchar; + host : zend_pchar; port : Smallint; - path : PAnsiChar; - query : PAnsiChar; - fragment : PAnsiChar; + path : zend_pchar; + query : zend_pchar; + fragment : zend_pchar; end; type arg_separators = record - output : PAnsiChar; - input : PAnsiChar; + output : zend_pchar; + input : zend_pchar; end; type @@ -355,13 +355,13 @@ interface allow_call_time_pass_reference : boolean; implicit_flush : boolean; output_buffering : Integer; - safe_mode_include_dir : PAnsiChar; + safe_mode_include_dir : zend_pchar; safe_mode_gid : boolean; sql_safe_mode : boolean; enable_dl :boolean; - output_handler : PAnsiChar; - unserialize_callback_func : PAnsiChar; - safe_mode_exec_dir : PAnsiChar; + output_handler : zend_pchar; + unserialize_callback_func : zend_pchar; + safe_mode_exec_dir : zend_pchar; memory_limit : Longint; max_input_time : Longint; track_errors : boolean; @@ -372,21 +372,21 @@ interface ignore_repeated_errors : boolean; ignore_repeated_source : boolean; report_memleaks : boolean; - error_log : PAnsiChar; - doc_root : PAnsiChar; - user_dir : PAnsiChar; - include_path : PAnsiChar; - open_basedir : PAnsiChar; - extension_dir : PAnsiChar; - upload_tmp_dir : PAnsiChar; + error_log : zend_pchar; + doc_root : zend_pchar; + user_dir : zend_pchar; + include_path : zend_pchar; + open_basedir : zend_pchar; + extension_dir : zend_pchar; + upload_tmp_dir : zend_pchar; upload_max_filesize : Longint; - error_append_string : PAnsiChar; - error_prepend_string : PAnsiChar; - auto_prepend_file : PAnsiChar; - auto_append_file : PAnsiChar; + error_append_string : zend_pchar; + error_prepend_string : zend_pchar; + auto_prepend_file : zend_pchar; + auto_append_file : zend_pchar; arg_separator : arg_separators; - gpc_order : PAnsiChar; - variables_order : PAnsiChar; + gpc_order : zend_pchar; + variables_order : zend_pchar; rfc1867_protected_variables : THashTable; connection_status : Smallint; ignore_user_abort : Smallint; @@ -397,8 +397,8 @@ interface register_globals : boolean; register_argc_argv : boolean; y2k_compliance : boolean; - docref_root : PAnsiChar; - docref_ext : PAnsiChar; + docref_root : zend_pchar; + docref_ext : zend_pchar; html_errors : boolean; xmlrpc_errors : boolean; xmlrpc_error_number : Longint; @@ -409,15 +409,15 @@ interface always_populate_raw_post_data : boolean; {$IFDEF PHP510} report_zend_debug : boolean; - last_error_message : PAnsiChar; - last_error_file : PAnsiChar; + last_error_message : zend_pchar; + last_error_file : zend_pchar; last_error_lineno : integer; {$IFNDEF PHP530} error_handling : error_handling_t; exception_class : Pointer; {$ENDIF} - disable_functions : PAnsiChar; - disable_classes : PAnsiChar; + disable_functions : zend_pchar; + disable_classes : zend_pchar; {$ENDIF} {$IFDEF PHP520} allow_url_include : zend_bool; @@ -427,11 +427,11 @@ interface {$ENDIF} {$IFDEF PHP530} - user_ini_filename : PAnsiChar; + user_ini_filename : zend_pchar; user_ini_cache_ttl : longint; - request_order : PAnsiChar; + request_order : zend_pchar; mail_x_header : zend_bool; - mail_log : PAnsiChar; + mail_log : zend_pchar; {$ENDIF} end; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 287cdd8..94d127c 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -65,7 +65,7 @@ interface type EPHP4DelphiException = class(Exception) - constructor Create(const Msg: AnsiString); + constructor Create(const Msg: zend_ustr); end; align_test = record @@ -76,10 +76,10 @@ align_test = record end; const PLATFORM_ALIGNMENT = (SizeOf(align_test)); - +{$IFNDEF PHP_UNICE} function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; - -function LoadZEND(const DllFilename: AnsiString = PHPWin) : boolean; +{$ENDIF} +function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; procedure UnloadZEND; function ZENDLoaded: boolean; @@ -87,16 +87,16 @@ function ZENDLoaded: boolean; {Memory management functions} var {$IFNDEF PHP7} - zend_strndup : function(s: PAnsiChar; length: Integer): PAnsiChar; cdecl; + zend_strndup : function(s: zend_pchar; length: Integer): zend_pchar; cdecl; {$ELSE} - zend_strndup : function(s:PAnsiChar; length:size_t):PAnsiChar; cdecl; + zend_strndup : function(s:zend_pchar; length:size_t):zend_pchar; cdecl; {$ENDIF} - _emalloc : function(size: size_t; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; - _efree : procedure(ptr: pointer; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint); cdecl; - _ecalloc : function(nmemb: size_t; size: size_t; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; - _erealloc : function(ptr: pointer; size: size_t; allow_failure: integer; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; - _estrdup : function(const s: PAnsiChar; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): pointer; cdecl; - _estrndup : function(s: PAnsiChar; Len: Cardinal; __zend_filename: PAnsiChar; __zend_lineno: uint; __zend_orig_filename: PAnsiChar; __zend_orig_line_no: uint): PAnsiChar; cdecl; + _emalloc : function(size: size_t; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint): pointer; cdecl; + _efree : procedure(ptr: pointer; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint); cdecl; + _ecalloc : function(nmemb: size_t; size: size_t; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint): pointer; cdecl; + _erealloc : function(ptr: pointer; size: size_t; allow_failure: integer; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint): pointer; cdecl; + _estrdup : function(const s: zend_pchar; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint): pointer; cdecl; + _estrndup : function(s: zend_pchar; Len: Cardinal; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint): zend_pchar; cdecl; _estrndupu : function(s: PUTF8Char; Len: Cardinal; __zend_filename: PUTF8Char; __zend_lineno: uint; __zend_orig_filename: PUTF8Char; __zend_orig_line_no: uint): PUTF8Char; cdecl; @@ -104,9 +104,9 @@ function emalloc(size: size_t): pointer; procedure efree(ptr: pointer); function ecalloc(nmemb: size_t; size: size_t): pointer; function erealloc(ptr: pointer; size: size_t; allow_failure: integer): pointer; -function estrdup(const s: PAnsiChar): PAnsiChar; -function estrndup(s: PAnsiChar; len: Cardinal): PAnsiChar; -function STR_EMPTY_ALLOC : PAnsiChar; +function estrdup(const s: zend_pchar): zend_pchar; +function estrndup(s: zend_pchar; len: Cardinal): zend_pchar; +function STR_EMPTY_ALLOC : zend_pchar; var zend_set_memory_limit : function(memory_limit: uint): integer; cdecl; @@ -119,43 +119,43 @@ function STR_EMPTY_ALLOC : PAnsiChar; var zend_register_resource : function (rsrc_result : pzval; rsrc_pointer : pointer; rsrc_type : integer) : integer; cdecl; - zend_fetch_resource : function (passed_id :{$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; TSRMLS_DC : pointer; default_id : integer; resource_type_name : PAnsiChar; found_resource_type : pointer; num_resource_types: integer; resource_type: integer) : pointer; cdecl; + zend_fetch_resource : function (passed_id :{$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; TSRMLS_DC : pointer; default_id : integer; resource_type_name : zend_pchar; found_resource_type : pointer; num_resource_types: integer; resource_type: integer) : pointer; cdecl; zend_list_insert : function (ptr : pointer; _type: integer) : integer; cdecl; {$IFNDEF PHP7} _zend_list_addref : function (id : integer; TSRMLS_DC : pointer) : integer; cdecl; _zend_list_delete : function (id : integer; TSRMLS_DC : pointer) : integer; cdecl; _zend_list_find : function (id : integer; _type : pointer; TSRMLS_DC : pointer) : pointer; cdecl; {$ENDIF} - zend_rsrc_list_get_rsrc_type : function (resource: integer; TSRMLS_DC : pointer) : PAnsiChar; cdecl; - zend_fetch_list_dtor_id : function (type_name : PAnsiChar) : integer; cdecl; - zend_register_list_destructors_ex : function (ld : pointer; pld : pointer; type_name : PAnsiChar; module_number : integer) : integer; cdecl; + zend_rsrc_list_get_rsrc_type : function (resource: integer; TSRMLS_DC : pointer) : zend_pchar; cdecl; + zend_fetch_list_dtor_id : function (type_name : zend_pchar) : integer; cdecl; + zend_register_list_destructors_ex : function (ld : pointer; pld : pointer; type_name : zend_pchar; module_number : integer) : integer; cdecl; {disable functions} var - zend_disable_function : function(function_name : PAnsiChar; function_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; - zend_disable_class : function(class_name : PAnsiChar; class_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; + zend_disable_function : function(function_name : zend_pchar; function_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; + zend_disable_class : function(class_name : zend_pchar; class_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; {$IFDEF PHP4} - zend_hash_add_or_update : function(ht: PHashTable; arKey: PAnsiChar; + zend_hash_add_or_update : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; pData: Pointer; nDataSize: uint; pDest: Pointer; flag: Integer): Integer; cdecl; {$ELSE} var - _zend_hash_add_or_update : function (ht : PHashTable; arKey : PAnsiChar; + _zend_hash_add_or_update : function (ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; - flag : integer; __zend_filename: PAnsiChar; __zend_lineno: uint) : integer; cdecl; + flag : integer; __zend_filename: zend_pchar; __zend_lineno: uint) : integer; cdecl; - function zend_hash_add_or_update(ht : PHashTable; arKey : PAnsiChar; + function zend_hash_add_or_update(ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; flag : integer) : integer; cdecl; {$ENDIF} -function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; +function zend_hash_add(ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; var {$IFDEF PHP4} @@ -168,7 +168,7 @@ function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pD persistent: Integer; bApplyProtection: boolean): Integer; cdecl; - zend_hash_quick_add_or_update : function(ht: PHashTable; arKey: PAnsiChar; + zend_hash_quick_add_or_update : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; h: ulong; pData: Pointer; nDataSize: uint; pDest: Pointer; flag: Integer): Integer; cdecl; @@ -182,10 +182,10 @@ function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pD _zend_hash_init : function (ht : PHashTable; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool; - __zend_filename: PAnsiChar; __zend_lineno: uint) : integer; cdecl; + __zend_filename: zend_pchar; __zend_lineno: uint) : integer; cdecl; _zend_hash_init_ex : function (ht : PHashTable; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent : zend_bool; - bApplyProtection : zend_bool; __zend_filename: PAnsiChar; __zend_lineno: uint): integer; cdecl; + bApplyProtection : zend_bool; __zend_filename: zend_pchar; __zend_lineno: uint): integer; cdecl; function zend_hash_init (ht : PHashTable; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool) : integer; cdecl; @@ -204,7 +204,7 @@ function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pD - zend_hash_add_empty_element : function(ht: PHashTable; arKey: PAnsiChar; + zend_hash_add_empty_element : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint): Integer; cdecl; @@ -231,25 +231,25 @@ function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pD { Deletes } - zend_hash_del_key_or_index : function(ht: PHashTable; arKey: PAnsiChar; + zend_hash_del_key_or_index : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; h: ulong; flag: Integer): Integer; cdecl; - zend_get_hash_value : function(ht: PHashTable; arKey: PAnsiChar; + zend_get_hash_value : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint): Longint; cdecl; { Data retreival } - zend_hash_find : function(ht: PHashTable; arKey: PAnsiChar; nKeyLength: uint; + zend_hash_find : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; pData: Pointer): Integer; cdecl; - zend_hash_quick_find : function(ht: PHashTable; arKey: PAnsiChar; + zend_hash_quick_find : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; h: ulong; pData: Pointer): Integer; cdecl; zend_hash_index_find : function(ht: PHashTable; h: ulong; pData: Pointer): Integer; cdecl; { Misc } - zend_hash_exists : function(ht: PHashTable; arKey: PAnsiChar; nKeyLength: uint): Integer; cdecl; + zend_hash_exists : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint): Integer; cdecl; zend_hash_index_exists : function(ht: PHashTable; h: ulong): Integer; cdecl; @@ -262,7 +262,7 @@ function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pD zend_hash_move_backwards_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; zend_hash_get_current_key_ex : function(ht: PHashTable; - var str_index: PAnsiChar; var str_length: uint; var num_index: ulong; + var str_index: zend_pchar; var str_length: uint; var num_index: ulong; duplicate: boolean; pos: HashPosition): Integer; cdecl; zend_hash_get_current_key_type_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; @@ -292,7 +292,7 @@ function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pD zend_hash_rehash : function(ht: PHashTable): Integer; cdecl; - zend_hash_func : function(arKey: PAnsiChar; nKeyLength: uint): Longint; cdecl; + zend_hash_func : function(arKey: zend_pchar; nKeyLength: uint): Longint; cdecl; function zend_hash_get_current_data(ht: PHashTable; pData: Pointer): Integer; cdecl; @@ -300,35 +300,35 @@ procedure zend_hash_internal_pointer_reset(ht: PHashTable); cdecl; var - zend_get_constant : function(name: PAnsiChar; name_len: uint; var result: zval; + zend_get_constant : function(name: zend_pchar; name_len: uint; var result: zval; TSRMLS_DC: Pointer): Integer; cdecl; - zend_register_long_constant : procedure(name: PAnsiChar; name_len: uint; + zend_register_long_constant : procedure(name: zend_pchar; name_len: uint; lval: Longint; flags: Integer; module_number: Integer; TSRMLS_DC: Pointer); cdecl; - zend_register_double_constant : procedure(name: PAnsiChar; name_len: uint; dval: Double; flags: Integer; module_number: Integer; + zend_register_double_constant : procedure(name: zend_pchar; name_len: uint; dval: Double; flags: Integer; module_number: Integer; TSRMLS_DC: Pointer); cdecl; - zend_register_string_constant : procedure(name: PAnsiChar; name_len: uint; strval: PAnsiChar; flags: Integer; module_number: Integer; + zend_register_string_constant : procedure(name: zend_pchar; name_len: uint; strval: zend_pchar; flags: Integer; module_number: Integer; TSRMLS_DC: Pointer); cdecl; - zend_register_stringl_constant : procedure(name: PAnsiChar; name_len: uint; - strval: PAnsiChar; strlen: uint; flags: Integer; module_number: Integer; + zend_register_stringl_constant : procedure(name: zend_pchar; name_len: uint; + strval: zend_pchar; strlen: uint; flags: Integer; module_number: Integer; TSRMLS_DC: Pointer); cdecl; zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): Integer; cdecl; - zend_register_auto_global : function(name: PAnsiChar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; + zend_register_auto_global : function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; -procedure REGISTER_MAIN_LONG_CONSTANT(name: PAnsiChar; lval: longint; flags: integer; TSRMLS_DC: Pointer); -procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: PAnsiChar; dval: double; flags: integer; TSRMLS_DC: Pointer); -procedure REGISTER_MAIN_STRING_CONSTANT(name: PAnsiChar; str: PAnsiChar; flags: integer; TSRMLS_DC: Pointer); -procedure REGISTER_MAIN_STRINGL_CONSTANT(name: PAnsiChar; str: PAnsiChar; len: uint; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_LONG_CONSTANT(name: zend_pchar; lval: longint; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: zend_pchar; dval: double; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_STRING_CONSTANT(name: zend_pchar; str: zend_pchar; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_STRINGL_CONSTANT(name: zend_pchar; str: zend_pchar; len: uint; flags: integer; TSRMLS_DC: Pointer); var tsrm_startup : function(expected_threads: integer; - expected_resources: integer; debug_level: integer; debug_filename: PAnsiChar): integer; cdecl; + expected_resources: integer; debug_level: integer; debug_filename: zend_pchar): integer; cdecl; ts_allocate_id : function(rsrc_id: pts_rsrc_id; size: size_t; ctor: pointer; dtor: pointer): ts_rsrc_id; cdecl; // deallocates all occurrences of a given id @@ -338,28 +338,28 @@ procedure REGISTER_MAIN_STRINGL_CONSTANT(name: PAnsiChar; str: PAnsiChar; len: u ts_resource_ex : function(id: integer; p: pointer): pointer; cdecl; ts_free_thread : procedure; cdecl; - zend_error : procedure(ErrType: integer; ErrText: PAnsiChar); cdecl; + zend_error : procedure(ErrType: integer; ErrText: zend_pchar); cdecl; zend_error_cb : procedure; cdecl; - zend_eval_string : function(str: PAnsiChar; val: pointer; strname: PAnsiChar; tsrm: pointer): integer; cdecl; - zend_make_compiled_string_description : function(a: PAnsiChar; tsrm: pointer): PAnsiChar; cdecl; + zend_eval_string : function(str: zend_pchar; val: pointer; strname: zend_pchar; tsrm: pointer): integer; cdecl; + zend_make_compiled_string_description : function(a: zend_pchar; tsrm: pointer): zend_pchar; cdecl; {$IFDEF PHP4} - _zval_copy_ctor : function(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint): integer; cdecl; - _zval_dtor : procedure(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + _zval_copy_ctor : function(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint): integer; cdecl; + _zval_dtor : procedure(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; {$ELSE} - _zval_copy_ctor_func : procedure(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; - _zval_dtor_func : procedure(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; - _zval_ptr_dtor: procedure(val: ppzval; __zend_filename: PAnsiChar); cdecl; - procedure _zval_copy_ctor (val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; - procedure _zval_dtor(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + _zval_copy_ctor_func : procedure(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; + _zval_dtor_func : procedure(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; + _zval_ptr_dtor: procedure(val: ppzval; __zend_filename: zend_pchar); cdecl; + procedure _zval_copy_ctor (val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; + procedure _zval_dtor(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; {$ENDIF} var zend_print_variable : function(val: pzval): integer; cdecl; - zend_get_compiled_filename : function(TSRMLS_DC: Pointer): PAnsiChar; cdecl; + zend_get_compiled_filename : function(TSRMLS_DC: Pointer): zend_pchar; cdecl; zend_get_compiled_lineno : function(TSRMLS_DC: Pointer): integer; cdecl; @@ -370,7 +370,7 @@ function zval_copy_ctor(val : pzval) : integer; function ts_resource(id : integer) : pointer; function tsrmls_fetch : pointer; -//procedure zenderror(Error : PAnsiChar); +//procedure zenderror(Error : zend_pchar); var zend_stack_init : function(stack: Pzend_stack): Integer; cdecl; @@ -399,7 +399,7 @@ function tsrmls_fetch : pointer; //zend_operators.h var - _convert_to_string : procedure(op: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); cdecl; + _convert_to_string : procedure(op: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; procedure convert_to_string(op: pzval); @@ -468,7 +468,7 @@ procedure convert_to_string(op: pzval); add_string_to_string : function(_result: Pzval; op1: Pzval; op2: Pzval): Integer; cdecl; - zend_string_to_double : function(number: PAnsiChar; length: zend_uint): Double; cdecl; + zend_string_to_double : function(number: zend_pchar; length: zend_uint): Double; cdecl; zval_is_true : function(op: Pzval): Integer; cdecl; @@ -478,7 +478,7 @@ procedure convert_to_string(op: pzval); string_compare_function : function(_result: Pzval; op1: Pzval; op2: Pzval; TSRMLS_DC: Pointer): Integer; cdecl; - zend_str_tolower : procedure(str: PAnsiChar; length: Integer); cdecl; + zend_str_tolower : procedure(str: zend_pchar; length: Integer); cdecl; zend_binary_zval_strcmp : function(s1: Pzval; s2: Pzval): Integer; cdecl; @@ -488,13 +488,13 @@ procedure convert_to_string(op: pzval); zend_binary_zval_strncasecmp : function(s1: Pzval; s2: Pzval; s3: Pzval): Integer; cdecl; - zend_binary_strcmp : function(s1: PAnsiChar; len1: uint; s2: PAnsiChar; len2: uint): Integer; cdecl; + zend_binary_strcmp : function(s1: zend_pchar; len1: uint; s2: zend_pchar; len2: uint): Integer; cdecl; - zend_binary_strncmp : function(s1: PAnsiChar; len1: uint; s2: PAnsiChar; len2: uint; length: uint): Integer; cdecl; + zend_binary_strncmp : function(s1: zend_pchar; len1: uint; s2: zend_pchar; len2: uint; length: uint): Integer; cdecl; - zend_binary_strcasecmp : function(s1: PAnsiChar; len1: uint; s2: PAnsiChar; len2: uint): Integer; cdecl; + zend_binary_strcasecmp : function(s1: zend_pchar; len1: uint; s2: zend_pchar; len2: uint): Integer; cdecl; - zend_binary_strncasecmp : function(s1: PAnsiChar; len1: uint; s2: PAnsiChar; len2: uint; length: uint): Integer; cdecl; + zend_binary_strncasecmp : function(s1: zend_pchar; len1: uint; s2: zend_pchar; len2: uint; length: uint): Integer; cdecl; zendi_smart_strcmp : procedure(_result: zval; s1: Pzval; s2: Pzval); cdecl; @@ -504,12 +504,12 @@ procedure convert_to_string(op: pzval); zend_compare_objects : procedure(_result: Pzval; o1: Pzval; o2: Pzval; TSRMLS_DC: Pointer); cdecl; - zend_atoi : function(str: PAnsiChar; str_len: Integer): Integer; cdecl; + zend_atoi : function(str: zend_pchar; str_len: Integer): Integer; cdecl; //zend_execute.h - get_active_function_name : function(TSRMLS_D: pointer): PAnsiChar; cdecl; + get_active_function_name : function(TSRMLS_D: pointer): zend_pchar; cdecl; - zend_get_executed_filename : function(TSRMLS_D: pointer): PAnsiChar; cdecl; + zend_get_executed_filename : function(TSRMLS_D: pointer): zend_pchar; cdecl; zend_get_executed_lineno : function(TSRMLS_DC: pointer): uint; cdecl; @@ -525,13 +525,13 @@ procedure convert_to_string(op: pzval); zend_strip : procedure(TSRMLS_D: pointer); cdecl; - highlight_file : function(filename: PAnsiChar; syntax_highlighter_ini: Pzend_syntax_highlighter_ini; TSRMLS_DC: Pointer): Integer; cdecl; + highlight_file : function(filename: zend_pchar; syntax_highlighter_ini: Pzend_syntax_highlighter_ini; TSRMLS_DC: Pointer): Integer; cdecl; - highlight_string : function(str: Pzval; syntax_highlighter_ini: Pzend_syntax_highlighter_ini; str_name: PAnsiChar; TSRMLS_DC: Pointer): Integer; cdecl; + highlight_string : function(str: Pzval; syntax_highlighter_ini: Pzend_syntax_highlighter_ini; str_name: zend_pchar; TSRMLS_DC: Pointer): Integer; cdecl; - zend_html_putc : procedure(c: AnsiChar); cdecl; + zend_html_putc : procedure(c: zend_uchar); cdecl; - zend_html_puts : procedure(s: PAnsiChar; len: uint; TSRMLS_DC: Pointer); cdecl; + zend_html_puts : procedure(s: zend_pchar; len: uint; TSRMLS_DC: Pointer); cdecl; zend_indent : procedure; cdecl; @@ -554,47 +554,47 @@ procedure dispose_pzval_array(Params: pzval_array); var - _zend_bailout : procedure (filename : PAnsiChar; lineno : uint); cdecl; + _zend_bailout : procedure (filename : zend_pchar; lineno : uint); cdecl; - zend_alter_ini_entry : function(name: PAnsiChar; name_length: uint; new_value: PAnsiChar; new_value_length: uint; modify_type: Integer; stage: Integer): Integer; cdecl; - zend_alter_ini_entry_ex : function(name: PAnsiChar; name_length: uint; new_value: PAnsiChar; new_value_length: uint; modify_type: Integer; stage: Integer; force_change: integer): Integer; cdecl; + zend_alter_ini_entry : function(name: zend_pchar; name_length: uint; new_value: zend_pchar; new_value_length: uint; modify_type: Integer; stage: Integer): Integer; cdecl; + zend_alter_ini_entry_ex : function(name: zend_pchar; name_length: uint; new_value: zend_pchar; new_value_length: uint; modify_type: Integer; stage: Integer; force_change: integer): Integer; cdecl; - zend_restore_ini_entry : function(name: PAnsiChar; name_length: uint; stage: Integer): Integer; cdecl; + zend_restore_ini_entry : function(name: zend_pchar; name_length: uint; stage: Integer): Integer; cdecl; - zend_ini_long : function(name: PAnsiChar; name_length: uint; orig: Integer): Longint; cdecl; + zend_ini_long : function(name: zend_pchar; name_length: uint; orig: Integer): Longint; cdecl; - zend_ini_double : function(name: PAnsiChar; name_length: uint; orig: Integer): Double; cdecl; + zend_ini_double : function(name: zend_pchar; name_length: uint; orig: Integer): Double; cdecl; - zend_ini_string : function(name: PAnsiChar; name_length: uint; orig: Integer): PAnsiChar; cdecl; + zend_ini_string : function(name: zend_pchar; name_length: uint; orig: Integer): zend_pchar; cdecl; - compile_string : function(source_string: pzval; filename: PAnsiChar; TSRMLS_DC: Pointer): pointer; cdecl; + compile_string : function(source_string: pzval; filename: zend_pchar; TSRMLS_DC: Pointer): pointer; cdecl; execute : procedure(op_array: pointer; TSRMLS_DC: Pointer); cdecl; zend_wrong_param_count : procedure(TSRMLS_D: pointer); cdecl; - _zend_hash_quick_add_or_update:function(ht: PHashTable; arKey: PAnsiChar; nKeyLength: uint; h: uint; out pData: pzval; nDataSize: uint; pDest: PPointer; flag: Integer) : Integer; cdecl; + _zend_hash_quick_add_or_update:function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; h: uint; out pData: pzval; nDataSize: uint; pDest: PPointer; flag: Integer) : Integer; cdecl; {$IFDEF PHP4} - add_property_long_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; l: longint): integer; cdecl; + add_property_long_ex : function(arg: pzval; key: zend_pchar; key_len: uint; l: longint): integer; cdecl; {$ELSE} - add_property_long_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; l: longint; TSRMLS_DC : pointer): integer; cdecl; + add_property_long_ex : function(arg: pzval; key: zend_pchar; key_len: uint; l: longint; TSRMLS_DC : pointer): integer; cdecl; {$ENDIF} {$IFDEF PHP4} - add_property_null_ex : function(arg: pzval; key: PAnsiChar; key_len: uint): integer; cdecl; - add_property_bool_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; b: integer): integer; cdecl; - add_property_resource_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; r: integer): integer; cdecl; - add_property_double_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; d: double): integer; cdecl; - add_property_string_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; duplicate: integer): integer; cdecl; - add_property_stringl_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; len: uint; duplicate: integer): integer; cdecl; - add_property_zval_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; value: pzval): integer; cdecl; + add_property_null_ex : function(arg: pzval; key: zend_pchar; key_len: uint): integer; cdecl; + add_property_bool_ex : function(arg: pzval; key: zend_pchar; key_len: uint; b: integer): integer; cdecl; + add_property_resource_ex : function(arg: pzval; key: zend_pchar; key_len: uint; r: integer): integer; cdecl; + add_property_double_ex : function(arg: pzval; key: zend_pchar; key_len: uint; d: double): integer; cdecl; + add_property_string_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; duplicate: integer): integer; cdecl; + add_property_stringl_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; len: uint; duplicate: integer): integer; cdecl; + add_property_zval_ex : function(arg: pzval; key: zend_pchar; key_len: uint; value: pzval): integer; cdecl; {$ELSE} - add_property_null_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; TSRMLS_DC: Pointer): integer; cdecl; - add_property_bool_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; b: integer; TSRMLS_DC: Pointer): integer; cdecl; - add_property_resource_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; r: integer; TSRMLS_DC: Pointer): integer; cdecl; - add_property_double_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; d: double; TSRMLS_DC: Pointer): integer; cdecl; - add_property_string_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; - add_property_stringl_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; len: uint; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; - add_property_zval_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; value: pzval; TSRMLS_DC: Pointer): integer; cdecl; + add_property_null_ex : function(arg: pzval; key: zend_pchar; key_len: uint; TSRMLS_DC: Pointer): integer; cdecl; + add_property_bool_ex : function(arg: pzval; key: zend_pchar; key_len: uint; b: integer; TSRMLS_DC: Pointer): integer; cdecl; + add_property_resource_ex : function(arg: pzval; key: zend_pchar; key_len: uint; r: integer; TSRMLS_DC: Pointer): integer; cdecl; + add_property_double_ex : function(arg: pzval; key: zend_pchar; key_len: uint; d: double; TSRMLS_DC: Pointer): integer; cdecl; + add_property_string_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; + add_property_stringl_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; len: uint; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; + add_property_zval_ex : function(arg: pzval; key: zend_pchar; key_len: uint; value: pzval; TSRMLS_DC: Pointer): integer; cdecl; {$ENDIF} @@ -621,22 +621,22 @@ procedure dispose_pzval_array(Params: pzval_array); } - add_assoc_long_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; n: longint): integer; cdecl; - add_assoc_null_ex : function(arg: pzval; key: PAnsiChar; key_len: uint): integer; cdecl; - add_assoc_bool_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; b: integer): integer; cdecl; - add_assoc_resource_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; r: integer): integer; cdecl; - add_assoc_double_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; d: double): integer; cdecl; - add_assoc_string_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; duplicate: integer): integer; cdecl; - add_assoc_stringl_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; len: uint; duplicate: integer): integer; cdecl; - add_assoc_zval_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; value: pzval): integer; cdecl; + add_assoc_long_ex : function(arg: pzval; key: zend_pchar; key_len: uint; n: longint): integer; cdecl; + add_assoc_null_ex : function(arg: pzval; key: zend_pchar; key_len: uint): integer; cdecl; + add_assoc_bool_ex : function(arg: pzval; key: zend_pchar; key_len: uint; b: integer): integer; cdecl; + add_assoc_resource_ex : function(arg: pzval; key: zend_pchar; key_len: uint; r: integer): integer; cdecl; + add_assoc_double_ex : function(arg: pzval; key: zend_pchar; key_len: uint; d: double): integer; cdecl; + add_assoc_string_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; duplicate: integer): integer; cdecl; + add_assoc_stringl_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; len: uint; duplicate: integer): integer; cdecl; + add_assoc_zval_ex : function(arg: pzval; key: zend_pchar; key_len: uint; value: pzval): integer; cdecl; add_index_long : function(arg: pzval; idx: uint; n: longint): integer; cdecl; add_index_null : function(arg: pzval; idx: uint): integer; cdecl; add_index_bool : function(arg: pzval; idx: uint; b: integer): integer; cdecl; add_index_resource : function(arg: pzval; idx: uint; r: integer): integer; cdecl; add_index_double : function(arg: pzval; idx: uint; d: double): integer; cdecl; - add_index_string : function(arg: pzval; idx: uint; str: PAnsiChar; duplicate: integer): integer; cdecl; - add_index_stringl : function(arg: pzval; idx: uint; str: PAnsiChar; len: uint; duplicate: integer): integer; cdecl; + add_index_string : function(arg: pzval; idx: uint; str: zend_pchar; duplicate: integer): integer; cdecl; + add_index_stringl : function(arg: pzval; idx: uint; str: zend_pchar; len: uint; duplicate: integer): integer; cdecl; add_index_zval : function(arg: pzval; index: uint; value: pzval): integer; cdecl; add_next_index_long : function(arg: pzval; n: longint): integer; cdecl; @@ -644,33 +644,33 @@ procedure dispose_pzval_array(Params: pzval_array); add_next_index_bool : function(arg: pzval; b: integer): integer; cdecl; add_next_index_resource : function(arg: pzval; r: integer): integer; cdecl; add_next_index_double : function(arg: pzval; d: double): integer; cdecl; - add_next_index_string : function(arg: pzval; str: PAnsiChar; duplicate: integer): integer; cdecl; - add_next_index_stringl : function(arg: pzval; str: PAnsiChar; len: uint; duplicate: integer): integer; cdecl; + add_next_index_string : function(arg: pzval; str: zend_pchar; duplicate: integer): integer; cdecl; + add_next_index_stringl : function(arg: pzval; str: zend_pchar; len: uint; duplicate: integer): integer; cdecl; add_next_index_zval : function(arg: pzval; value: pzval): integer; cdecl; - add_get_assoc_string_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; dest: pointer; duplicate: integer): integer; cdecl; - add_get_assoc_stringl_ex : function(arg: pzval; key: PAnsiChar; key_len: uint; str: PAnsiChar; len: uint; dest: pointer; duplicate: integer): integer; cdecl; + add_get_assoc_string_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; dest: pointer; duplicate: integer): integer; cdecl; + add_get_assoc_stringl_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; len: uint; dest: pointer; duplicate: integer): integer; cdecl; add_get_index_long : function(arg: pzval; idx: uint; l: longint; dest: pointer): integer; cdecl; add_get_index_double : function(arg: pzval; idx: uint; d: double; dest: pointer): integer; cdecl; - add_get_index_string : function(arg: pzval; idx: uint; str: PAnsiChar; dest: pointer; duplicate: integer): integer; cdecl; - add_get_index_stringl : function(arg: pzval; idx: uint; str: PAnsiChar; len: uint; dest: pointer; duplicate: integer): integer; cdecl; + add_get_index_string : function(arg: pzval; idx: uint; str: zend_pchar; dest: pointer; duplicate: integer): integer; cdecl; + add_get_index_stringl : function(arg: pzval; idx: uint; str: zend_pchar; len: uint; dest: pointer; duplicate: integer): integer; cdecl; - _array_init : function(arg: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint): integer; cdecl; + _array_init : function(arg: pzval; __zend_filename: zend_pchar; __zend_lineno: uint): integer; cdecl; {$IFDEF PHP4} - _object_init : function(arg: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; + _object_init : function(arg: pzval; __zend_filename: zend_pchar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; {$ELSE} _object_init : function(arg: pzval;TSRMLS_DC: pointer): integer; cdecl; {$ENDIF} {$IFDEF PHP4} - _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_filename: PAnsiChar; __zend_lineno: uint; TSRMLS_DC: pointer) : integer; cdecl; + _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_filename: zend_pchar; __zend_lineno: uint; TSRMLS_DC: pointer) : integer; cdecl; {$ELSE} _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_lineno : integer; TSRMLS_DC : pointer) : integer; cdecl; {$ENDIF} - _object_and_properties_init : function(arg: pzval; ce: pointer; properties: phashtable; __zend_filename: PAnsiChar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; + _object_and_properties_init : function(arg: pzval; ce: pointer; properties: phashtable; __zend_filename: zend_pchar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; {$IFDEF PHP5} @@ -680,46 +680,46 @@ procedure dispose_pzval_array(Params: pzval_array); var zend_write : zend_write_t; -procedure ZEND_PUTS(str: PAnsiChar); +procedure ZEND_PUTS(str: zend_pchar); var zend_register_internal_class : function(class_entry: pzend_class_entry; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; - zend_register_internal_class_ex : function(class_entry: pzend_class_entry; parent_ce: pzend_class_entry; parent_name: PAnsiChar; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; + zend_register_internal_class_ex : function(class_entry: pzend_class_entry; parent_ce: pzend_class_entry; parent_name: zend_pchar; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; function ZvalInt(z:zval):Integer; function ZvalDouble(z:zval):Double; function ZvalBool(z:zval):Boolean; function ZvalStrS(z:zval) : string; - function ZvalStr(z:zval) : AnsiString; + function ZvalStr(z:zval) : zend_ustr; function ZvalStrW(z:zval) : WideString; procedure ZvalVAL(z:pzval; v:Boolean) overload; procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG) overload; procedure ZvalVAL(z:pzval) overload; procedure ZvalVAL(z:pzval; v:Double) overload; - procedure ZvalVAL(z: pzval; s: AnsiString; len: Integer = 0); overload; + procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); overload; procedure ZvalString(z:pzval) overload; - procedure ZvalString(z:pzval; s:PAnsiChar; len:Integer = 0) overload; + procedure ZvalString(z:pzval; s:zend_pchar; len:Integer = 0) overload; procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0) overload; procedure ZvalString(z:pzval; s:string; len:Integer = 0) overload; function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) : Integer; overload; -function ZvalArrayAdd(z: pzval; key: AnsiString; Args: array of const) +function ZvalArrayAdd(z: pzval; key: zend_ustr; Args: array of const) : Integer; overload; -function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; -function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) +function ZValArrayKeyExists(v: pzval; key: zend_ustr): Boolean; overload; +function ZValArrayKeyExists(v: pzval; key: zend_ustr; out pData: pzval) : Boolean; overload; function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) : Boolean; overload; -function ZValArrayKeyDel(v: pzval; key: AnsiString): Boolean; overload; +function ZValArrayKeyDel(v: pzval; key: zend_ustr): Boolean; overload; function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; -function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: ppzval) +function ZValArrayKeyFind(v: pzval; key: zend_ustr; out pData: ppzval) : Boolean; overload; function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) : Boolean; overload; @@ -738,11 +738,11 @@ function add_next_index_variant(arg: pzval; value: variant): integer; procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; -procedure ZVAL_ARRAY(z: pzval; arr: array of ansistring); overload; +procedure ZVAL_ARRAY(z: pzval; arr: array of zend_ustr); overload; procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; -procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of PAnsiChar; keyvals: Array of PAnsiChar); +procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of AnsiChar; keyvals: Array of AnsiChar); procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of PWideChar); procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array of AnsiString); overload; procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; @@ -751,28 +751,28 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of st procedure HashToArray(HT: PHashTable; var AR: TArrayVariant); overload; procedure ArrayToHash(AR: Array of Variant; var HT: pzval); overload; procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; -function ToStrA(V: Variant): AnsiString; +function ToStrA(V: Variant): zend_ustr; function ToStr(V: Variant): String; -function toWChar(s: PAnsiChar): PWideChar; +function toWChar(s: zend_pchar): PWideChar; function ZendToVariant(const Value: {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}): Variant; overload; function ZendToVariant(const Value: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}): Variant; overload; -procedure ZVAL_STRING(z: pzval; s: PAnsiChar; duplicate: boolean); +procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); -procedure ZVAL_STRINGL(z: pzval; s: PAnsiChar; l: integer; duplicate: boolean); +procedure ZVAL_STRINGL(z: pzval; s: zend_pchar; l: integer; duplicate: boolean); procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); -procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: PAnsiChar; functions: pointer); +procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: zend_pchar; functions: pointer); var - get_zend_version : function(): PAnsiChar; cdecl; + get_zend_version : function(): zend_pchar; cdecl; zend_make_printable_zval : procedure(expr: pzval; expr_copy: pzval; use_copy: pint); cdecl; zend_print_zval : function(expr: pzval; indent: integer): integer; cdecl; zend_print_zval_r : procedure(expr: pzval; indent: integer); cdecl; - zend_output_debug_string : procedure(trigger_break: boolean; Msg: PAnsiChar); cdecl; + zend_output_debug_string : procedure(trigger_break: boolean; Msg: zend_pchar); cdecl; {$IFDEF PHP5} zend_copy_constants: procedure(target: PHashTable; source: PHashTable); cdecl; @@ -802,9 +802,9 @@ function setjmp(buf : jump_buf) : integer; cdecl; external MSCRT name '_setjmp {$ENDIF} {$IFNDEF COMPILER_VC9} -function strdup(strSource : PAnsiChar) : PAnsiChar; cdecl; external MSCRT name '_strdup'; +function strdup(strSource : zend_pchar) : zend_pchar; cdecl; external MSCRT name '_strdup'; {$ELSE} -function DupStr(strSource : PAnsiChar) : PAnsiChar; cdecl; +function DupStr(strSource : zend_pchar) : zend_pchar; cdecl; {$ENDIF} {$IFNDEF PHP7} function ZEND_FAST_ALLOC: pzval; @@ -845,7 +845,7 @@ function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : i function Z_LVAL(z : Pzval) : longint; function Z_BVAL(z : Pzval) : boolean; function Z_DVAL(z : Pzval) : double; -function Z_STRVAL(z : Pzval) : AnsiString; +function Z_STRVAL(z : Pzval) : zend_ustr; function Z_STRUVAL(z : PZval): UTF8String; function Z_STRWVAL(z : pzval) : String; function Z_STRLEN(z : Pzval) : longint; @@ -865,17 +865,17 @@ function Z_VARREC(z: pzval): TVarRec; implementation -function zend_hash_add(ht : PHashTable; arKey : PAnsiChar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; +function zend_hash_add(ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; begin result := zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDest, HASH_ADD); end; -function STR_EMPTY_ALLOC : PAnsiChar; +function STR_EMPTY_ALLOC : zend_pchar; begin Result := estrndup('', 0); end; -function estrndup(s: PAnsiChar; len: Cardinal): PAnsiChar; +function estrndup(s: zend_pchar; len: Cardinal): zend_pchar; begin if assigned(s) then Result := _estrndup(s, len, nil, 0, nil, 0) @@ -909,7 +909,7 @@ function erealloc(ptr: pointer; size: size_t; allow_failure: integer): pointer; Result := _erealloc(ptr, size, allow_failure, nil, 0, nil, 0); end; -function estrdup(const s: PAnsiChar): PAnsiChar; +function estrdup(const s: zend_pchar): zend_pchar; begin if assigned(s) then begin @@ -920,22 +920,22 @@ function estrdup(const s: PAnsiChar): PAnsiChar; end; -procedure REGISTER_MAIN_LONG_CONSTANT(name: PAnsiChar; lval: longint; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_LONG_CONSTANT(name: zend_pchar; lval: longint; flags: integer; TSRMLS_DC: Pointer); begin zend_register_long_constant(name, length(name) + 1, lval, flags, 0, TSRMLS_DC); end; -procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: PAnsiChar; dval: double; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: zend_pchar; dval: double; flags: integer; TSRMLS_DC: Pointer); begin zend_register_double_constant(name, length(name) + 1, dval, flags, 0, TSRMLS_DC); end; -procedure REGISTER_MAIN_STRING_CONSTANT(name: PAnsiChar; str: PAnsiChar; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_STRING_CONSTANT(name: zend_pchar; str: zend_pchar; flags: integer; TSRMLS_DC: Pointer); begin zend_register_string_constant(name, length(name) + 1, str, flags, 0, TSRMLS_DC); end; -procedure REGISTER_MAIN_STRINGL_CONSTANT(name: PAnsiChar; str: PAnsiChar; len: uint; flags: integer; TSRMLS_DC: Pointer); +procedure REGISTER_MAIN_STRINGL_CONSTANT(name: zend_pchar; str: zend_pchar; len: uint; flags: integer; TSRMLS_DC: Pointer); begin zend_register_stringl_constant(name, length(name) + 1, str, len, flags, 0, TSRMLS_DC); end; @@ -975,7 +975,7 @@ procedure ZvalString(z:pzval); z^._type := IS_STRING; end; -procedure ZvalString(z:pzval; s:PAnsiChar; len:Integer = 0); +procedure ZvalString(z:pzval; s:zend_pchar; len:Integer = 0); var lens:Integer; begin @@ -998,7 +998,7 @@ procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0); if not assigned(s) then ZvalString(z) else - ZvalString(z, PAnsiChar(AnsiString(WideString(s))), len); + ZvalString(z, zend_pchar(zend_ustr(WideString(s))), len); end; procedure ZvalString(z:pzval; s:string; len:Integer = 0); @@ -1064,12 +1064,12 @@ procedure ZvalVAL(z:pzval; v:Double); z._type := IS_LONG; z.value.dval := v; End; -procedure ZvalVAL(z: pzval; s: AnsiString; len: Integer = 0); +procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); var lens: Integer; - AChar: PAnsiChar; + AChar: zend_pchar; begin - AChar := PAnsiChar(s); + AChar := zend_pchar(s); if not assigned(AChar) then ZVAL_NULL(z) @@ -1087,10 +1087,10 @@ procedure ZvalVAL(z: pzval; s: AnsiString; len: Integer = 0); end; function AddElementZvalArray(z: pzval; Args: array of const; flag: Integer; - idx: uint = 0; len: uint = 0; const key: AnsiString = ''): Integer; + idx: uint = 0; len: uint = 0; const key: zend_ustr = ''): Integer; var tmp: pzval; - arKey: PAnsiChar; + arKey: zend_pchar; begin Result := FAILURE; if z._type <> IS_ARRAY then @@ -1099,7 +1099,7 @@ function AddElementZvalArray(z: pzval; Args: array of const; flag: Integer; if len <> 0 then begin inc(len); - arKey := PAnsiChar(key); + arKey := zend_pchar(key); idx := zend_hash_func(arKey, len); end; @@ -1125,7 +1125,7 @@ function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) end; // Add Assoc -function ZvalArrayAdd(z: pzval; key: AnsiString; Args: array of const) +function ZvalArrayAdd(z: pzval; key: zend_ustr; Args: array of const) : Integer; overload; begin Result := AddElementZvalArray(z, Args, HASH_UPDATE, 0, Length(key), key); @@ -1136,7 +1136,7 @@ function IsArrayRetVal(v: pzval): Boolean; Result := v._type = IS_ARRAY; end; -function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; +function ZValArrayKeyExists(v: pzval; key: zend_ustr): Boolean; overload; begin Result := false; if v._type <> IS_ARRAY then @@ -1145,7 +1145,7 @@ function ZValArrayKeyExists(v: pzval; key: AnsiString): Boolean; overload; if v.value.ht.nNumOfElements = 0 then exit; - Result := zend_hash_exists(v.value.ht, PAnsiChar(key), Length(key) + 1) = 1; + Result := zend_hash_exists(v.value.ht, zend_pchar(key), Length(key) + 1) = 1; end; function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; @@ -1160,7 +1160,7 @@ function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; Result := zend_hash_index_exists(v.value.ht, idx) = 1; end; -function ZValArrayKeyExists(v: pzval; key: AnsiString; out pData: pzval) +function ZValArrayKeyExists(v: pzval; key: zend_ustr; out pData: pzval) : Boolean; overload; var tmp: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; @@ -1188,11 +1188,11 @@ function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) end; end; -function ZValArrayKeyDel(v: pzval; key: AnsiString): Boolean; overload; +function ZValArrayKeyDel(v: pzval; key: zend_ustr): Boolean; overload; begin Result := false; if ZValArrayKeyExists(v, key) then - Result := zend_hash_del_key_or_index(v.value.ht, PAnsiChar(key), + Result := zend_hash_del_key_or_index(v.value.ht, zend_pchar(key), Length(key) + 1, 0, HASH_DEL_KEY) = SUCCESS; end; @@ -1204,13 +1204,13 @@ function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; HASH_DEL_INDEX) = SUCCESS; end; -function ZValArrayKeyFind(v: pzval; key: AnsiString; out pData: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) +function ZValArrayKeyFind(v: pzval; key: zend_ustr; out pData: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) : Boolean; overload; var - keyStr: PAnsiChar; + keyStr: zend_pchar; KeyLength: uint; begin - keyStr := PAnsiChar(key); + keyStr := zend_pchar(key); KeyLength := Length(key) + 1; Result := zend_hash_quick_find(v.value.ht, keyStr, KeyLength, @@ -1258,21 +1258,21 @@ function GetArgPZval; vtClass, vtObject: ZvalVAL(Result, Args._Reserved1); vtString: - ZvalVAL(Result, AnsiString(Args.VString^)); + ZvalVAL(Result, zend_ustr(Args.VString^)); vtAnsiString: - ZvalVAL(Result, PAnsiChar(Args.VAnsiString)); + ZvalVAL(Result, zend_pchar(zend_ustr(Args.VAnsiString))); vtUnicodeString: ZvalVAL(Result, UnicodeString(Args._Reserved1)); vtWideChar: - ZvalVAL(Result, AnsiString(Args.VWideChar)); + ZvalVAL(Result, zend_ustr(Args.VWideChar)); vtChar: - ZvalVAL(Result, Args.VChar); + ZvalVAL(Result, zend_pchar(zend_uchar(Args.VChar))); vtPWideChar: ZvalVAL(Result, Args.VPWideChar); vtPChar: - ZvalVAL(Result, Args.VPChar); + ZvalVAL(Result, zend_pchar(Args.VPChar)); vtWideString: - ZvalVAL(Result, PWideChar(Args.VWideString)); + ZvalVAL(Result, zend_pchar(Args.VWideString)); end; end; end; @@ -1296,9 +1296,9 @@ procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); z^._type := IS_STRING; end; -procedure ZVAL_STRING(z: pzval; s: PAnsiChar; duplicate: boolean); +procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); var - __s : PAnsiChar; + __s : zend_pchar; begin if not assigned(s) then __s := '' @@ -1316,8 +1316,8 @@ procedure ZVAL_STRING(z: pzval; s: PAnsiChar; duplicate: boolean); procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); var - __s : PAnsiChar; - StA : AnsiString; + __s : zend_pchar; + StA : zend_ustr; StW : WideString; begin if not assigned(s) then @@ -1325,8 +1325,8 @@ procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); else begin StW := WideString(s); - StA := AnsiString(StW); - __s := PAnsiChar(StA); + StA := zend_ustr(StW); + __s := zend_pchar(StA); end; z^.value.str.len := strlen(__s); @@ -1338,9 +1338,9 @@ procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); z^._type := IS_STRING; end; -procedure ZVAL_STRINGL(z: pzval; s: PAnsiChar; l: integer; duplicate: boolean); +procedure ZVAL_STRINGL(z: pzval; s: zend_pchar; l: integer; duplicate: boolean); var - __s : PAnsiChar; + __s : zend_pchar; __l : integer; begin if not assigned(s) then @@ -1358,9 +1358,9 @@ procedure ZVAL_STRINGL(z: pzval; s: PAnsiChar; l: integer; duplicate: boolean); procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); var - __s : PAnsiChar; + __s : zend_pchar; __l : integer; - StA : AnsiString; + StA : zend_ustr; StW : WideString; begin if not assigned(s) then @@ -1368,8 +1368,8 @@ procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); else begin StW := WideString(s); - StA := AnsiString(StW); - __s := PAnsiChar(StA); + StA := zend_ustr(StW); + __s := zend_pchar(StA); end; __l := l; @@ -1403,7 +1403,7 @@ procedure ZVAL_FALSE(z: pzval); z^._type := IS_BOOL; z^.value.lval := 0; end; -function ToStrA(V: Variant): AnsiString; +function ToStrA(V: Variant): zend_ustr; begin Result := V; end; @@ -1413,12 +1413,12 @@ function ToStr(V: Variant): String; Result := V; end; -function ToPChar(V: Variant): PAnsiChar; +function ToPChar(V: Variant): zend_pchar; begin - Result := PAnsiChar(ToStr(V)); + Result := zend_pchar(ToStr(V)); end; -function toWChar(s: PAnsiChar): PWideChar; +function toWChar(s: zend_pchar): PWideChar; var ss: WideString; ss2: string; @@ -1485,8 +1485,8 @@ procedure ArrayToHash(AR: Array of Variant; var HT: pzval); overload; varDouble,varSingle: add_index_double(ht,i,AR[i]); varBoolean: add_index_bool(ht,i,AR[I]); varEmpty: add_index_null(ht,i); - varString: add_index_string(ht,i,PAnsiChar(ToStr(AR[I])),1); - 258: add_index_string(ht,i,PAnsiChar(AnsiString(ToStr(AR[I]))),1); + varString: add_index_string(ht,i,zend_pchar(ToStr(AR[I])),1); + 258: add_index_string(ht,i,zend_pchar(zend_ustr(ToStr(AR[I]))),1); end; end; end; @@ -1495,16 +1495,16 @@ procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; Var I,Len: Integer; v: Variant; - key: PAnsiChar; - s: PAnsiChar; + key: zend_pchar; + s: zend_pchar; begin _array_init(ht,nil,1); len := Length(AR); for i:=0 to len-1 do begin v := AR[I]; - key := PAnsiChar(ToStrA(keys[i])); - s := PAnsiChar(ToStrA(v)); + key := zend_pchar(ToStrA(keys[i])); + s := zend_pchar(ToStrA(v)); case VarType(AR[i]) of varInteger, varSmallint, varLongWord, 17: add_assoc_long_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[i]); varDouble,varSingle: add_assoc_double_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[i]); @@ -1527,7 +1527,7 @@ function add_next_index_variant(arg: pzval; value: variant): integer; Result := add_next_index_zval(arg, iz); Exit; end; - // MessageBoxA(0, PAnsiChar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ; + // MessageBoxA(0, zend_pchar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ; case TVarData(Value).VType of varString : //Peter Enz begin @@ -1545,7 +1545,7 @@ function add_next_index_variant(arg: pzval; value: variant): integer; begin S := string(TVarData(Value).VUString); - ZVAL_STRING(iz, PAnsiChar(AnsiString(S)), true); + ZVAL_STRING(iz, zend_pchar(zend_ustr(S)), true); end; varOleStr : //Peter Enz @@ -1594,7 +1594,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; for i := 0 to Length(arr)-1 do begin - add_next_index_string(z, PAnsiChar(AnsiString(arr[i])), 1); + add_next_index_string(z, zend_pchar(zend_ustr(arr[i])), 1); end; Exit; end; @@ -1617,7 +1617,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; for i := 0 to Length(arr)-1 do begin - add_next_index_string(z, PansiChar(arr[i]), 1); + add_next_index_string(z, zend_pchar(arr[i]), 1); end; Exit; end; @@ -1640,12 +1640,12 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; for i := 0 to Length(arr)-1 do begin - add_next_index_string(z, PansiChar(AnsiString(arr[i])), 1); + add_next_index_string(z, zend_pchar(zend_ustr(arr[i])), 1); end; Exit; end; -procedure ZVAL_ARRAY(z: pzval; arr: array of AnsiString); overload; +procedure ZVAL_ARRAY(z: pzval; arr: array of zend_ustr); overload; var i: integer; begin @@ -1663,7 +1663,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of AnsiString); overload; for i := 0 to Length(arr)-1 do begin - add_next_index_string(z, PansiChar(arr[i]), 1); + add_next_index_string(z, zend_pchar(arr[i]), 1); end; Exit; end; @@ -1737,36 +1737,36 @@ procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; varEmpty, varNull: add_next_index_null(z); varSmallInt: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VSmallInt))), 1); + add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VSmallInt))), 1); varInteger: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VInteger))), 1); + add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VInteger))), 1); varSingle: - add_next_index_string(z, PansiChar(AnsiString(V.VSingle.ToString())), 1); + add_next_index_string(z, zend_pchar(zend_ustr(V.VSingle.ToString())), 1); varDouble: add_next_index_double(z, V.VDouble); varCurrency: - add_next_index_string(z, PansiChar(AnsiString(CurrToStr(V.VCurrency))), 1); + add_next_index_string(z, zend_pchar(zend_ustr(CurrToStr(V.VCurrency))), 1); varDate: - add_next_index_string(z, PansiChar(AnsiString(DateTimeToStr(V.VDate))), 1); + add_next_index_string(z, zend_pchar(zend_ustr(DateTimeToStr(V.VDate))), 1); varOleStr: - add_next_index_string(z, PansiChar(AnsiString(V.VOleStr)), 1); + add_next_index_string(z, zend_pchar(zend_ustr(V.VOleStr)), 1); varBoolean: add_next_index_bool(z, V.VBoolean.ToInteger()); varByte: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VByte))), 1); + add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VByte))), 1); varWord: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VWord))), 1); + add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VWord))), 1); varShortInt: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VShortInt))), 1); + add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VShortInt))), 1); varLongWord: add_next_index_long(z, V.VLongWord); varInt64: - add_next_index_string(z, PansiChar(AnsiString(IntToStr(V.VInt64))), 1); + add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VInt64))), 1); varString: - add_next_index_string(z, PansiChar(AnsiString(V.VString)), 1); + add_next_index_string(z, zend_pchar(zend_ustr(V.VString)), 1); {$IFDEF SUPPORTS_UNICODE_STRING}{ varUString: - add_next_index_string(z, PansiChar(AnsiString(V.VUString)), 1); + add_next_index_string(z, zend_pchar(zend_ustr(V.VUString)), 1); {$ENDIF SUPPORTS_UNICODE_STRING} {varArray, varDispatch, @@ -1782,7 +1782,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; Exit; end; -procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of PAnsiChar; keyvals: Array of PAnsiChar); +procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of ansichar; keyvals: Array of ansichar); var i : integer; begin @@ -1801,17 +1801,12 @@ procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of PAnsiChar; keyvals: Array of if Length(keynames) = Length(keyvals) then begin for i := 0 to Length(keynames)-1 do - begin - add_assoc_string_ex(z, keynames[i], StrLen(keynames[i]) + 1, keyvals[i], 1); - end; - Exit; + add_assoc_string_ex(z, zend_pchar(zend_uchar(keynames[i])), StrLen(PAnsiChar(keynames[i])) + 1, zend_pchar(zend_uchar(keyvals[i])), 1); end else begin ZVAL_FALSE(z); - Exit; end; - end; procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of PWideChar); var @@ -1833,7 +1828,7 @@ procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of begin for i := 0 to Length(keynames)-1 do begin - add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + add_assoc_string_ex(z, zend_pchar(keynames[i]), StrLen(zend_pchar(keynames[i])) + 1, zend_pchar(keyvals[i]), 1); end; Exit; end @@ -1866,8 +1861,8 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overloa begin // // - add_assoc_string_ex(z, PAnsiChar(AnsiString(keynames[i])), StrLen(PAnsiChar(AnsiString(keynames[i]))) + 1, - PAnsiChar(AnsiString(keyvals[i])), 1); + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), StrLen(zend_pchar(zend_ustr(keynames[i]))) + 1, + zend_pchar(zend_ustr(keyvals[i])), 1); // end; @@ -1900,8 +1895,8 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of begin for i := 0 to Length(keynames)-1 do begin - add_assoc_string_ex(z, PAnsiChar(AnsiString(keynames[i])), StrLen(PAnsiChar(AnsiString(keynames[i]))) + 1, - PAnsiChar(AnsiString(keyvals[i])), 1); + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), StrLen(zend_pchar(zend_ustr(keynames[i]))) + 1, + zend_pchar(zend_ustr(keyvals[i])), 1); end; Exit; end @@ -1932,7 +1927,7 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; begin for i := 0 to Length(keynames)-1 do begin - add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + add_assoc_string_ex(z, zend_pchar(keynames[i]), StrLen(zend_pchar(keynames[i])) + 1, zend_pchar(keyvals[i]), 1); end; Exit; end @@ -1963,7 +1958,7 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array o begin for i := 0 to Length(keynames)-1 do begin - add_assoc_string_ex(z, PAnsiChar(keynames[i]), StrLen(PAnsiChar(keynames[i])) + 1, PAnsiChar(keyvals[i]), 1); + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), StrLen(PAnsiChar(keynames[i])) + 1, zend_pchar(zend_ustr(keyvals[i])), 1); end; Exit; end @@ -1991,14 +1986,14 @@ procedure UnloadZEND; end; -function LoadZEND(const DllFilename: AnsiString = PHPWin) : boolean; +function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; var WriteFuncPtr : pointer; begin {$IFDEF QUIET_LOAD} Result := false; {$ENDIF} - PHPLib := LoadLibraryA(PAnsiChar(DllFileName)); + PHPLib := {$IFDEF PHP_UNICE}LoadLibrary( PWideChar(WideString(DllFilename)) ){$ELSE}LoadLibraryA(zend_pchar(DllFileName)){$ENDIF}; {$IFNDEF QUIET_LOAD} if PHPLib = 0 then @@ -2744,7 +2739,7 @@ function LoadZEND(const DllFilename: AnsiString = PHPWin) : boolean; Result := true; end; -procedure ZEND_PUTS(str: PAnsiChar); +procedure ZEND_PUTS(str: zend_pchar); begin if assigned(str) then zend_write(str, strlen(str)); @@ -2755,7 +2750,7 @@ procedure convert_to_string(op: pzval); _convert_to_string(op, nil, 0); end; -procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: PAnsiChar; functions: pointer); +procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: zend_pchar; functions: pointer); begin if class_name = nil then @@ -2903,12 +2898,12 @@ procedure dispose_pzval_array(Params: pzval_array); { EPHP4DelphiException } -constructor EPHP4DelphiException.Create(const Msg: AnsiString); +constructor EPHP4DelphiException.Create(const Msg: zend_ustr); begin inherited Create('Unable to link '+ Msg+' function'); end; -{procedure zenderror(Error : PAnsiChar); +{procedure zenderror(Error : zend_pchar); begin zend_error(E_PARSE, Error); end;} @@ -3257,7 +3252,7 @@ function zend_register_functions(functions : pzend_function_entry; function_tab while (ptr.fname<> nil) do begin if (zend_hash_exists(target_function_table, ptr.fname, strlen(ptr.fname)+1)) = 1 then begin - zend_error(error_type, PAnsiChar(Format('Function registration failed - duplicate name - %s', [ptr.fname]))); + zend_error(error_type, zend_pchar(Format('Function registration failed - duplicate name - %s', [ptr.fname]))); end; inc(ptr); end; @@ -3280,7 +3275,7 @@ function GetGlobalResource(resource_name: AnsiString) : pointer; begin Result := nil; try - global_id := GetProcAddress(PHPLib, PAnsiChar(resource_name)); + global_id := GetProcAddress(PHPLib, zend_pchar(resource_name)); if Assigned(global_id) then begin tsrmls_dc := tsrmls_fetch; @@ -3414,7 +3409,7 @@ function Z_DVAL(z : pzval) : double; function Z_VARREC(z: pzval): TVarRec; Var - P: AnsiString; + P: zend_ustr; begin if z = nil then begin @@ -3438,12 +3433,16 @@ function Z_VARREC(z: pzval): TVarRec; Result.VExtended^ := z.value.dval; end; IS_STRING: begin - Result.VType := vtAnsiString; + Result.VType := {$IFDEF PHP_UNICE}vtUnicodeString{$ELSE}vtAnsiString{$ENDIF}; SetLength(P, z.value.str.len); Move(z.value.str.val^, P[1], z.value.str.len); - Result.VAnsiString := Pointer(P); + {$IFDEF PHP_UNICE} + Result.VUnicodeString := Pointer(UnicodeString(p)); + {$ELSE} + Result.VAnsiString := Pointer(P); + {$ENDIF} end; else begin @@ -3475,7 +3474,7 @@ function Z_STRUVAL(z : pzval) : UTF8String; end; end; -function Z_STRVAL(z : pzval) : AnsiString; +function Z_STRVAL(z : pzval) : zend_ustr; begin if z = nil then begin @@ -3551,7 +3550,7 @@ function Z_OBJPROP(z : pzval) : PHashtable; {$ENDIF} {$IFDEF PHP5} -procedure _zval_copy_ctor (val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); +procedure _zval_copy_ctor (val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); begin if val^._type <= IS_BOOL then Exit @@ -3559,7 +3558,7 @@ procedure _zval_copy_ctor (val: pzval; __zend_filename: PAnsiChar; __zend_linen _zval_copy_ctor_func(val, __zend_filename, __zend_lineno); end; -procedure _zval_dtor(val: pzval; __zend_filename: PAnsiChar; __zend_lineno: uint); +procedure _zval_dtor(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); begin if val^._type <= IS_BOOL then Exit @@ -3572,7 +3571,7 @@ function zend_hash_init (ht : PHashTable; nSize : uint; pHashFunction : pointer; Result := _zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent, nil, 0); end; -function zend_hash_add_or_update(ht : PHashTable; arKey : PAnsiChar; +function zend_hash_add_or_update(ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; flag : integer) : integer; begin @@ -3590,16 +3589,16 @@ function zend_hash_init_ex (ht : PHashTable; nSize : uint; pHashFunction : poin {$ENDIF} - +{$IFNDEF PHP_UNICE} function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; begin Result := Sysutils.Format(Format, Args); end; - +{$ENDIF} {$IFDEF COMPILER_VC9} -function DupStr(strSource : PAnsiChar) : PAnsiChar; cdecl; +function DupStr(strSource : zend_pchar) : zend_pchar; cdecl; var - P : PAnsiChar; + P : zend_pchar; begin if (strSource = nil) then diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index 4fb0be4..9c2b874 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -481,9 +481,11 @@ interface zend_uint = uint; zend_bool = boolean; zend_uchar = {$IFDEF PHP_UNICE}Utf8Char{$ELSE}AnsiChar{$ENDIF}; + zend_ustr = {$IFDEF PHP_UNICE}Utf8String{$ELSE}AnsiString{$ENDIF}; zend_ulong = ulong; zend_long = integer; zend_pchar = {$IFDEF PHP_UNICE}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; + zend_pstr = {$IFDEF PHP_UNICE}PUtf8String{$ELSE}PAnsiString{$ENDIF}; {$IFDEF PHP7} _zend_refcounted_h = record refcount : cardinal; @@ -551,7 +553,7 @@ _zend_mem_header = record type - hash_func_t = function(arKey: PAnsiChar; nKeyLength: uint): ulong; + hash_func_t = function(arKey: zend_pchar; nKeyLength: uint): ulong; compare_func_t = function(_noname1: Pointer; _noname2: Pointer; TSRMLS_DC: Pointer): integer; @@ -570,7 +572,7 @@ TBucket = record pListLast: PBucket; pNext: PBucket; pLast: PBucket; - arKey: array[0..0] of AnsiChar; + arKey: array[0..0] of zend_uchar; end; PHashTable = ^THashTable; @@ -598,7 +600,7 @@ TBucket = record zend_op_array = record _type : zend_uchar; - function_name : PAnsiChar; + function_name : zend_pchar; scope : pointer; fn_flags : zend_uint; prototype : pointer; @@ -633,10 +635,10 @@ TBucket = record uses_this : zend_bool; {$ENDIF} - filename : PAnsiChar; + filename : zend_pchar; line_start : zend_uint; line_end : zend_uint; - doc_comment : PAnsiChar; + doc_comment : zend_pchar; doc_comment_len : zend_uint; {$IFDEF PHP530} early_binding : zend_uint; @@ -647,7 +649,7 @@ TBucket = record _zend_internal_function = record _type : byte; - function_name : PAnsiChar; + function_name : zend_pchar; scope : pointer; fn_flags : zend_uint; prototype : pointer; @@ -673,7 +675,7 @@ TBucket = record common : record _type : zend_uchar; - function_name : PAnsiChar; + function_name : zend_pchar; scope : pointer; fn_flags : zend_uint; prototype : pointer; @@ -727,7 +729,7 @@ zend_class_iterator_funcs = record type zend_op_array = record _type : zend_uchar; arg_types : PByte; - function_name : PAnsiChar; + function_name : zend_pchar; refcount : pointer; opcodes : pointer; last : zend_uint; @@ -744,7 +746,7 @@ type zend_op_array = record return_reference : boolean; done_pass_two : boolean; - filename : PAnsiChar; + filename : zend_pchar; reserved : array[0..ZEND_MAX_RESERVED_RESOURCES - 1] of Pointer; end; @@ -753,7 +755,7 @@ type zend_op_array = record _zend_internal_function = record _type : byte; arg_types : PByte; - function_name : PAnsiChar; + function_name : zend_pchar; handler : pointer; end; PZendInternalFunction = ^_zend_internal_function; @@ -761,7 +763,7 @@ _zend_internal_function = record _zend_overloaded_function = record _type : byte; arg_types : PByte; - function_name : PAnsiChar; + function_name : zend_pchar; _var : zend_uint; end; @@ -773,7 +775,7 @@ zend_function = record record _type : zend_uchar; arg_types : PByte; - function_name : PAnsiChar; + function_name : zend_pchar; end; ); 3 : @@ -797,8 +799,8 @@ zend_function = record {$IFDEF PHP4} Tzend_class_entry = record - _type: AnsiChar; - name: PAnsiChar; + _type: zend_uchar; + name: zend_pchar; name_length: uint; parent: pointer; refcount: pointer; @@ -813,8 +815,8 @@ zend_function = record {$ELSE} Tzend_class_entry = record - _type : AnsiChar; - name : PAnsiChar; + _type : zend_uchar; + name : zend_pchar; name_length : zend_uint; parent : PZend_class_entry; refcount : integer; @@ -864,10 +866,10 @@ Tzend_class_entry = record interfaces : pointer; num_interfaces : zend_uint; - filename : PAnsiChar; + filename : zend_pchar; line_start : zend_uint; line_end : zend_uint; - doc_comment : PAnsiChar; + doc_comment : zend_pchar; doc_comment_len : zend_uint; module : pointer; @@ -973,7 +975,7 @@ zvalue_value = record 0: (lval: zend_long); 1: (dval: double); 2: (str: record - val: {$IFDEF PHP_UNICE}PUTF8Char{$ELSE}PAnsiChar{$ENDIF}; + val: zend_pchar; len: integer; end); 3: (ht: PHashTable); @@ -1051,7 +1053,7 @@ zend_rsrc_list_entry = record type PZendHashKey = ^TZendHashKey; zend_hash_key = record - arKey: PAnsiChar; + arKey: zend_pchar; nKeyLength: uint; h: ulong; end; @@ -1064,7 +1066,7 @@ zend_hash_key = record zend_constant = record value: zval; flags: Integer; - name: PAnsiChar; + name: zend_pchar; name_len: uint; module_number: Integer; end; @@ -1072,7 +1074,7 @@ zend_constant = record {$IFDEF PHP5} type - zend_stream_reader_t = function(handle : pointer; buf : PAnsiChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; + zend_stream_reader_t = function(handle : pointer; buf : zend_pchar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; zend_stream_closer_t = procedure(handle : pointer; TSRMLS_DC : pointer); cdecl; zend_stream_fteller_t = function(handle : pointer; TSRMLS_DC : pointer) : longint; cdecl; @@ -1085,7 +1087,7 @@ zend_mmap = record len : size_t; pos : size_t; map : pointer; - buf : PAnsiChar; + buf : zend_pchar; old_handle : pointer; old_closer : zend_stream_closer_t; end; @@ -1129,8 +1131,8 @@ _zend_stream = record {$ELSE} _type: uchar; {$ENDIF} - filename: PAnsiChar; - opened_path: PAnsiChar; + filename: zend_pchar; + opened_path: zend_pchar; handle: record case Integer of @@ -1177,26 +1179,26 @@ _zend_stream = record Pzend_syntax_highlighter_ini = ^Tzend_syntax_highlighter_ini; zend_syntax_highlighter_ini = record - highlight_html : PAnsiChar; - highlight_comment : PAnsiChar; - highlight_default : PAnsiChar; - highlight_string : PAnsiChar; - highlight_keyword : PAnsiChar; + highlight_html : zend_pchar; + highlight_comment : zend_pchar; + highlight_default : zend_pchar; + highlight_string : zend_pchar; + highlight_keyword : zend_pchar; end; Tzend_syntax_highlighter_ini = zend_syntax_highlighter_ini; type - zend_write_t = function(str: PAnsiChar; str_length: integer): integer; cdecl; + zend_write_t = function(str: zend_pchar; str_length: integer): integer; cdecl; type {$IFDEF PHP5} _zend_arg_info = record - name : PAnsiChar; + name : zend_pchar; name_len : zend_uint; - class_name : PAnsiChar; + class_name : zend_pchar; class_name_len : zend_uint; {$IFDEF PHP510} array_type_hint : zend_bool; @@ -1213,7 +1215,7 @@ _zend_arg_info = record Pzend_function_entry = ^Tzend_function_entry; zend_function_entry = record - fname: PAnsiChar; + fname: zend_pchar; handler: pointer; {$IFDEF PHP4} func_arg_types: Pbyte; @@ -1231,7 +1233,7 @@ zend_object_value = record handlers:Pointer; end; _zend_function_entry = record - fname : PAnsiChar; + fname : zend_pchar; handler : pointer; arg_info : P_zend_arg_info; num_args : uint; @@ -1246,14 +1248,14 @@ _zend_module_entry = record zts : byte; ini_entry : pointer; deps : pointer; - name : PAnsiChar; + name : zend_pchar; functions : Pointer; module_startup_func : pointer; module_shutdown_func : pointer; request_startup_func : pointer; request_shutdown_func : pointer; info_func : pointer; - version : PAnsiChar; + version : zend_pchar; globals_size : size_t; globals_id_ptr : pointer; globals_ctor : pointer; @@ -1263,7 +1265,7 @@ _zend_module_entry = record _type : byte; handle : pointer; module_number : Integer; - build_id : PAnsiChar; + build_id : zend_pchar; end; Tzend_module_entry = record size: word; @@ -1276,14 +1278,14 @@ Tzend_module_entry = record deps : pointer; {$ENDIF} {$ENDIF} - name: PAnsiChar; + name: zend_pchar; functions: Pointer; module_startup_func: pointer; module_shutdown_func: pointer; request_startup_func: pointer; request_shutdown_func: pointer; info_func: pointer; - version: PAnsiChar; + version: zend_pchar; {$IFDEF PHP5} {$IFDEF PHP520} @@ -1310,7 +1312,7 @@ Tzend_module_entry = record handle: pointer; module_number: longint; {$IFDEF PHP530} - build_id : PAnsiChar; + build_id : zend_pchar; {$ENDIF} end; @@ -1320,7 +1322,7 @@ Tzend_module_entry = record zend_list_element = record prev: pzend_list_element; next: pzend_list_element; - data: AnsiChar; + data: zend_uchar; end; pzend_llist = ^zend_llist; @@ -1434,11 +1436,11 @@ zend_compiler_globals = record function_call_stack : zend_stack; - compiled_filename : PAnsiChar; + compiled_filename : zend_pchar; zend_lineno : integer; //comment_start_line : integer; - heredoc : PAnsiChar; + heredoc : zend_pchar; heredoc_len : integer; active_op_array : pointer; @@ -1478,7 +1480,7 @@ zend_compiler_globals = record implementing_class : _znode; access_type : zend_uint; - doc_comment : PAnsiChar; + doc_comment : zend_pchar; doc_comment_len : integer; end; Tzend_compiler_globals = zend_compiler_globals; @@ -1503,11 +1505,11 @@ type _zend_objects_store = record type _zend_property_info = record flags : zend_uint; - name : PAnsiChar; + name : zend_pchar; name_length : integer; h : ulong; {$IFDEF PHP510} - doc_comment : PAnsiChar; + doc_comment : zend_pchar; doc_comment_len : integer; {$ENDIF} end; @@ -1639,7 +1641,7 @@ zend_executor_globals = record //* locale stuff */ {$IFNDEF PHP510} - float_separator : AnsiChar; + float_separator : zend_uchar; {$ENDIF} reserved: array[0..3] of pointer; @@ -1656,13 +1658,13 @@ zend_executor_globals = record {$ENDIF} {$IFDEF PHP530} -function ZEND_MODULE_BUILD_ID : AnsiString; +function ZEND_MODULE_BUILD_ID : zend_ustr; {$ENDIF} implementation {$IFDEF PHP530} -function ZEND_MODULE_BUILD_ID : AnsiString; +function ZEND_MODULE_BUILD_ID : zend_ustr; begin Result := 'API' + IntToStr(ZEND_MODULE_API_NO) + ZEND_BUILD_TS + ZEND_BUILD_DEBUG + ZEND_BUILD_SYSTEM; end; diff --git a/Source/php4AppIntf.pas b/Source/php4AppIntf.pas index de444c5..ffb1b2b 100644 --- a/Source/php4AppIntf.pas +++ b/Source/php4AppIntf.pas @@ -12,16 +12,17 @@ unit php4AppIntf; interface - +type +zend_pchar = {$IF DEFINED(Unicode)} PUTF8Char {$ELSE} PAnsiChar {$ENDIF}; function InitRequest : integer; stdcall; procedure DoneRequest(RequestID : integer); stdcall; -procedure RegisterVariable(RequestID : integer; AName : PAnsiChar; AValue : PAnsiChar); stdcall; -function ExecutePHP(RequestID : integer; FileName : PAnsiChar) : integer; stdcall; -function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; -function GetResultText(RequestID : integer; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; -function GetVariable(RequestID : integer; AName : PAnsiChar; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; -procedure SaveToFile(RequestID : integer; AFileName : PAnsiChar); stdcall; -function GetVariableSize(RequestID : integer; AName : PAnsiChar) : integer; stdcall; +procedure RegisterVariable(RequestID : integer; AName : zend_pchar; AValue : zend_pchar); stdcall; +function ExecutePHP(RequestID : integer; FileName : zend_pchar) : integer; stdcall; +function ExecuteCode(RequestID : integer; ACode : zend_pchar) : integer; stdcall; +function GetResultText(RequestID : integer; Buffer : zend_pchar; BufLen : integer) : integer; stdcall; +function GetVariable(RequestID : integer; AName : zend_pchar; Buffer : zend_pchar; BufLen : integer) : integer; stdcall; +procedure SaveToFile(RequestID : integer; AFileName : zend_pchar); stdcall; +function GetVariableSize(RequestID : integer; AName : zend_pchar) : integer; stdcall; function GetResultBufferSize(RequestID : integer) : integer; stdcall; implementation diff --git a/Source/php4AppUnit.pas b/Source/php4AppUnit.pas index f5e27eb..71e903b 100644 --- a/Source/php4AppUnit.pas +++ b/Source/php4AppUnit.pas @@ -33,7 +33,7 @@ interface TPHPInfoBlock = class private - FBuffer : AnsiString; + FBuffer : zend_ustr; FVarList : TStringList; {$IFDEF PHP5} FVirtualStream : TMemoryStream; @@ -42,20 +42,20 @@ TPHPInfoBlock = class public constructor Create; virtual; destructor Destroy; override; - property Buffer : AnsiString read FBuffer write FBuffer; + property Buffer : zend_ustr read FBuffer write FBuffer; property VarList : TStringList read FVarList write SetVarList; end; function InitRequest : integer; stdcall; procedure DoneRequest(RequestID : integer); stdcall; -procedure RegisterVariable(RequestID : integer; AName : PAnsiChar; AValue : PAnsiChar); stdcall; -function ExecutePHP(RequestID : integer; FileName : PAnsiChar) : integer; stdcall; -function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; -function GetResultText(RequestID : integer; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; -function GetVariable(RequestID : integer; AName : PAnsiChar; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; -procedure SaveToFile(RequestID : integer; AFileName : PAnsiChar); stdcall; -function GetVariableSize(RequestID : integer; AName : PAnsiChar) : integer; stdcall; +procedure RegisterVariable(RequestID : integer; AName : zend_pchar; AValue : zend_pchar); stdcall; +function ExecutePHP(RequestID : integer; FileName : zend_pchar) : integer; stdcall; +function ExecuteCode(RequestID : integer; ACode : zend_pchar) : integer; stdcall; +function GetResultText(RequestID : integer; Buffer : zend_pchar; BufLen : integer) : integer; stdcall; +function GetVariable(RequestID : integer; AName : zend_pchar; Buffer : zend_pchar; BufLen : integer) : integer; stdcall; +procedure SaveToFile(RequestID : integer; AFileName : zend_pchar); stdcall; +function GetVariableSize(RequestID : integer; AName : zend_pchar) : integer; stdcall; function GetResultBufferSize(RequestID : integer) : integer; stdcall; procedure PrepareStartup; @@ -73,8 +73,8 @@ implementation procedure php_info_delphi(zend_module : Pointer; TSRMLS_DC : pointer); cdecl; begin php_info_print_table_start(); - php_info_print_table_row(2, PAnsiChar('SAPI module version'), PAnsiChar('PHP4Delphi 7.4 Oct 2009')); - php_info_print_table_row(2, PAnsiChar('Home page'), PAnsiChar('http://users.telenet.be/ws36637')); + php_info_print_table_row(2, zend_pchar('SAPI module version'), zend_pchar('PHP4Delphi 7.4 Oct 2009')); + php_info_print_table_row(2, zend_pchar('Home page'), zend_pchar('http://users.telenet.be/ws36637')); php_info_print_table_end(); end; @@ -89,9 +89,9 @@ function php_delphi_deactivate(p : pointer) : integer; cdecl; end; -function php_delphi_ub_write(str : PAnsiChar; len : uint; p : pointer) : integer; cdecl; +function php_delphi_ub_write(str : zend_pchar; len : uint; p : pointer) : integer; cdecl; var - s : AnsiString; + s : zend_ustr; php : TPHPInfoBlock; gl : psapi_globals_struct; begin @@ -133,8 +133,8 @@ procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; try for cnt := 0 to InfoBlock.VarList.Count - 1 do begin - php_register_variable(PAnsiChar(InfoBlock.VarList.Names[cnt]), - PAnsiChar(InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]]), val, p); + php_register_variable(zend_pchar(InfoBlock.VarList.Names[cnt]), + zend_pchar(InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]]), val, p); end; except end; @@ -206,9 +206,9 @@ procedure PrepareStartup; {$IFDEF PHP530} {$IFNDEF COMPILER_VC9} - php_delphi_module.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + php_delphi_module.build_id := strdup(zend_pchar(ZEND_MODULE_BUILD_ID)); {$ELSE} - php_delphi_module.build_id := DupStr(PAnsiChar(ZEND_MODULE_BUILD_ID)); + php_delphi_module.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); {$ENDIF} {$ENDIF} @@ -247,8 +247,8 @@ procedure PrepareResult(RequestID : integer; TSRMLS_D : pointer); begin new(data); try - if zend_hash_find(ht, PAnsiChar(InfoBlock.VarList.Names[cnt]), - strlen(PAnsiChar(InfoBlock.VarList.Names[cnt])) + 1, data) = SUCCESS then + if zend_hash_find(ht, zend_pchar(InfoBlock.VarList.Names[cnt]), + strlen(zend_pchar(InfoBlock.VarList.Names[cnt])) + 1, data) = SUCCESS then case data^^^._type of IS_STRING : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := data^^^.value.str.val; IS_LONG, @@ -263,7 +263,7 @@ procedure PrepareResult(RequestID : integer; TSRMLS_D : pointer); end; end; -function ExecutePHP(RequestID : integer; FileName : PAnsiChar) : integer; stdcall; +function ExecutePHP(RequestID : integer; FileName : zend_pchar) : integer; stdcall; var file_handle : zend_file_handle; TSRMLS_D : pointer; @@ -308,7 +308,7 @@ function ExecutePHP(RequestID : integer; FileName : PAnsiChar) : integer; stdcal {$IFDEF PHP5} {PHP 5 only} -function delphi_stream_reader (handle : pointer; buf : PAnsiChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; +function delphi_stream_reader (handle : pointer; buf : zend_pchar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; var MS : TMemoryStream; begin @@ -375,12 +375,12 @@ function delphi_stream_teller(handle : pointer; TSRMLS_DC : pointer) : longint; {$IFDEF PHP4} -function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; +function ExecuteCode(RequestID : integer; ACode : zend_pchar) : integer; stdcall; var file_handle : zend_file_handle; TSRMLS_D : pointer; _handles : array[0..1] of THandle; - _code : AnsiString; + _code : zend_ustr; gl : psapi_globals_struct; begin if RequestID <= 0 then @@ -433,11 +433,11 @@ function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; php_request_shutdown(nil); end; {$ELSE} -function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; +function ExecuteCode(RequestID : integer; ACode : zend_pchar) : integer; stdcall; var file_handle : zend_file_handle; TSRMLS_D : pointer; - _code : AnsiString; + _code : zend_ustr; gl : psapi_globals_struct; ZendStream : TZendStream; begin @@ -506,7 +506,7 @@ function ExecuteCode(RequestID : integer; ACode : PAnsiChar) : integer; stdcall; {$ENDIF} -procedure RegisterVariable(RequestID : integer; AName : PAnsiChar; AValue : PAnsiChar); stdcall; +procedure RegisterVariable(RequestID : integer; AName : zend_pchar; AValue : zend_pchar); stdcall; begin try TPHPInfoBlock(RequestID).VarList.Add(AName + '=' + AValue); @@ -515,7 +515,7 @@ procedure RegisterVariable(RequestID : integer; AName : PAnsiChar; AValue : PAns end; -function GetResultText(RequestID : integer; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; +function GetResultText(RequestID : integer; Buffer : zend_pchar; BufLen : integer) : integer; stdcall; var L : integer; begin @@ -533,7 +533,7 @@ function GetResultText(RequestID : integer; Buffer : PAnsiChar; BufLen : intege Exit; end; - StrLCopy(Buffer, PAnsiChar(TPHPInfoBlock(RequestID).FBuffer), BufLen -1); + StrLCopy(Buffer, zend_pchar(TPHPInfoBlock(RequestID).FBuffer), BufLen -1); TPHPInfoBlock(RequestID).FBuffer := ''; Result := 0; except @@ -559,7 +559,7 @@ function GetResultBufferSize(RequestID : integer) : integer; end; end; -procedure SaveToFile(RequestID : integer; AFileName : PAnsiChar); +procedure SaveToFile(RequestID : integer; AFileName : zend_pchar); var L : integer; FS : TFileStream; @@ -581,10 +581,10 @@ procedure SaveToFile(RequestID : integer; AFileName : PAnsiChar); end; end; -function GetVariable(RequestID : integer; AName : PAnsiChar; Buffer : PAnsiChar; BufLen : integer) : integer; stdcall; +function GetVariable(RequestID : integer; AName : zend_pchar; Buffer : zend_pchar; BufLen : integer) : integer; stdcall; var L : integer; - St : AnsiString; + St : zend_ustr; begin if RequestID <= 0 then begin @@ -606,17 +606,17 @@ function GetVariable(RequestID : integer; AName : PAnsiChar; Buffer : PAnsiChar Exit; end; - StrLCopy(Buffer, PAnsiChar(St), BufLen -1); + StrLCopy(Buffer, zend_pchar(St), BufLen -1); Result := 0; except Result := REQUEST_ID_NOT_FOUND; end; end; -function GetVariableSize(RequestID : integer; AName : PAnsiChar) : integer; +function GetVariableSize(RequestID : integer; AName : zend_pchar) : integer; var L : integer; - St : AnsiString; + St : zend_ustr; begin if RequestID <= 0 then begin diff --git a/Source/php4DelphiD2010.identcache b/Source/php4DelphiD2010.identcache index f052e40a753e61e1e98d8c93c72cb604d2085691..cb3dd3fa670e67cd3d46bc4ae7aae2ee3727c99a 100644 GIT binary patch delta 79 zcmaFD`Gk{EV6rWv)#L}v!V~8%o*c_;GTD_`VzN6+;N(&!^NH5tle-vACdV)ZO#a2> iJ$WLt#Ka(Ppepmp=UGH2e`XE=s`3LWnK#*i(F*`OJsV5_ delta 72 zcmaFD`Gk{EU~)HO;N-(h-V^;6PoBl%HTe(oyvcVMTP8nc7N6Y5Xg)cC$$PRYqr_xB cX7kDGm_&hU%qLn4PmW>^nQRNx$;a#i0O4O4>;M1& diff --git a/Source/php4DelphiR2010.identcache b/Source/php4DelphiR2010.identcache index 5b0f86d658b95dacad4bb9f0c21ad55579d1f2ed..827b7ad5a3029367083fb6c86853e7d397fec07f 100644 GIT binary patch delta 64 zcmcb?c7u(Tn}LDBd19dPWLd`i$@`gnCI;?Dj|3Ft delta 56 zcmcb?c7u(Pd-8rJ|Hfzxl9TzEy?|1FKx{I(lu>Hp Javz|SF983H5*+{l diff --git a/Source/php4DelphiR2010.stat b/Source/php4DelphiR2010.stat index 87735bf..a623f2e 100644 --- a/Source/php4DelphiR2010.stat +++ b/Source/php4DelphiR2010.stat @@ -1,9 +1,9 @@ [Stats] -EditorSecs=2805 +EditorSecs=3026 DesignerSecs=1 InspectorSecs=3 -CompileSecs=74754 -OtherSecs=343 +CompileSecs=87688 +OtherSecs=331 StartTime=29.07.4016 22:02:01 RealKeys=0 EffectiveKeys=0 diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index a71541c..495643e 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -57,9 +57,9 @@ TPHPMemoryStream = class(TMemoryStream) procedure SetInitialSize(ASize : integer); end; {-- PHP Events --} - TPHPLogMessage = procedure (Sender : TObject; AText : AnsiString) of object; - TPHPErrorEvent = procedure (Sender: TObject; AText: AnsiString; - AType: integer; AFileName: AnsiString; ALineNo: integer) of object; + TPHPLogMessage = procedure (Sender : TObject; AText : zend_ustr) of object; + TPHPErrorEvent = procedure (Sender: TObject; AText: zend_ustr; + AType: integer; AFileName: zend_ustr; ALineNo: integer) of object; TPHPReadPostEvent = procedure(Sender : TObject; Stream : TStream) of object; TPHPReadResultEvent = procedure(Sender : TObject; Stream : TStream) of object; @@ -79,12 +79,12 @@ TpsvCustomPHP = class(TPHPComponent) FBuffer : TPHPMemoryStream; FOnLogMessage : TPHPLogMessage; FOnScriptError : TPHPErrorEvent; - FFileName : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; + FFileName : zend_ustr; {$IFDEF PHP4} FWriterHandle : THandle; FVirtualReadHandle : THandle; FVirtualWriteHandle : THandle; - FVirtualCode : AnsiString; + FVirtualCode : zend_ustr; {$ENDIF} FUseDelimiters : boolean; FUseMapping : boolean; @@ -92,7 +92,7 @@ TpsvCustomPHP = class(TPHPComponent) FOnReadPost : TPHPReadPostEvent; FRequestType : TPHPRequestType; FOnReadResult : TPHPReadResultEvent; - FContentType: AnsiString; + FContentType: zend_ustr; {$IFDEF PHP5} FVirtualStream : TMemoryStream; {$ENDIF} @@ -107,7 +107,7 @@ TpsvCustomPHP = class(TPHPComponent) procedure PrepareVariables; virtual; function RunTime : boolean; function GetThreadSafeResourceManager : pointer; - function CreateVirtualFile(ACode : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}) : boolean; + function CreateVirtualFile(ACode : zend_ustr) : boolean; procedure CloseVirtualFile; {$IFDEF PHP4} property VirtualCode : string read FVirtualCode; @@ -124,14 +124,14 @@ TpsvCustomPHP = class(TPHPComponent) constructor Create(AOwner : TComponent); override; destructor Destroy; override; function EngineActive : boolean; - function Execute : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; overload; - function Execute(AFileName : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}) : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; overload; - function RunCode(ACode : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}) : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; overload; + function Execute : zend_ustr; overload; + function Execute(AFileName : zend_ustr) : zend_ustr; overload; + function RunCode(ACode : zend_ustr) : zend_ustr; overload; function RunCode(ACode : TStrings) : string; overload; - function VariableByName(AName : AnsiString) : TPHPVariable; + function VariableByName(AName : zend_ustr) : TPHPVariable; property PostStream : TMemoryStream read FPostStream; property ExecuteMethod : TPHPExecuteMethod read FExecuteMethod write FExecuteMethod default emServer; - property FileName : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF} read FFileName write FFileName; + property FileName : zend_ustr read FFileName write FFileName; property Variables : TPHPVariables read FVariables write SetVariables; property VariableCount : integer read GetVariableCount; property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; @@ -149,7 +149,7 @@ TpsvCustomPHP = class(TPHPComponent) property RequestType : TPHPRequestType read FRequestType write FRequestType default prtGet; property ResultBuffer : TPHPMemoryStream read FBuffer; property OnReadResult : TPHPReadResultEvent read FOnReadResult write FOnReadResult; - property ContentType : AnsiString read FContentType write FContentType; + property ContentType : zend_ustr read FContentType write FContentType; end; TpsvPHP = class(TpsvCustomPHP) @@ -174,12 +174,12 @@ TpsvPHP = class(TpsvCustomPHP) TCustomPHPLibrary = class(TPHPComponent) private FExecutor : TpsvCustomPHP; - FLibraryName : AnsiString; + FLibraryName : zend_ustr; FFunctions : TPHPFunctions; FLocked: boolean; procedure SetFunctions(const Value : TPHPFunctions); procedure SetExecutor(AValue : TpsvCustomPHP); - procedure SetLibraryName(AValue : AnsiString); + procedure SetLibraryName(AValue : zend_ustr); protected procedure RegisterLibrary; virtual; procedure UnregisterLibrary; virtual; @@ -188,7 +188,7 @@ TCustomPHPLibrary = class(TPHPComponent) destructor Destroy; override; procedure Refresh; virtual; property Executor : TpsvCustomPHP read FExecutor write SetExecutor; - property LibraryName : AnsiString read FLibraryName write SetLibraryName; + property LibraryName : zend_ustr read FLibraryName write SetLibraryName; property Functions : TPHPFunctions read FFunctions write SetFunctions; property Locked : boolean read FLocked write FLocked; end; @@ -196,7 +196,7 @@ TCustomPHPLibrary = class(TPHPComponent) TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) private - FINIPath : AnsiString; + FINIPath : zend_ustr; FOnEngineStartup : TNotifyEvent; FOnEngineShutdown : TNotifyEvent; FEngineActive : boolean; @@ -209,7 +209,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) FHTMLErrors : boolean; FMaxInputTime : integer; FConstants : TphpConstants; - FDLLFolder : AnsiString; + FDLLFolder : zend_ustr; FReportDLLError : boolean; FLock: TRTLCriticalSection; FOnScriptError : TPHPErrorEvent; @@ -243,7 +243,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) public constructor Create(AOwner : TComponent); override; destructor Destroy; override; - procedure AddFunction(FN: AnsiString; Func: Pointer); + procedure AddFunction(FN: zend_ustr; Func: Pointer); procedure StartupEngine; virtual; procedure ShutdownEngine; virtual; procedure LockEngine; virtual; @@ -260,7 +260,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) property OnEngineShutdown : TNotifyEvent read FOnEngineShutdown write FOnEngineShutdown; property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; - property IniPath : AnsiString read FIniPath write FIniPath; + property IniPath : zend_ustr read FIniPath write FIniPath; {$IFNDEF PHP540} property SafeMode : boolean read FSafeMode write FSafeMode default false; property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; @@ -269,7 +269,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) property HTMLErrors : boolean read FHTMLErrors write FHTMLErrors default false; property MaxInputTime : integer read FMaxInputTime write FMaxInputTime default 0; property Constants : TPHPConstants read FConstants write SetConstants; - property DLLFolder : AnsiString read FDLLFolder write FDLLFolder; + property DLLFolder : zend_ustr read FDLLFolder write FDLLFolder; property ReportDLLError : boolean read FReportDLLError write FReportDLLError; end; @@ -342,7 +342,7 @@ TPHPLibrarian = class {$ENDIF} implementation -function AddSlashes(const S: ansistring): ansistring; +function AddSlashes(const S: zend_ustr): zend_ustr; begin Result := StringReplace(S, chr(8), '8', [rfReplaceAll]); Result := StringReplace(S, '\', '\\', [rfReplaceAll]); @@ -399,7 +399,7 @@ procedure TCustomPHPLibrary.SetFunctions(const Value: TPHPFunctions); FFunctions.Assign(Value); end; -procedure TCustomPHPLibrary.SetLibraryName(AValue: AnsiString); +procedure TCustomPHPLibrary.SetLibraryName(AValue: zend_ustr); begin if FLibraryName <> AValue then begin @@ -501,7 +501,7 @@ function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointe {$IFDEF PHP5} {PHP 5 only} -function delphi_stream_reader (handle : pointer; buf : PAnsiChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; +function delphi_stream_reader (handle : pointer; buf : zend_pchar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; var MS : TMemoryStream; begin @@ -626,7 +626,7 @@ function php_delphi_read_cookies(p1 : pointer) : pointer; cdecl; begin result := nil; end; -function php_delphi_read_post(buf : PAnsiChar; len : uint; TSRMLS_DC : pointer) : integer; cdecl; +function php_delphi_read_post(buf : zend_pchar; len : uint; TSRMLS_DC : pointer) : integer; cdecl; var gl : psapi_globals_struct; php : TpsvPHP; @@ -696,8 +696,8 @@ procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; end; php_register_variable('PHP_SELF', '_', nil, p); - php_register_variable('REMOTE_ADDR', PAnsiChar(GetLocalIP()), val, p); - php_register_variable('IP_ADDRESS', PAnsiChar(GetLocalIP()), val, p); + php_register_variable('REMOTE_ADDR', zend_pchar(GetLocalIP()), val, p); + php_register_variable('IP_ADDRESS', zend_pchar(GetLocalIP()), val, p); {if php.RequestType = prtPost then php_register_variable('REQUEST_METHOD', 'POST', val, p) else @@ -708,23 +708,23 @@ procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; begin for cnt := 0 to varcnt - 1 do begin - php_register_variable(PAnsiChar(php.Variables[cnt].Name), - PAnsiChar(php.Variables[cnt].Value), val, p); + php_register_variable(zend_pchar(php.Variables[cnt].Name), + zend_pchar(php.Variables[cnt].Value), val, p); end; end; end; -function wvsprintfA(Output: PAnsiChar; Format: PAnsiChar; arglist: PAnsiChar): Integer; stdcall; external 'user32.dll'; +function wvsprintfA(Output: zend_pchar; Format: zend_pchar; arglist: zend_pchar): Integer; stdcall; external 'user32.dll'; {$IFDEF PHP4} function WriterProc(Parameter : Pointer) : integer; var n : integer; php : TpsvCustomPHP; - buf : PAnsiChar; + buf : zend_pchar; k : cardinal; begin try php := TPsvCustomPHP(Parameter); - Buf := PAnsiChar(php.FVirtualCode); + Buf := zend_pchar(php.FVirtualCode); k := length(php.FVirtualCode); repeat n := _write(php.FVirtualWriteHandle, Buf, k); @@ -745,12 +745,12 @@ function WriterProc(Parameter : Pointer) : integer; end; {$ENDIF} {$IFDEF soulengine_build} -procedure delphi_error_cb(AType: Integer; const AFname: PAnsiChar; const ALineNo: UINT; - const AFormat: PAnsiChar; args: PAnsiChar) cdecl; +procedure delphi_error_cb(AType: Integer; const AFname: zend_pchar; const ALineNo: UINT; + const AFormat: zend_pchar; args: zend_pchar) cdecl; var LText: string; - LBuffer: array[0..4096] of AnsiChar; - S: AnsiString; + LBuffer: array[0..4096] of zend_uchar; + S: zend_ustr; begin case AType of E_ERROR: LText := 'FATAL Error in '; @@ -776,7 +776,7 @@ procedure delphi_error_cb(AType: Integer; const AFname: PAnsiChar; const ALineNo LText := LText + AFname + '(' + inttostr(ALineNo) + '): ' + LBuffer; if (fatal_handler_php <> '') and not(Atype in [E_CORE_ERROR, E_CORE, E_CORE_WARNING]) then begin - S := AnsiString(fatal_handler_php + '(' + IntToStr(integer(AType)) + ',' + '''' + + S := zend_ustr(fatal_handler_php + '(' + IntToStr(integer(AType)) + ',' + '''' + AddSlashes(LBuffer) + ''', ''' + AddSlashes(AFName) + ''', ' + IntToStr(ALineNo) + ');' + ' ?>'); @@ -802,15 +802,15 @@ procedure delphi_error_cb(AType: Integer; const AFname: PAnsiChar; const ALineNo end; end; {$ELSE} -procedure delphi_error_cb(_type : integer; const error_filename : PAnsiChar; - const error_lineno : uint; const _format : PAnsiChar; args : PAnsiChar); cdecl; +procedure delphi_error_cb(_type : integer; const error_filename : zend_pchar; + const error_lineno : uint; const _format : zend_pchar; args : zend_pchar); cdecl; var - buffer : array[0..1023] of ansichar; - err_msg : PAnsiChar; + buffer : array[0..1023] of zend_uchar; + err_msg : zend_pchar; php : TpsvPHP; gl : psapi_globals_struct; p : pointer; - error_type_str : ansistring; + error_type_str : zend_ustr; err : TPHPErrorType; begin wvsprintfa(buffer, _format, args); @@ -863,7 +863,9 @@ procedure delphi_error_cb(_type : integer; const error_filename : PAnsiChar; error_type_str := 'Unknown error'; end; - php_log_err(PAnsiChar(AnsiFormat('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); + php_log_err(zend_pchar( + {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} + ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); end; end; if PHPLoaded then @@ -871,11 +873,11 @@ procedure delphi_error_cb(_type : integer; const error_filename : PAnsiChar; end; {$ENDIF} {$IFDEF soulengine_build} -function php_delphi_log_message(msg : PAnsiChar) : integer; cdecl; +function php_delphi_log_message(msg : zend_pchar) : integer; cdecl; var php : TpsvPHP; gl : psapi_globals_struct; - S: ansistring; + S: zend_ustr; begin Result := 0; gl := GetSAPIGlobals; @@ -890,7 +892,7 @@ function php_delphi_log_message(msg : PAnsiChar) : integer; cdecl; else if log_handler_php <> '' then begin - S := AnsiString(fatal_handler_php + '(' + '''' + AddSlashes(msg) + '''' + + S := zend_ustr(fatal_handler_php + '(' + '''' + AddSlashes(msg) + '''' + ');' + ' ?>'); if not phpmd.UseDelimiters then @@ -1012,7 +1014,7 @@ procedure TpsvCustomPHP.ClearHeaders; end; -function TpsvCustomPHP.Execute : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; +function TpsvCustomPHP.Execute : zend_ustr; var file_handle : zend_file_handle; {$IFDEF PHP4} @@ -1093,7 +1095,7 @@ function TpsvCustomPHP.Execute : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ else begin file_handle._type := ZEND_HANDLE_FILENAME; - file_handle.filename := PAnsiChar(FFileName); + file_handle.filename := zend_pchar(FFileName); file_handle.opened_path := nil; file_handle.free_filename := 0; end; @@ -1137,7 +1139,7 @@ function TpsvCustomPHP.Execute : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ end; end; -function TpsvCustomPHP.RunCode(ACode : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}) : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; +function TpsvCustomPHP.RunCode(ACode : zend_ustr) : zend_ustr; begin if not EngineActive then begin @@ -1186,7 +1188,7 @@ procedure TpsvCustomPHP.SetHeaders(Value : TPHPHeaders); -function TpsvCustomPHP.Execute(AFileName: {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}): {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}; +function TpsvCustomPHP.Execute(AFileName: zend_ustr): zend_ustr; begin FFileName := AFileName; Result := Execute; @@ -1225,8 +1227,8 @@ procedure TpsvCustomPHP.PrepareResult; begin new(data); try - if zend_hash_find(ht, PAnsiChar(FVariables[cnt].Name), - strlen(PAnsiChar(FVariables[cnt].Name)) + 1, data) = SUCCESS then + if zend_hash_find(ht, zend_pchar(FVariables[cnt].Name), + strlen(zend_pchar(FVariables[cnt].Name)) + 1, data) = SUCCESS then begin variable := data^^; convert_to_string(variable); @@ -1239,7 +1241,7 @@ procedure TpsvCustomPHP.PrepareResult; end; end; -function TpsvCustomPHP.VariableByName(AName: AnsiString): TPHPVariable; +function TpsvCustomPHP.VariableByName(AName: zend_ustr): TPHPVariable; begin Result := FVariables.ByName(AName); end; @@ -1276,7 +1278,7 @@ procedure TpsvCustomPHP.StartupRequest; if Assigned(FOnReadPost) then FOnReadPost(Self, FPostStream); - zend_alter_ini_entry('max_execution_time', 19, PAnsiChar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_RUNTIME); + zend_alter_ini_entry('max_execution_time', 19, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_RUNTIME); php_request_startup(TSRMLS_D); if Assigned(FOnRequestStartup) then @@ -1360,17 +1362,17 @@ procedure TpsvCustomPHP.PrepareVariables; begin new(data); try - if zend_hash_find(ht, PAnsiChar(FVariables[cnt].Name), - strlen(PAnsiChar(FVariables[cnt].Name)) + 1, data) = SUCCESS then + if zend_hash_find(ht, zend_pchar(FVariables[cnt].Name), + strlen(zend_pchar(FVariables[cnt].Name)) + 1, data) = SUCCESS then begin if (data^^^._type = IS_STRING) then begin efree(data^^^.value.str.val); - ZVAL_STRING(data^^, PAnsiChar(FVariables[cnt].Value), true); + ZVAL_STRING(data^^, zend_pchar(FVariables[cnt].Value), true); end else begin - ZVAL_STRING(data^^, PAnsiChar(FVariables[cnt].Value), true); + ZVAL_STRING(data^^, zend_pchar(FVariables[cnt].Value), true); end; end; finally @@ -1394,7 +1396,7 @@ procedure TpsvCustomPHP.CloseVirtualFile; {$ENDIF} end; -function TpsvCustomPHP.CreateVirtualFile(ACode : {$IFDEF PHP_UNICE}UTF8String{$ELSE}AnsiString{$ENDIF}): boolean; +function TpsvCustomPHP.CreateVirtualFile(ACode : zend_ustr): boolean; {$IFDEF PHP4} var _handles : array[0..1] of THandle; @@ -1544,7 +1546,9 @@ procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; begin if not IsParamTypeCorrect(FParameters[j].ParamType, Params[j]^) then begin - zend_error(E_WARNING, PAnsiChar(AnsiFormat('Wrong parameter type for %s()', [FActiveFunctionName]))); + zend_error(E_WARNING, zend_pchar( + {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} + ('Wrong parameter type for %s()', [FActiveFunctionName]))); Exit; end; FParameters[j].ZendValue := (Params[j]^); @@ -1614,7 +1618,7 @@ procedure TPHPEngine.PrepareIniEntry; zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); TimeStr := IntToStr(FMaxInputTime); - zend_alter_ini_entry('max_input_time', 15, PAnsiChar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + zend_alter_ini_entry('max_input_time', 15, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); end; procedure TPHPEngine.PrepareEngine; @@ -1638,7 +1642,7 @@ procedure TPHPEngine.PrepareEngine; delphi_sapi_module.register_server_variables := @php_delphi_register_variables; delphi_sapi_module.log_message := @php_delphi_log_message; if FIniPath <> '' then - delphi_sapi_module.php_ini_path_override := PAnsiChar(FIniPath) + delphi_sapi_module.php_ini_path_override := zend_pchar(FIniPath) else delphi_sapi_module.php_ini_path_override := nil; delphi_sapi_module.block_interruptions := nil; @@ -1670,22 +1674,22 @@ procedure TPHPEngine.PrepareEngine; FLibraryModule._type := MODULE_PERSISTENT; FLibraryModule.handle := nil; FLibraryModule.module_number := 0; - FLibraryModule.build_id := DupStr(PAnsiChar(ZEND_MODULE_BUILD_ID)); + FLibraryModule.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); end; procedure TPHPEngine.RegisterConstants; var cnt : integer; - ConstantName : AnsiString; - ConstantValue : AnsiString; + ConstantName : zend_ustr; + ConstantValue : zend_ustr; begin for cnt := 0 to FConstants.Count - 1 do begin ConstantName := FConstants[cnt].Name; ConstantValue := FConstants[cnt].Value; - zend_register_string_constant(PAnsiChar(ConstantName), - strlen(PAnsiChar(ConstantName)) + 1, - PAnsiChar(ConstantValue), CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); + zend_register_string_constant(zend_pchar(ConstantName), + strlen(zend_pchar(ConstantName)) + 1, + zend_pchar(ConstantValue), CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); end; RegisterInternalConstants(TSRMLS_D); @@ -1695,14 +1699,14 @@ procedure TPHPEngine.RegisterInternalConstants(TSRMLS_DC: pointer); {$IFDEF REGISTER_COLORS} var i : integer; - ColorName : AnsiString; + ColorName : zend_ustr; {$ENDIF} begin {$IFDEF REGISTER_COLORS} for I := Low(Colors) to High(Colors) do begin - ColorName := AnsiString(Colors[i].Name); - zend_register_long_constant( PAnsiChar(ColorName), strlen(PAnsiChar(ColorName)) + 1, Colors[i].Value, + ColorName := zend_ustr(Colors[i].Name); + zend_register_long_constant( zend_pchar(ColorName), strlen(zend_pchar(ColorName)) + 1, Colors[i].Value, CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); end; {$ENDIF} @@ -1749,7 +1753,7 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); var cnt : integer; skip : boolean; - FN : AnsiString; + FN : zend_ustr; begin skip := false; ALib.Refresh; @@ -1760,7 +1764,9 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); for cnt := 0 to ALib.Functions.Count - 1 do begin - FN := AnsiLowerCase(ALib.Functions[cnt].FunctionName); + FN := + {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF} + (ALib.Functions[cnt].FunctionName); if FHash.IndexOf(FN) > -1 then begin skip := true; @@ -1772,7 +1778,8 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); begin for cnt := 0 to ALib.Functions.Count - 1 do begin - FN := AnsiLowercase(ALib.Functions[cnt].FunctionName); + FN := {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF} + (ALib.Functions[cnt].FunctionName); FHash.AddObject(FN, ALib.Functions[cnt]); end; ALib.Locked := true; @@ -1782,7 +1789,7 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); procedure TPHPEngine.RefreshLibrary; var cnt, offset : integer; - HashName : AnsiString; + HashName : zend_ustr; begin SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 13); @@ -1842,9 +1849,9 @@ procedure TPHPEngine.RefreshLibrary; HashName := FHash[cnt]; {$IFNDEF COMPILER_VC9} - FLibraryEntryTable[cnt+12].fname := strdup(PAnsiChar(HashName)); + FLibraryEntryTable[cnt+12].fname := strdup(zend_pchar(HashName)); {$ELSE} - FLibraryEntryTable[cnt+12].fname := DupStr(PAnsiChar(HashName)); + FLibraryEntryTable[cnt+12].fname := DupStr(zend_pchar(HashName)); {$ENDIF} FLibraryEntryTable[cnt+12].handler := @DispatchRequest; @@ -1858,9 +1865,9 @@ procedure TPHPEngine.RefreshLibrary; begin HashName := MyFuncs[cnt]; {$IFNDEF COMPILER_VC9} - FLibraryEntryTable[cnt+offset].fname := strdup(PAnsiChar(HashName)); + FLibraryEntryTable[cnt+offset].fname := strdup(zend_pchar(HashName)); {$ELSE} - FLibraryEntryTable[cnt+offset].fname := DupStr(PAnsiChar(HashName)); + FLibraryEntryTable[cnt+offset].fname := DupStr(zend_pchar(HashName)); {$ENDIF} FLibraryEntryTable[cnt+offset].handler := MyFuncs.Objects[ cnt ]; @@ -2040,7 +2047,7 @@ procedure TPHPEngine.RemoveRequest; InterlockedDecrement(FRequestCount); end; -procedure TPHPEngine.AddFunction(FN: AnsiString; Func: Pointer); +procedure TPHPEngine.AddFunction(FN: zend_ustr; Func: Pointer); begin if MyFuncs.IndexOf(FN) = -1 then MyFuncs.AddObject(FN, TObject(Func)); diff --git a/Source/phpClass.pas b/Source/phpClass.pas index 4726009..12e035d 100644 --- a/Source/phpClass.pas +++ b/Source/phpClass.pas @@ -32,8 +32,8 @@ TPHPClassInstance = class; //Property TClassProperty = class(TCollectionItem) private - FName : AnsiString; - FValue : AnsiString; + FName : zend_ustr; + FValue : zend_ustr; function GetAsBoolean: boolean; function GetAsFloat: double; function GetAsInteger: integer; @@ -46,11 +46,11 @@ TClassProperty = class(TCollectionItem) procedure Assign(Source : TPersistent); override; property AsInteger : integer read GetAsInteger write SetAsInteger; property AsBoolean : boolean read GetAsBoolean write SetAsBoolean; - property AsString : AnsiString read FValue write FValue; + property AsString : zend_ustr read FValue write FValue; property AsFloat : double read GetAsFloat write SetAsFloat; published - property Name : AnsiString read FName write FName; - property Value : AnsiString read FValue write FValue; + property Name : zend_ustr read FName write FName; + property Value : zend_ustr read FValue write FValue; end; //Collection of the class properties @@ -64,9 +64,9 @@ TClassProperties = class(TCollection) public function Add: TClassProperty; constructor Create(AOwner: TComponent); - function GetVariables : AnsiString; - function IndexOf(AName : AnsiString) : integer; - function ByName(AName : AnsiString) : TClassProperty; + function GetVariables : zend_ustr; + function IndexOf(AName : zend_ustr) : integer; + function ByName(AName : zend_ustr) : TClassProperty; property Items[Index: Integer]: TClassProperty read GetItem write SetItem; default; end; @@ -74,12 +74,12 @@ TClassProperties = class(TCollection) TPHPClassMethod = class(TCollectionItem) private FOnExecute : TClassMethodExecute; - FName: AnsiString; + FName: zend_ustr; FTag : integer; FFunctionParams: TFunctionParams; FZendVar : TZendVariable; procedure SetFunctionParams(const Value: TFunctionParams); - procedure _SetDisplayName(value : AnsiString); + procedure _SetDisplayName(value : zend_ustr); public ReturnValue : variant; constructor Create(Collection : TCollection); override; @@ -89,7 +89,7 @@ TPHPClassMethod = class(TCollectionItem) procedure AssignTo(Dest: TPersistent); override; property ZendVar: TZendVariable read FZendVar; published - property Name : AnsiString read FName write _SetDisplayName; + property Name : zend_ustr read FName write _SetDisplayName; property Tag : integer read FTag write FTag; property Parameters: TFunctionParams read FFunctionParams write SetFunctionParams; property OnExecute : TClassMethodExecute read FOnExecute write FOnExecute; @@ -107,7 +107,7 @@ TPHPClassMethods = class(TCollection) public constructor Create(Owner: TPersistent; ItemClass: TCollectionItemClass); function Add : TPHPClassMethod; - function ByName(AName : AnsiString) : TPHPClassMethod; + function ByName(AName : zend_ustr) : TPHPClassMethod; property Items[Index: Integer]: TPHPClassMethod read GetItem write SetItem; default; end; @@ -117,14 +117,14 @@ TPHPClass = class(TPHPComponent) FProperties : TClassProperties; FMethods : TPHPClassMethods; FClassObject: pzend_class_entry; - FClassName : AnsiString; + FClassName : zend_ustr; FClassEntry : tzend_class_entry; {$IFDEF PHP5} FClassFunction : array[0..1] of zend_function_entry; {$ENDIF} procedure SetProperties(const Value: TClassProperties); procedure SetMethods(const Value : TPHPClassMethods); - procedure SetClassName(const Value: AnsiString); + procedure SetClassName(const Value: zend_ustr); protected function GetClassEntry : pzend_class_entry; virtual; procedure Loaded; override; @@ -138,7 +138,7 @@ TPHPClass = class(TPHPComponent) published property Properties : TClassProperties read FProperties write SetProperties; property Methods : TPHPClassMethods read FMethods write SetMethods; - property PHPClassName : AnsiString read FClassName write SetClassName; + property PHPClassName : zend_ustr read FClassName write SetClassName; end; @@ -197,7 +197,7 @@ procedure class_destructor_handler(rsrc : PZend_rsrc_list_entry; TSRMLS_D : poin //when object created from script using "new" -function class_call_constructor(AClassName : AnsiString; return_value : pzval) : TPHPClassInstance; +function class_call_constructor(AClassName : zend_ustr; return_value : pzval) : TPHPClassInstance; var Extension : TPHPExtension; idp : pointer; @@ -234,7 +234,7 @@ function class_set_property_handler(property_reference : Pzend_property_referenc element : pzend_list_element; prop : pzend_overloaded_element; p : pointer; - propname : AnsiString; + propname : zend_ustr; tsrmls : pointer; param : TClassProperty; begin @@ -274,7 +274,7 @@ procedure class_call_function(ht : integer; return_value : pzval; this_ptr : pzv element : pzend_list_element; prop : pzend_overloaded_element; p : pointer; - MethodName : AnsiString; + MethodName : zend_ustr; Params : pzval_array; j : integer; begin @@ -327,7 +327,7 @@ procedure class_call_function(ht : integer; return_value : pzval; this_ptr : pzv begin if not IsParamTypeCorrect(M.Parameters[j].ParamType, Params[j]^) then begin - zend_error(E_WARNING, PAnsiChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); + zend_error(E_WARNING, zend_pchar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); Exit; end; M.Parameters[j].Value := zval2variant(Params[j]^^); @@ -355,7 +355,7 @@ procedure class_get_property_handler(val : pzval; property_reference : PZend_pro prop : pzend_overloaded_element; obj : TPHPClassInstance; p : pointer; - propname : AnsiString; + propname : zend_ustr; tsrmls : pointer; data: ^ppzval; param : TClassProperty; @@ -376,7 +376,7 @@ procedure class_get_property_handler(val : pzval; property_reference : PZend_pro begin param := Obj.Properties.ByName(propname); if Assigned(param) then - ZVAL_STRING(val, PAnsiChar(param.value), true) + ZVAL_STRING(val, zend_pchar(param.value), true) else ZVAL_EMPTY_STRING(val) end @@ -437,7 +437,7 @@ function class_get_property_handler(_object : pzval; member : pzval; _type : int retval : pzval; obj : TPHPClassInstance; data: ^ppzval; - propname : AnsiString; + propname : zend_ustr; object_properties : PHashTable; param : TClassProperty; begin @@ -459,7 +459,7 @@ function class_get_property_handler(_object : pzval; member : pzval; _type : int begin param := Obj.Properties.ByName(propname); if Assigned(param) then - ZVAL_STRING(retval, PAnsiChar(param.value), true) + ZVAL_STRING(retval, zend_pchar(param.value), true) else ZVAL_EMPTY_STRING(retval); end @@ -476,7 +476,7 @@ procedure class_set_property_handler(_object : pzval; member : pzval; value : pz var OBJ : TPHPClassInstance; data: ^ppzval; - propname : AnsiString; + propname : zend_ustr; object_properties : PHashTable; param : TClassProperty; begin @@ -503,10 +503,10 @@ procedure class_set_property_handler(_object : pzval; member : pzval; value : pz end; {$IFDEF PHP510} -function class_call_method(method : PAnsiChar; ht : integer; return_value : pzval; return_value_ptr : ppzval; +function class_call_method(method : zend_pchar; ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; {$ELSE} -function class_call_method(method : PAnsiChar; ht : integer; return_value : pzval; this_ptr : pzval; +function class_call_method(method : zend_pchar; ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; {$ENDIF} var @@ -564,7 +564,7 @@ function class_call_method(method : PAnsiChar; ht : integer; return_value : pzva begin if not IsParamTypeCorrect(M.Parameters[j].ParamType, Params[j]^) then begin - zend_error(E_WARNING, PAnsiChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); + zend_error(E_WARNING, zend_pchar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); Result := FAILURE; Exit; end; @@ -587,7 +587,7 @@ function class_call_method(method : PAnsiChar; ht : integer; return_value : pzva end; //PHP5 -function class_get_method(_object : pzval; method_name : PAnsiChar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; +function class_get_method(_object : pzval; method_name : zend_pchar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; var fnc : pZendFunction; begin @@ -616,7 +616,7 @@ procedure class_init_new(ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} var - AClassName : PAnsiChar; + AClassName : zend_pchar; len : integer; Extension : TPHPExtension; idp : pointer; @@ -670,7 +670,7 @@ procedure TPHPClass.ClassRegister(AModuleNumber : integer); {$ENDIF} if le_classresource = 0 then - le_classresource := zend_register_list_destructors_ex(@class_destructor_handler, nil, PAnsiChar(le_classresource_name), AModuleNumber); + le_classresource := zend_register_list_destructors_ex(@class_destructor_handler, nil, zend_pchar(le_classresource_name), AModuleNumber); if (Application.GetPHPClass(FClassName) = nil) then begin @@ -679,11 +679,11 @@ procedure TPHPClass.ClassRegister(AModuleNumber : integer); ZeroMemory(@FClassEntry, SizeOf(TZend_Class_Entry)); {$IFDEF PHP5} - FClassFunction[0].fname := PAnsiChar(FClassName); + FClassFunction[0].fname := zend_pchar(FClassName); FClassFunction[0].handler := @class_init_new; - INIT_CLASS_ENTRY(FClassEntry, PAnsiChar(FClassName) , @FClassFunction); + INIT_CLASS_ENTRY(FClassEntry, zend_pchar(FClassName) , @FClassFunction); {$ELSE} - INIT_CLASS_ENTRY(FClassEntry, PAnsiChar(FClassName) , nil); + INIT_CLASS_ENTRY(FClassEntry, zend_pchar(FClassName) , nil); {$ENDIF} @@ -805,7 +805,7 @@ procedure TPHPClass.ProduceInstance(AValue: pzval); end; -procedure TPHPClass.SetClassName(const Value: AnsiString); +procedure TPHPClass.SetClassName(const Value: zend_ustr); begin FClassName := LowerCase(Value); end; @@ -962,7 +962,7 @@ function TClassProperties.GetOwner : TPersistent; Result := FOwner; end; -function TClassProperties.GetVariables: AnsiString; +function TClassProperties.GetVariables: zend_ustr; var i : integer; begin for i := 0 to Count - 1 do @@ -973,7 +973,7 @@ function TClassProperties.GetVariables: AnsiString; end; end; -function TClassProperties.IndexOf(AName: AnsiString): integer; +function TClassProperties.IndexOf(AName: zend_ustr): integer; var i : integer; begin @@ -989,7 +989,7 @@ function TClassProperties.IndexOf(AName: AnsiString): integer; end; -function TClassProperties.ByName(AName: AnsiString): TClassProperty; +function TClassProperties.ByName(AName: zend_ustr): TClassProperty; var i : integer; begin @@ -1011,7 +1011,7 @@ function TPHPClassMethods.Add: TPHPClassMethod; Result := TPHPClassMethod(inherited Add); end; -function TPHPClassMethods.ByName(AName: AnsiString): TPHPClassMethod; +function TPHPClassMethods.ByName(AName: zend_ustr): TPHPClassMethod; var i : integer; begin @@ -1122,14 +1122,15 @@ procedure TPHPClassMethod.SetDisplayName(const Value: string); I: Integer; F: TPHPClassMethod; begin - if AnsiCompareText(Value, FName) <> 0 then + if + {$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, FName) <> 0 then begin if Collection <> nil then for I := 0 to Collection.Count - 1 do begin F := TPHPClassMethods(Collection).Items[I]; if (F <> Self) and (F is TPHPClassMethod) and - (AnsiCompareText(Value, F.Name) = 0) then + ({$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, F.Name) = 0) then raise Exception.Create('Duplicate method name'); end; FName := LowerCase(Value); @@ -1137,7 +1138,7 @@ procedure TPHPClassMethod.SetDisplayName(const Value: string); end; end; -procedure TPHPClassMethod._SetDisplayName(Value: AnsiString); +procedure TPHPClassMethod._SetDisplayName(Value: zend_ustr); var NewName : string; begin diff --git a/Source/phpModules.pas b/Source/phpModules.pas index 03d88d8..d7397a8 100644 --- a/Source/phpModules.pas +++ b/Source/phpModules.pas @@ -46,11 +46,11 @@ TCustomPHPExtension = class(TDataModule) public constructor Create(AOwner : TComponent); override; destructor Destroy; override; - procedure puts(str : PAnsiChar); - procedure phpwrite(str : PAnsiChar; str_len : integer); - procedure phpwrite_h(str : PAnsiChar; str_len : integer); - procedure puts_h(str : PAnsiChar); - procedure ReportError(ErrType : integer; ErrText : PAnsiChar); + procedure puts(str : zend_pchar); + procedure phpwrite(str : zend_pchar; str_len : integer); + procedure phpwrite_h(str : zend_pchar; str_len : integer); + procedure puts_h(str : zend_pchar); + procedure ReportError(ErrType : integer; ErrText : zend_pchar); function FunctionByName(const AName : string) :TPHPFunction; property About : TPHPAboutInfo read FAbout write FAbout stored False; property ModuleType : TZendModuleType read FModuleType write FModuleType default mtPersistent; @@ -164,7 +164,7 @@ procedure php_info_module(zend_module : Pzend_module_entry; TSRMLS_DC : pointer) else begin php_info_print_table_start(); - php_info_print_table_row(2, PAnsiChar(Extension.ModuleName + ' support'), PAnsiChar('enabled')); + php_info_print_table_row(2, zend_pchar(Extension.ModuleName + ' support'), zend_pchar('enabled')); php_info_print_table_end(); end; finally @@ -290,9 +290,9 @@ function get_module : Pzend_module_entry; cdecl; var cnt : integer; Extension : TPHPExtension; - ModuleName: AnsiString; - Version : AnsiString; - FunctionName : AnsiString; + ModuleName: zend_ustr; + Version : zend_ustr; + FunctionName : zend_ustr; begin if ModuleEntry.module_started = 1 then begin @@ -309,20 +309,20 @@ function get_module : Pzend_module_entry; cdecl; ModuleEntry.size := sizeof(Tzend_module_entry); ModuleEntry.zend_api := ZEND_MODULE_API_NO; ModuleEntry.zts := USING_ZTS; - ModuleName := AnsiString(Extension.ModuleName); + ModuleName := zend_ustr(Extension.ModuleName); {$IFNDEF COMPILER_VC9} - ModuleEntry.Name := strdup(PAnsiChar(ModuleName)); + ModuleEntry.Name := strdup(zend_pchar(ModuleName)); {$ELSE} - ModuleEntry.Name := DupStr(PAnsiChar(ModuleName)); + ModuleEntry.Name := DupStr(zend_pchar(ModuleName)); {$ENDIF} - Version := AnsiString(Extension.Version); + Version := zend_ustr(Extension.Version); {$IFNDEF COMPILER_VC9} - ModuleEntry.version := strdup(PAnsiChar(Version)); + ModuleEntry.version := strdup(zend_pchar(Version)); {$ELSE} - ModuleEntry.version := DupStr(PAnsiChar(Version)); + ModuleEntry.version := DupStr(zend_pchar(Version)); {$ENDIF} @@ -334,12 +334,12 @@ function get_module : Pzend_module_entry; cdecl; SetLength(module_entry_table, Extension.FFunctions.Count + 1); for cnt := 0 to Extension.FFunctions.Count - 1 do begin - FunctionName := AnsiString(Extension.FFunctions[cnt].FunctionName); + FunctionName := zend_ustr(Extension.FFunctions[cnt].FunctionName); {$IFNDEF COMPILER_VC9} - module_entry_table[cnt].fname := strdup(PAnsiChar(FunctionName)); + module_entry_table[cnt].fname := strdup(zend_pchar(FunctionName)); {$ELSE} - module_entry_table[cnt].fname :=DupStr(PAnsiChar(FunctionName)); + module_entry_table[cnt].fname :=DupStr(zend_pchar(FunctionName)); {$ENDIF} module_entry_table[cnt].handler := @DispatchRequest; @@ -358,9 +358,9 @@ function get_module : Pzend_module_entry; cdecl; {$IFDEF PHP530} {$IFNDEF COMPILER_VC9} - moduleEntry.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + moduleEntry.build_id := strdup(zend_pchar(ZEND_MODULE_BUILD_ID)); {$ELSE} - moduleEntry.build_id := DupStr(PAnsiChar(ZEND_MODULE_BUILD_ID)); + moduleEntry.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); {$ENDIF} {$ENDIF} @@ -409,28 +409,28 @@ function TCustomPHPExtension.FunctionByName( end; end; -procedure TCustomPHPExtension.phpwrite(str: PAnsiChar; str_len: integer); +procedure TCustomPHPExtension.phpwrite(str: zend_pchar; str_len: integer); begin php_body_write(str, str_len, FTSRMLS); end; -procedure TCustomPHPExtension.phpwrite_h(str: PAnsiChar; str_len: integer); +procedure TCustomPHPExtension.phpwrite_h(str: zend_pchar; str_len: integer); begin php_header_write(str, str_len, FTSRMLS); end; -procedure TCustomPHPExtension.puts(str: PAnsiChar); +procedure TCustomPHPExtension.puts(str: zend_pchar); begin php_body_write(str, strlen(str), FTSRMLS); end; -procedure TCustomPHPExtension.puts_h(str: PAnsiChar); +procedure TCustomPHPExtension.puts_h(str: zend_pchar); begin php_header_write(str, strlen(str), FTSRMLS); end; procedure TCustomPHPExtension.ReportError(ErrType: integer; - ErrText: PAnsiChar); + ErrText: zend_pchar); begin zend_error(ErrType, ErrText); end; @@ -502,7 +502,7 @@ destructor TPHPApplication.Destroy; FClassList.Free; except on E : Exception do - OutputDebugStringA(PAnsiChar(E.Message)); + OutputDebugStringA(zend_pchar(E.Message)); end; inherited Destroy; end; @@ -690,7 +690,7 @@ procedure TPHPApplication.HandleRequest(ht: integer; return_value : pzval; retu begin if not IsParamTypeCorrect(FParameters[i].ParamType, pval) then begin - zend_error(E_WARNING, PAnsiChar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); + zend_error(E_WARNING, zend_pchar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); Exit; end; FParameters[i].ZendValue := pval; diff --git a/Source/zend_dynamic_array.pas b/Source/zend_dynamic_array.pas index a6feffe..e58c4d8 100644 --- a/Source/zend_dynamic_array.pas +++ b/Source/zend_dynamic_array.pas @@ -15,13 +15,13 @@ interface uses - Windows, SysUtils; + Windows, SysUtils, ZENDTypes; type dynamic_array = record - _array : PAnsiChar; + _array : zend_pchar; element_size : UINT; current : UINT; allocated : UINT; From b992e36fa5c522712cf34c3ae531c5aee249929d Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Thu, 7 Mar 2019 17:44:09 +0200 Subject: [PATCH 18/54] Final strokes --- Source/DelphiFunctions.pas | 20 +++++++++++++++++--- Source/ZENDAPI.pas | 4 ++-- Source/php4delphi.pas | 35 +++++++++++++++++++++-------------- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index f17ed18..c5f24e3 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -139,7 +139,13 @@ procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} - +{$IFDEF PHP5} +procedure delphi_is_uc(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_is_uc(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} {$IFDEF PHP510} procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; @@ -641,8 +647,16 @@ procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval {$ENDIF} end; - - +{$IFDEF PHP5} +procedure delphi_is_uc(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure delphi_is_uc(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); +{$ENDIF} +begin + {$IFDEF PHP_UNICE}ZVAL_TRUE{$ELSE}ZVAL_FALSE{$ENDIF}(return_value); +end; {$IFDEF PHP510} procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 94d127c..e3d9c45 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -3433,13 +3433,13 @@ function Z_VARREC(z: pzval): TVarRec; Result.VExtended^ := z.value.dval; end; IS_STRING: begin - Result.VType := {$IFDEF PHP_UNICE}vtUnicodeString{$ELSE}vtAnsiString{$ENDIF}; + Result.VType := {$IFDEF PHP_UNICE}vtString{$ELSE}vtAnsiString{$ENDIF}; SetLength(P, z.value.str.len); Move(z.value.str.val^, P[1], z.value.str.len); {$IFDEF PHP_UNICE} - Result.VUnicodeString := Pointer(UnicodeString(p)); + Result.VString := Pointer(String(p)); {$ELSE} Result.VAnsiString := Pointer(P); {$ENDIF} diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 495643e..1d19cbb 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -1791,7 +1791,7 @@ procedure TPHPEngine.RefreshLibrary; cnt, offset : integer; HashName : zend_ustr; begin - SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 13); + SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 14); PHP_FUNCTION(FLibraryEntryTable[0], 'delphi_date', @delphi_date); PHP_FUNCTION(FLibraryEntryTable[1], 'delphi_extract_file_dir', @delphi_extract_file_dir); @@ -1830,18 +1830,25 @@ procedure TPHPEngine.RefreshLibrary; FLibraryEntryTable[7].arg_info := nil; {$ENDIF} - FLibraryEntryTable[8].fname := 'delphi_str_date'; - FLibraryEntryTable[8].handler := @delphi_str_date; + FLibraryEntryTable[8].fname := 'delphi_is_uc'; + FLibraryEntryTable[8].handler := @delphi_is_uc; {$IFDEF PHP4} FLibraryEntryTable[8].func_arg_types := nil; {$ELSE} FLibraryEntryTable[8].arg_info := nil; {$ENDIF} + FLibraryEntryTable[9].fname := 'delphi_str_date'; + FLibraryEntryTable[9].handler := @delphi_str_date; + {$IFDEF PHP4} + FLibraryEntryTable[9].func_arg_types := nil; + {$ELSE} + FLibraryEntryTable[9].arg_info := nil; + {$ENDIF} - PHP_FUNCTION(FLibraryEntryTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); - PHP_FUNCTION(FLibraryEntryTable[10], 'InputBox', @delphi_input_box); - PHP_FUNCTION(FLibraryEntryTable[11], 'register_delphi_component', @register_delphi_component); + PHP_FUNCTION(FLibraryEntryTable[10], 'delphi_get_system_directory', @delphi_get_system_directory); + PHP_FUNCTION(FLibraryEntryTable[11], 'InputBox', @delphi_input_box); + PHP_FUNCTION(FLibraryEntryTable[12], 'register_delphi_component', @register_delphi_component); for cnt := 0 to FHash.Count - 1 do @@ -1849,18 +1856,18 @@ procedure TPHPEngine.RefreshLibrary; HashName := FHash[cnt]; {$IFNDEF COMPILER_VC9} - FLibraryEntryTable[cnt+12].fname := strdup(zend_pchar(HashName)); + FLibraryEntryTable[cnt+13].fname := strdup(zend_pchar(HashName)); {$ELSE} - FLibraryEntryTable[cnt+12].fname := DupStr(zend_pchar(HashName)); + FLibraryEntryTable[cnt+13].fname := DupStr(zend_pchar(HashName)); {$ENDIF} - FLibraryEntryTable[cnt+12].handler := @DispatchRequest; + FLibraryEntryTable[cnt+13].handler := @DispatchRequest; {$IFDEF PHP4} - FLibraryEntryTable[cnt+12].func_arg_types := nil; + FLibraryEntryTable[cnt+13].func_arg_types := nil; {$ENDIF} end; - offset := FHash.Count + 12; + offset := FHash.Count + 13; for cnt := 0 to MyFuncs.Count - 1 do begin HashName := MyFuncs[cnt]; @@ -1877,10 +1884,10 @@ procedure TPHPEngine.RefreshLibrary; end; - FLibraryEntryTable[FHash.Count+MyFuncs.Count+12].fname := nil; - FLibraryEntryTable[FHash.Count+MyFuncs.Count+12].handler := nil; + FLibraryEntryTable[FHash.Count+MyFuncs.Count+13].fname := nil; + FLibraryEntryTable[FHash.Count+MyFuncs.Count+13].handler := nil; {$IFDEF PHP4} - FLibraryEntryTable[FHash.Count+MyFuncs.Count+12].func_arg_types := nil; + FLibraryEntryTable[FHash.Count+MyFuncs.Count+13].func_arg_types := nil; {$ENDIF} FLibraryModule.functions := @FLibraryEntryTable[0]; From 82287addd2092374dff0824c5d0fe44d1c400dc7 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Thu, 7 Mar 2019 17:53:24 +0200 Subject: [PATCH 19/54] Update readme.txt --- readme.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.txt b/readme.txt index 99870f9..ead92f3 100644 --- a/readme.txt +++ b/readme.txt @@ -34,6 +34,10 @@ design-time and run-time packages for Delphi 5 through Delphi Berlin History: +7.4.1 Mar 2019 + +* Added unicode support + 7.4 Feb 2019 * Compatible with PHP 5.5.0 From 44ab99fddb154aa6858fd0428ce1b8357141c760 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Thu, 7 Mar 2019 19:01:34 +0200 Subject: [PATCH 20/54] Small changes --- Source/PHPFunctions.pas | 6 ++++-- Source/ZENDAPI.pas | 2 +- Source/php4delphi.pas | 5 +++-- Source/phpClass.pas | 5 +++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index 4f192ae..d8071cf 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -19,7 +19,9 @@ interface uses - Windows, SysUtils, Classes, {$IFDEF VERSION6} Variants, + Windows, SysUtils, Classes, + {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} + {$IFDEF VERSION6} Variants, {$ENDIF} ZendTypes, PHPTypes, ZendAPI, PHPAPI ; type @@ -321,7 +323,7 @@ procedure TPHPFunction.SetDisplayName(const Value: string); ({$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(NameValue, F.FunctionName) = 0) then raise Exception.CreateFmt('Duplicate function name: %s', [Value]); end; - FFunctionName := {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF}(Value); + FFunctionName := {$IFDEF PHP_UNICE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF}(Value); Changed(False); end; end; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index e3d9c45..5b36e8d 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -3439,7 +3439,7 @@ function Z_VARREC(z: pzval): TVarRec; Move(z.value.str.val^, P[1], z.value.str.len); {$IFDEF PHP_UNICE} - Result.VString := Pointer(String(p)); + Result.VUnicodeString := Pointer(p); {$ELSE} Result.VAnsiString := Pointer(P); {$ENDIF} diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 1d19cbb..13baa1c 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -40,6 +40,7 @@ interface PHPCommon, WinApi.WinSock, ZendTypes, PHPTypes, PHPAPI, ZENDAPI, DelphiFunctions, phpFunctions, strUtils, varUtils, + {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} {$IFDEF soulengine_build} VCL.Dialogs, {$ENDIF} System.UITypes; @@ -1765,7 +1766,7 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); for cnt := 0 to ALib.Functions.Count - 1 do begin FN := - {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF} + {$IFDEF PHP_UNICE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} (ALib.Functions[cnt].FunctionName); if FHash.IndexOf(FN) > -1 then begin @@ -1778,7 +1779,7 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); begin for cnt := 0 to ALib.Functions.Count - 1 do begin - FN := {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF} + FN := {$IFDEF PHP_UNICE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} (ALib.Functions[cnt].FunctionName); FHash.AddObject(FN, ALib.Functions[cnt]); end; diff --git a/Source/phpClass.pas b/Source/phpClass.pas index 12e035d..a684840 100644 --- a/Source/phpClass.pas +++ b/Source/phpClass.pas @@ -18,6 +18,7 @@ interface uses Windows, SysUtils, Classes, PHPCommon, + {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} ZendTypes, ZendAPI, phpTypes, PHPAPI, phpFunctions; @@ -807,7 +808,7 @@ procedure TPHPClass.ProduceInstance(AValue: pzval); procedure TPHPClass.SetClassName(const Value: zend_ustr); begin - FClassName := LowerCase(Value); + FClassName := {$IFDEF PHP_UNICE}UTF8LowerCase(Value){$ELSE}LowerCase(Value){$ENDIF}; end; procedure TPHPClass.SetMethods(const Value: TPHPClassmethods); @@ -1133,7 +1134,7 @@ procedure TPHPClassMethod.SetDisplayName(const Value: string); ({$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, F.Name) = 0) then raise Exception.Create('Duplicate method name'); end; - FName := LowerCase(Value); + FName := {$IFDEF PHP_UNICE}LowerCase(Value){$ELSE}AnsiLowerCase(Value){$ENDIF}; Changed(False); end; end; From 28036a7430837db19176affacb8656ba74562c1f Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Sat, 9 Mar 2019 18:19:46 +0200 Subject: [PATCH 21/54] some small changes --- PHP4DELPHI.HLP => Documentation/PHP4DELPHI.HLP | Bin php4delphi.chm => Documentation/php4delphi.chm | Bin php4delphi.chw => Documentation/php4delphi.chw | Bin php4delphi.cnt => Documentation/php4delphi.cnt | 0 Source/DelphiFunctions.pas | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) rename PHP4DELPHI.HLP => Documentation/PHP4DELPHI.HLP (100%) rename php4delphi.chm => Documentation/php4delphi.chm (100%) rename php4delphi.chw => Documentation/php4delphi.chw (100%) rename php4delphi.cnt => Documentation/php4delphi.cnt (100%) diff --git a/PHP4DELPHI.HLP b/Documentation/PHP4DELPHI.HLP similarity index 100% rename from PHP4DELPHI.HLP rename to Documentation/PHP4DELPHI.HLP diff --git a/php4delphi.chm b/Documentation/php4delphi.chm similarity index 100% rename from php4delphi.chm rename to Documentation/php4delphi.chm diff --git a/php4delphi.chw b/Documentation/php4delphi.chw similarity index 100% rename from php4delphi.chw rename to Documentation/php4delphi.chw diff --git a/php4delphi.cnt b/Documentation/php4delphi.cnt similarity index 100% rename from php4delphi.cnt rename to Documentation/php4delphi.cnt diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index c5f24e3..3334287 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -479,7 +479,7 @@ procedure delphi_get_property_handler(val : pzval; property_reference : PZend_pr end; - +{$IFDEF PHP4} procedure _delphi_get_property_wrapper; assembler; asm push ebp @@ -518,7 +518,7 @@ procedure _delphi_get_property_wrapper; assembler; pop ebp ret end; - +{$ENDIF} procedure delphi_call_function(ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; From 1d7313ccfa8d3265bac0924127c5cbeabc7abd75 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Wed, 13 Mar 2019 13:11:55 +0200 Subject: [PATCH 22/54] Some L/D changes --- Source/PHPProjectWizard.pas | 2 +- Source/PHPTypes.pas | 12 ++++++------ Source/ZENDAPI.pas | 4 ++-- Source/ZendTypes.pas | 2 +- Source/php4DelphiD2010.dproj | 22 +++++++++++----------- Source/php4DelphiD2010.identcache | Bin 1252 -> 1252 bytes Source/php4DelphiD2010.stat | 6 +++--- Source/php4DelphiR2010.identcache | Bin 856 -> 856 bytes Source/php4DelphiR2010.stat | 6 +++--- Source/php4delphi.pas | 9 ++++----- Source/phpModules.pas | 4 +++- Source/phpWeb.pas | 2 +- Source/zend_dynamic_array.pas | 2 +- 13 files changed, 36 insertions(+), 35 deletions(-) diff --git a/Source/PHPProjectWizard.pas b/Source/PHPProjectWizard.pas index 49edc4a..37f4fac 100644 --- a/Source/PHPProjectWizard.pas +++ b/Source/PHPProjectWizard.pas @@ -16,7 +16,7 @@ interface uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + {$IFNDEF FPC} Windows, {$ELSE} LCLType,LCLIntf,dynlibs,libc,{$ENDIF} Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ToolsAPI, {$IFDEF VERSION6} DesignIntf, diff --git a/Source/PHPTypes.pas b/Source/PHPTypes.pas index 5dbbbc6..0f788f4 100644 --- a/Source/PHPTypes.pas +++ b/Source/PHPTypes.pas @@ -16,7 +16,7 @@ interface uses - Windows, ZENDTypes; + {$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, ZENDTypes; {$IFDEF PHP4} const @@ -254,8 +254,8 @@ interface sapi_module_struct = record - name : zend_pchar; - pretty_name : zend_pchar; + name : PAnsiChar; + pretty_name : PAnsiChar; startup : TModuleStartupFunc; //int (*startup)(struct _sapi_module_struct *sapi_module); @@ -288,14 +288,14 @@ interface get_request_time : pointer; terminate_process : pointer; - php_ini_path_override : zend_pchar; + php_ini_path_override : PAnsiChar; block_interruptions : pointer; unblock_interruptions : pointer; default_post_reader : pointer; treat_data : pointer; - executable_location : zend_pchar; + executable_location : PAnsiChar; php_ini_ignore : Integer; @@ -313,7 +313,7 @@ interface phpinfo_as_text : integer; - ini_entries : zend_pchar; + ini_entries : PAnsiChar; additional_functions: Pointer; input_filter_init : Pointer; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 5b36e8d..e614614 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -20,7 +20,7 @@ interface uses - Windows, SysUtils, + {$IFNDEF FPC} Windows{$ELSE} LCLType,LCLIntf,dynlibs,libc{$ENDIF}, SysUtils, ZendTypes, Variants, PHPTypes; type @@ -556,7 +556,7 @@ procedure dispose_pzval_array(Params: pzval_array); var _zend_bailout : procedure (filename : zend_pchar; lineno : uint); cdecl; - zend_alter_ini_entry : function(name: zend_pchar; name_length: uint; new_value: zend_pchar; new_value_length: uint; modify_type: Integer; stage: Integer): Integer; cdecl; + zend_alter_ini_entry : function(name: PAnsiChar; name_length: uint; new_value: PAnsiChar; new_value_length: uint; modify_type: Integer; stage: Integer): Integer; cdecl; zend_alter_ini_entry_ex : function(name: zend_pchar; name_length: uint; new_value: zend_pchar; new_value_length: uint; modify_type: Integer; stage: Integer; force_change: integer): Integer; cdecl; zend_restore_ini_entry : function(name: zend_pchar; name_length: uint; stage: Integer): Integer; cdecl; diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index 9c2b874..a0d2a8e 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -16,7 +16,7 @@ interface uses - Windows, SysUtils; + {$IFNDEF FPC} Windows {$ELSE} LCLType{$ENDIF}, SysUtils; const //zend.h diff --git a/Source/php4DelphiD2010.dproj b/Source/php4DelphiD2010.dproj index d0ed8de..e8ebf40 100644 --- a/Source/php4DelphiD2010.dproj +++ b/Source/php4DelphiD2010.dproj @@ -136,7 +136,16 @@ True - + + + 0 + .dll;.bpl + + + 1 + .dylib + + Contents\Resources @@ -475,16 +484,7 @@ 1 - - - 0 - .dll;.bpl - - - 1 - .dylib - - + diff --git a/Source/php4DelphiD2010.identcache b/Source/php4DelphiD2010.identcache index cb3dd3fa670e67cd3d46bc4ae7aae2ee3727c99a..a7374d782c74209272df63f52365e47f88bf526f 100644 GIT binary patch delta 70 zcmaFD`Gj-A$H{+~eJA%Z`T?=|1wkjb-H Wynx~+lT{fdCf{N71+smB@__)O%NLgb delta 78 zcmaFD`Gj-A$I0uMeJ1Z`vYUL7MR>9uqu=CT%)UU{eDYyNaiE;ZT5~w$DatgB-0Fz@I8UO$Q diff --git a/Source/php4DelphiD2010.stat b/Source/php4DelphiD2010.stat index 1d4bad9..04476ee 100644 --- a/Source/php4DelphiD2010.stat +++ b/Source/php4DelphiD2010.stat @@ -1,9 +1,9 @@ [Stats] -EditorSecs=287 +EditorSecs=235 DesignerSecs=1 InspectorSecs=1 -CompileSecs=15416 -OtherSecs=107 +CompileSecs=43212 +OtherSecs=247 StartTime=04.03.2019 21:55:53 RealKeys=0 EffectiveKeys=0 diff --git a/Source/php4DelphiR2010.identcache b/Source/php4DelphiR2010.identcache index 827b7ad5a3029367083fb6c86853e7d397fec07f..25b123d6abd31477238e8c3faaf37e88fbec9675 100644 GIT binary patch delta 45 zcmcb?c7tug?aAMmBqpmfnNQYYOa;<@llvLHCocDye2dW+h)pK1WRjfB$Ls|Fl`jx~ delta 49 zcmcb?c7tug?a47r5|jHG%_nOyrcS=g=smfF$rs4?1JWjwzcNWq)?hN3cw1sJAF~$# D(mD}z diff --git a/Source/php4DelphiR2010.stat b/Source/php4DelphiR2010.stat index a623f2e..02de922 100644 --- a/Source/php4DelphiR2010.stat +++ b/Source/php4DelphiR2010.stat @@ -1,9 +1,9 @@ [Stats] -EditorSecs=3026 +EditorSecs=4128 DesignerSecs=1 InspectorSecs=3 -CompileSecs=87688 -OtherSecs=331 +CompileSecs=112868 +OtherSecs=370 StartTime=29.07.4016 22:02:01 RealKeys=0 EffectiveKeys=0 diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 13baa1c..fb42abc 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -197,7 +197,7 @@ TCustomPHPLibrary = class(TPHPComponent) TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) private - FINIPath : zend_ustr; + FINIPath : AnsiString; FOnEngineStartup : TNotifyEvent; FOnEngineShutdown : TNotifyEvent; FEngineActive : boolean; @@ -261,7 +261,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) property OnEngineShutdown : TNotifyEvent read FOnEngineShutdown write FOnEngineShutdown; property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; - property IniPath : zend_ustr read FIniPath write FIniPath; + property IniPath : AnsiString read FIniPath write FIniPath; {$IFNDEF PHP540} property SafeMode : boolean read FSafeMode write FSafeMode default false; property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; @@ -1617,8 +1617,7 @@ procedure TPHPEngine.PrepareIniEntry; zend_alter_ini_entry('html_errors', 12, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - - TimeStr := IntToStr(FMaxInputTime); + TimeStr := IntToStr(FMaxInputTime); zend_alter_ini_entry('max_input_time', 15, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); end; @@ -1643,7 +1642,7 @@ procedure TPHPEngine.PrepareEngine; delphi_sapi_module.register_server_variables := @php_delphi_register_variables; delphi_sapi_module.log_message := @php_delphi_log_message; if FIniPath <> '' then - delphi_sapi_module.php_ini_path_override := zend_pchar(FIniPath) + delphi_sapi_module.php_ini_path_override := PAnsiChar(FIniPath) else delphi_sapi_module.php_ini_path_override := nil; delphi_sapi_module.block_interruptions := nil; diff --git a/Source/phpModules.pas b/Source/phpModules.pas index d7397a8..9943c82 100644 --- a/Source/phpModules.pas +++ b/Source/phpModules.pas @@ -16,7 +16,7 @@ interface uses - SyncObjs, Windows, SysUtils, Types, Classes, VCL.Forms, VCL.Consts, + SyncObjs, {$IFNDEF FPC} Windows, {$ELSE} LCLType,LCLIntf,dynlibs,LCLProc,{$ENDIF} SysUtils, Types, Classes, VCL.Forms, VCL.Consts, PHPCommon, {$IFDEF VERSION6}RTLConsts, Variants,{$ENDIF} ZendAPI, phpAPI, phpFunctions, @@ -464,7 +464,9 @@ procedure DoneVCLApplication; begin try VCL.Forms.Application.OnException := nil; + {$IFDEF WINDOWS} if VCL.Forms.Application.Handle <> 0 then ShowOwnedPopups(VCL.Forms.Application.Handle, False); + {$ELSE} VCL.Forms.Application.ShowHint := False; VCL.Forms.Application.Destroying; VCL.Forms.Application.DestroyComponents; diff --git a/Source/phpWeb.pas b/Source/phpWeb.pas index 52ce78d..ac4ab48 100644 --- a/Source/phpWeb.pas +++ b/Source/phpWeb.pas @@ -16,7 +16,7 @@ interface uses - Windows, ToolsAPI, Forms, Dialogs, SysUtils, Graphics, Classes, ShellAPI; + {$IFNDEF FPC} Windows{$ELSE} LCLType,LCLIntf,dynlibs,libc{$ENDIF}, ToolsAPI, Forms, Dialogs, SysUtils, Graphics, Classes, ShellAPI; type TphpWebWizard = class(TNotifierObject, IOTAWIzard, IOTAMenuWizard) diff --git a/Source/zend_dynamic_array.pas b/Source/zend_dynamic_array.pas index e58c4d8..99eec4d 100644 --- a/Source/zend_dynamic_array.pas +++ b/Source/zend_dynamic_array.pas @@ -15,7 +15,7 @@ interface uses - Windows, SysUtils, ZENDTypes; + SysUtils, ZENDTypes; type From 7fc2d877f1bb0e33685166a5997f2033e145423e Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Sun, 17 Mar 2019 16:54:27 +0200 Subject: [PATCH 23/54] Update PHP.INC --- Source/PHP.INC | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/PHP.INC b/Source/PHP.INC index 73c7da3..3135465 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -70,7 +70,7 @@ backward compatibility between PHP versions. {$DEFINE PHP530} {$DEFINE PHP540} {$DEFINE PHP550} - {$DEFINE PHP_UNICE} + {//$DEFINE PHP_UNICE} {$DEFINE ZEND_WIN32} {$DEFINE PHP_COMPILER_ID} {$ENDIF} @@ -213,3 +213,7 @@ backward compatibility between PHP versions. {$J+} {$WARNINGS OFF} {$ENDIF} + +{$IFDEF MSWINDOWS} +{$DEFINE WINDOWS} +{$ENDIF} From a94056c10f257c638e752b88e9c55fec53c4b70e Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Sun, 17 Mar 2019 16:57:06 +0200 Subject: [PATCH 24/54] Update ZendTypes.pas --- Source/ZendTypes.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index a0d2a8e..0053b9f 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -7,7 +7,7 @@ { serge_perevoznyk@hotmail.com } { http://users.telenet.be/ws36637 } {*******************************************************} -{$I 'PHP.inc'} +{$I PHP.inc} { $Id: ZendTypes.pas,v 7.4 10/2009 delphi32 Exp $ } From 007b9704b62a07018a00854c5a44a8eb65097aa7 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 21 May 2019 14:18:05 +0300 Subject: [PATCH 25/54] Small changes --- Source/ConverterBackup/php4DelphiR2010.dpk | 50 +++++++++++++++++++ .../Delphi Class 2/delphi_class2.dpr | 2 +- .../Extensions/skeleton/skeleton.dpr | 2 +- Source/Demos/Delphi4PHP/DesignIDE/d4pide.dpr | 2 +- .../Delphi Class 2/delphi_class2.dpr | 2 +- Source/Demos/Extensions/skeleton/skeleton.dpr | 2 +- Source/PHPProjectWizard.pas | 2 +- Source/ZendTypes.pas | 2 +- Source/php4DelphiR2010.lpk | 32 ++++++++++++ 9 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 Source/ConverterBackup/php4DelphiR2010.dpk create mode 100644 Source/php4DelphiR2010.lpk diff --git a/Source/ConverterBackup/php4DelphiR2010.dpk b/Source/ConverterBackup/php4DelphiR2010.dpk new file mode 100644 index 0000000..8ffc056 --- /dev/null +++ b/Source/ConverterBackup/php4DelphiR2010.dpk @@ -0,0 +1,50 @@ +package php4DelphiR2010; + +{$R *.res} +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (run-rime)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl; + +contains + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', + PHPLibrary in 'PHPLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + PHPCommon in 'PHPCommon.pas'; + +end. diff --git a/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr index b487c8b..1035333 100644 --- a/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr +++ b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr @@ -7,7 +7,7 @@ { http://users.telenet.be/ws36637 } {*******************************************************} -{$I php.inc} +{$I PHP.INC} library delphi_class2; diff --git a/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr index b768421..db76d9f 100644 --- a/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr +++ b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr @@ -9,7 +9,7 @@ { $Id: skeleton.dpr,v 7.4 10/2009 delphi32 Exp $ } -{$I php.inc} +{$I PHP.INC} library skeleton; diff --git a/Source/Demos/Delphi4PHP/DesignIDE/d4pide.dpr b/Source/Demos/Delphi4PHP/DesignIDE/d4pide.dpr index f8afdd2..aedcde9 100644 --- a/Source/Demos/Delphi4PHP/DesignIDE/d4pide.dpr +++ b/Source/Demos/Delphi4PHP/DesignIDE/d4pide.dpr @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{$I php.inc} +{$I PHP.INC} library d4pide; diff --git a/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr index bc1d2d8..6972d25 100644 --- a/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr +++ b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr @@ -7,7 +7,7 @@ { http://users.chello.be/ws36637 } {*******************************************************} -{$I php.inc} +{$I PHP.INC} library delphi_class2; diff --git a/Source/Demos/Extensions/skeleton/skeleton.dpr b/Source/Demos/Extensions/skeleton/skeleton.dpr index b2c3c91..e951a0c 100644 --- a/Source/Demos/Extensions/skeleton/skeleton.dpr +++ b/Source/Demos/Extensions/skeleton/skeleton.dpr @@ -10,7 +10,7 @@ { $Id: skeleton.dpr,v 7.4 10/2009 delphi32 Exp $ } -{$I php.inc} +{$I PHP.INC} library skeleton; diff --git a/Source/PHPProjectWizard.pas b/Source/PHPProjectWizard.pas index 37f4fac..4a281d1 100644 --- a/Source/PHPProjectWizard.pas +++ b/Source/PHPProjectWizard.pas @@ -10,7 +10,7 @@ {$I PHP.INC} { $Id: PHPProjectWizard.pas,v 7.4 10/2009 delphi32 Exp $ } -{$I PHP.inc} + unit PHPProjectWizard; interface diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index 0053b9f..ae23209 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -7,7 +7,7 @@ { serge_perevoznyk@hotmail.com } { http://users.telenet.be/ws36637 } {*******************************************************} -{$I PHP.inc} +{$I PHP.INC} { $Id: ZendTypes.pas,v 7.4 10/2009 delphi32 Exp $ } diff --git a/Source/php4DelphiR2010.lpk b/Source/php4DelphiR2010.lpk new file mode 100644 index 0000000..15061d0 --- /dev/null +++ b/Source/php4DelphiR2010.lpk @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 9814ac6ce79303e8a394095766068a548dc49ff0 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Sun, 26 May 2019 19:30:50 +0300 Subject: [PATCH 26/54] Some php7+ compat steps --- Source/AutomaticConversion.log | 1 + Source/DelphiFunctions.pas | 24 +- Source/PHP.INC | 14 +- Source/PHPAPI.pas | 24 +- Source/PHPFunctions.pas | 50 +- Source/PHPTypes.pas | 6 +- Source/ZENDAPI.pas | 770 +++++--- Source/ZendTypes.pas | 182 +- Source/hzend_types.pas | 3024 ++++++++++++++++++++++++++++++++ Source/php4delphi.pas | 20 +- 10 files changed, 3685 insertions(+), 430 deletions(-) create mode 100644 Source/AutomaticConversion.log create mode 100644 Source/hzend_types.pas diff --git a/Source/AutomaticConversion.log b/Source/AutomaticConversion.log new file mode 100644 index 0000000..e660758 --- /dev/null +++ b/Source/AutomaticConversion.log @@ -0,0 +1 @@ + Fatal: Перетворення перервано. diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index 3334287..03283df 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -17,7 +17,7 @@ interface uses SysUtils, Classes, Controls, - ZendTypes, ZendAPI, PHPTypes, PHPAPI, Dialogs, typinfo, + {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} ZendAPI, PHPTypes, PHPAPI, Dialogs, typinfo, Forms, stdctrls; {$ifdef fpc} @@ -29,14 +29,17 @@ interface author_class_entry : Tzend_class_entry; delphi_object_entry : TZend_class_entry; - object_functions : array[0..2] of zend_function_entry; - author_functions : array[0..2] of zend_function_entry; + object_functions : {$IFDEF PHP7}HashTable{$ELSE}array[0..2] of zend_function_entry{$ENDIF}; + author_functions : {$IFDEF PHP7}HashTable{$ELSE}array[0..2] of zend_function_entry{$ENDIF}; DelphiObject : pzend_class_entry; ce : pzend_class_entry; - - {$IFDEF PHP5} - DelphiObjectHandlers : zend_object_handlers; + {$IFDEF PHP7} + DelphiObjectHandlers : _zend_object_handlers; + {$ELSE} + {$IFDEF PHP5} + DelphiObjectHandlers : zend_object_handlers; + {$ENDIF} {$ENDIF} @@ -597,7 +600,7 @@ function delphi_call_method(method : zend_pchar; ht : integer; return_value : pz end; -function delphi_get_method(_object : pzval; method_name : zend_pchar; method_len : integer; TSRMLS_DC : pointer) : PzendFunction; cdecl; +function delphi_get_method(_object : pzval; method_name : zend_pchar; method_len : integer; TSRMLS_DC : pointer) : {$IFDEF PHP7}P_zend_function{$ELSE}PzendFunction{$ENDIF}; cdecl; begin @@ -688,6 +691,9 @@ procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr procedure RegisterInternalClasses(p : pointer); begin + {$IFDEF PHP7} + object_functions + {$ELSE} object_functions[0].fname := 'delphi_classname'; object_functions[0].handler := @delphi_object_classname; @@ -698,13 +704,13 @@ procedure RegisterInternalClasses(p : pointer); object_functions[2].handler := nil; INIT_CLASS_ENTRY(delphi_object_entry, 'delphi_class' , @object_functions); - + {$ENDIF} {$IFDEF PHP4} Delphi_Object_Entry.handle_property_get := @_delphi_get_property_wrapper; Delphi_Object_Entry.handle_property_set := @delphi_set_property_handler; Delphi_Object_Entry.handle_function_call := @delphi_call_function; {$ELSE} - Move(zend_get_std_object_handlers()^, DelphiObjectHandlers, sizeof(zend_object_handlers)); + Move(zend_get_std_object_handlers()^, DelphiObjectHandlers, sizeof({$IFDEF PHP7}_zend_object_handlers{$ELSE}zend_object_handlers{$ENDIF})); DelphiObjectHandlers.read_property := @delphi_get_property_handler; DelphiObjecthandlers.write_property := @delphi_set_property_handler; DelphiObjectHandlers.call_method := @delphi_call_method; diff --git a/Source/PHP.INC b/Source/PHP.INC index 3135465..12e4bf3 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -19,10 +19,11 @@ If you are using PHP version 5.1.0 or higher please add $DEFINE PHP510 If you are using PHP version 5.1.1 or higher please add $DEFINE PHP511 If you are using PHP version 5.1.2 or higher please add $DEFINE PHP512 If you are using PHP version 5.2.0 or higher please add $DEFINE PHP520 -IF you are using PHP version 5.3.0 or highre please add $DEFINE PHP530 -IF you are using PHP version 5.4.0 or highre please add $DEFINE PHP540 -IF you are using PHP version 5.5.0 or highre please add $DEFINE PHP550 -IF you are using PHP version 5.6.0 or highre please add $DEFINE PHP560 +IF you are using PHP version 5.3.0 or higher please add $DEFINE PHP530 +IF you are using PHP version 5.4.0 or higher please add $DEFINE PHP540 +IF you are using PHP version 5.5.0 or higher please add $DEFINE PHP550 +IF you are using PHP version 5.6.0 or higher please add $DEFINE PHP560 +IF you are using PHP cersion 7.0.0 or higher please add $DEFINE PHP700 If you are using PHP compiled via: id, define compiler_id VC9 COMPILER_VC9 @@ -57,14 +58,17 @@ backward compatibility between PHP versions. {$DEFINE PHP540} {$DEFINE PHP550} {$DEFINE PHP560} - {$IFDEF PHP530} {$DEFINE ZEND_WIN32} {$DEFINE PHP_COMPILER_ID} {$ENDIF} +{..$DEFINE soulengine_build} +{..$DEFINE PHP7} +{..$DEFINE P_CUT} {$IFDEF PHP7} {$DEFINE COMPILER_VC14} {$DEFINE PHP560} + {$DEFINE PHP700} {$ENDIF} {$IFDEF PHP560} {$DEFINE PHP530} diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index bc220cd..1a05ab5 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -29,7 +29,9 @@ interface Windows {$ENDIF}, - ZendTypes, PHPTypes, zendAPI, + ZendTypes, + {$IFDEF PHP7} hzend_types,{$ENDIF} + PHPTypes, zendAPI, {$IFDEF VERSION6}Variants{$ENDIF}{WinSock}; @@ -127,7 +129,7 @@ interface function GetSymbolsTable : PHashTable; -function GetTrackHash(Name : zend_ustr) : PHashTable; +function GetTrackHash(Name : zend_ustr) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; function GetSAPIGlobals : Psapi_globals_struct; overload; function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; //procedure phperror(Error : zend_pchar); @@ -174,9 +176,9 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; - +{$IFNDEF P_CUT} php_log_err: procedure (err_msg : zend_pchar; TSRMLS_DC : pointer); cdecl; - +{$ENDIF} php_html_puts: procedure (str : zend_pchar; str_len : integer; TSRMLS_DC : pointer); cdecl; _php_error_log: function (opt_err : integer; msg : zend_pchar; opt: zend_pchar; headers: zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; @@ -357,10 +359,10 @@ function GetSymbolsTable : PHashTable; {$ENDIF} -function GetTrackHash(Name : zend_ustr) : PHashTable; +function GetTrackHash(Name : zend_ustr) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; var data : ^ppzval; - arr : PHashTable; + arr : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; ret : integer; begin Result := nil; @@ -375,7 +377,7 @@ function GetTrackHash(Name : zend_ustr) : PHashTable; ret := zend_hash_find(arr, zend_pchar(Name), Length(Name)+1, Data); if ret = SUCCESS then begin - Result := data^^^.value.ht; + Result := {$IFDEF PHP7}data^^^.value.arr{$ELSE}data^^^.value.ht{$ENDIF}; end; end; end; @@ -427,7 +429,7 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; function zval2variant(value : zval) : variant; begin - case Value._type of + case {$IFDEF PHP7}Value.u1.v._type{$ELSE}Value._type{$ENDIF} of IS_NULL : Result := NULL; IS_LONG : Result := Value.value.lval; IS_DOUBLE : Result := Value.value.dval; @@ -756,9 +758,9 @@ function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; php_body_write := GetProcAddress(PHPLib, 'php_body_write'); php_header_write := GetProcAddress(PHPLib, 'php_header_write'); - + {$IFNDEF P_CUT} php_log_err := GetProcAddress(PHPLib, 'php_log_err'); - + {$ENDIF} php_html_puts := GetProcAddress(PHPLib, 'php_html_puts'); _php_error_log := GetProcAddress(PHPLib, '_php_error_log'); @@ -845,7 +847,9 @@ procedure CheckPHPErrors; if @php_register_variable_safe = nil then raise EPHP4DelphiException.Create('php_register_variable_safe'); if @php_register_variable_ex = nil then raise EPHP4DelphiException.Create('php_register_variable_ex'); if @php_strip_tags = nil then raise EPHP4DelphiException.Create('php_strip_tags'); + {$IFNDEF P_CUT} if @php_log_err = nil then raise EPHP4DelphiException.Create('php_log_err'); + {$ENDIF} if @php_html_puts = nil then raise EPHP4DelphiException.Create('php_html_puts'); if @_php_error_log = nil then raise EPHP4DelphiException.Create('_php_error_log'); if @php_print_credits = nil then raise EPHP4DelphiException.Create('php_print_credits'); diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index d8071cf..bf35afa 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -22,7 +22,9 @@ interface Windows, SysUtils, Classes, {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} {$IFDEF VERSION6} Variants, - {$ENDIF} ZendTypes, PHPTypes, ZendAPI, PHPAPI ; + {$ENDIF} + {$IFDEF PHP7} hzend_types, {$ENDIF} + ZendTypes, PHPTypes, ZendAPI, PHPAPI ; type TParamType = (tpString, tpInteger, tpFloat, tpBoolean, tpArray, tpUnknown); @@ -175,7 +177,7 @@ function IsParamTypeCorrect(AParamType : TParamType; z : Pzval) : boolean; var ZType : integer; begin - ZType := Z^._type; + ZType := {$IFDEF PHP7}Z^.u1.v._type{$ELSE} Z^._type{$ENDIF}; case AParamType Of tpString : Result := (ztype in [IS_STRING, IS_NULL]); tpInteger : Result := (ztype in [IS_LONG, IS_BOOL, IS_NULL, IS_RESOURCE]); @@ -389,30 +391,16 @@ procedure TFunctionParams.SetItem(Index: Integer; Value: TFunctionParam); procedure TFunctionParams.SetItemName(Item: TCollectionItem); var I, J: Integer; - ItemName: string; CurItem: TFunctionParam; begin J := 1; - while True do + CurItem := ParamByName('Param1'); + while (CurItem <> nil) and (CurItem <> Item) do begin - ItemName := Format('Param%d', [J]); - I := 0; - while I < Count do - begin - CurItem := Items[I] as TFunctionParam; - if (CurItem <> Item) and (CompareText(CurItem.Name, ItemName) = 0) then - begin - Inc(J); - Break; - end; - Inc(I); - end; - if I >= Count then - begin - (Item as TFunctionParam).Name := ItemName; - Break; - end; + inc(J); + CurItem := ParamByName('Param' + inttostr(J)); end; + (Item as TFunctionParam).Name := 'Param' + inttostr(J); end; function TFunctionParams.Values(AName: string): Variant; @@ -522,7 +510,7 @@ function TZendVariable.GetAsBoolean: boolean; Exit; end; - case FValue^._type of + case{$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_STRING : begin if SameText(GetAsString, 'True') then @@ -545,7 +533,7 @@ function TZendVariable.GetAsDate: TDateTime; Exit; end; - case FValue^._type of + case{$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_STRING : Result := StrToDate(GetAsString); IS_DOUBLE : Result := FValue^.value.dval; else @@ -561,7 +549,7 @@ function TZendVariable.GetAsDateTime: TDateTime; Exit; end; - case FValue^._type of + case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_STRING : Result := StrToDateTime(GetAsString); IS_DOUBLE : Result := FValue^.value.dval; else @@ -585,7 +573,7 @@ function TZendVariable.GetAsFloat: double; Exit; end; - case FValue^._type of + case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_STRING : Result := StrToFloatDef(GetAsString,0.0); IS_DOUBLE : Result := FValue^.value.dval; else @@ -601,7 +589,7 @@ function TZendVariable.GetAsInteger: integer; Exit; end; - case FValue^._type of + case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_STRING : result := StrToIntDef(GetAsString, 0); IS_DOUBLE : result := Round(FValue^.value.dval); IS_NULL : result := 0; @@ -621,7 +609,7 @@ function TZendVariable.GetAsString: zend_ustr; Exit; end; - case FValue^._type of + case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_STRING : begin try SetLength(Result, FValue^.value.str.len); @@ -654,7 +642,7 @@ function TZendVariable.GetAsTime: TDateTime; Exit; end; - case FValue^._type of + case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_STRING : Result := StrToTime(GetAsString); IS_DOUBLE : Result := FValue^.value.dval; else @@ -681,7 +669,7 @@ function TZendVariable.GetDataType: integer; Exit; end; - Result := FValue^._type; + Result := {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF}; end; function TZendVariable.GetIsNull: boolean; @@ -691,7 +679,7 @@ function TZendVariable.GetIsNull: boolean; Result := true; Exit; end; - Result := FValue^._type = IS_NULL; + Result := {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} = IS_NULL; end; function TZendVariable.GetTypeName: string; @@ -702,7 +690,7 @@ function TZendVariable.GetTypeName: string; Exit; end; - case FValue^._type of + case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_NULL: result := 'null'; IS_LONG: result := 'integer'; IS_DOUBLE: result := 'double'; diff --git a/Source/PHPTypes.pas b/Source/PHPTypes.pas index 0f788f4..6b80fd4 100644 --- a/Source/PHPTypes.pas +++ b/Source/PHPTypes.pas @@ -16,7 +16,7 @@ interface uses - {$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, ZENDTypes; + {$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7}hzend_types,{$ENDIF} ZENDTypes; {$IFDEF PHP4} const @@ -240,7 +240,7 @@ interface sapi_started : zend_bool; {$IFDEF PHP510} global_request_time : longint; - known_post_content_types : THashTable; + known_post_content_types : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; {$ENDIF} {$ENDIF} end; @@ -387,7 +387,7 @@ interface arg_separator : arg_separators; gpc_order : zend_pchar; variables_order : zend_pchar; - rfc1867_protected_variables : THashTable; + rfc1867_protected_variables : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; connection_status : Smallint; ignore_user_abort : Smallint; header_is_being_sent : Byte; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index e614614..3702676 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -21,6 +21,7 @@ interface uses {$IFNDEF FPC} Windows{$ELSE} LCLType,LCLIntf,dynlibs,libc{$ENDIF}, SysUtils, + {$IFDEF PHP7} hzend_types, {$ENDIF} ZendTypes, Variants, PHPTypes; type @@ -33,7 +34,7 @@ interface PHPWin = {$IFDEF PHP_DEBUG} {$IFDEF PHP7} - 'php7phpdbg.dll' + 'php7ts_debug.dll' {$ELSE} {$IFDEF PHP5} 'php5ts_debug.dll' @@ -144,18 +145,19 @@ function STR_EMPTY_ALLOC : zend_pchar; nKeyLength: uint; pData: Pointer; nDataSize: uint; pDest: Pointer; flag: Integer): Integer; cdecl; {$ELSE} +{$IFNDEF PHP7} var - _zend_hash_add_or_update : function (ht : PHashTable; arKey : zend_pchar; + _zend_hash_add_or_update : function (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; flag : integer; __zend_filename: zend_pchar; __zend_lineno: uint) : integer; cdecl; - - function zend_hash_add_or_update(ht : PHashTable; arKey : zend_pchar; - nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; +{$ENDIF} + function zend_hash_add_or_update(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey : zend_pchar; + nKeyLength : uint; pData : {$IFDEF PHP7}pzval{$ELSE}pointer{$ENDIF}; nDataSize : uint; pDes : pointer; flag : integer) : integer; cdecl; {$ENDIF} -function zend_hash_add(ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; +function zend_hash_add(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; var {$IFDEF PHP4} @@ -180,21 +182,25 @@ function zend_hash_add(ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; p {$ELSE} - _zend_hash_init : function (ht : PHashTable; nSize : uint; + _zend_hash_init : function (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool; __zend_filename: zend_pchar; __zend_lineno: uint) : integer; cdecl; - _zend_hash_init_ex : function (ht : PHashTable; nSize : uint; + _zend_hash_init_ex : function (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent : zend_bool; bApplyProtection : zend_bool; __zend_filename: zend_pchar; __zend_lineno: uint): integer; cdecl; - function zend_hash_init (ht : PHashTable; nSize : uint; pHashFunction : pointer; + function zend_hash_init (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool) : integer; cdecl; - function zend_hash_init_ex (ht : PHashTable; nSize : uint; pHashFunction : pointer; + function zend_hash_init_ex (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent : zend_bool; bApplyProtection : zend_bool): integer; cdecl; {$ENDIF} - + {$IFDEF PHP7} + function zend_hash_num_elements(ht: Pzend_array): integer; + function add_char_to_string (_result: Pzval; op1: Pzval; op2: Pzval): Integer; + function add_string_to_string(_result: Pzval; op1: Pzval; op2: Pzval): Integer; + {$ENDIF} var zend_hash_destroy : procedure(ht: PHashTable); cdecl; zend_hash_clean : procedure(ht: PHashTable); cdecl; @@ -226,77 +232,85 @@ function zend_hash_add(ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; p * the standard apply functions do. } - zend_hash_reverse_apply : procedure(ht: PHashTable; + zend_hash_reverse_apply : procedure(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; apply_func: pointer; TSRMLS_DC: Pointer); cdecl; { Deletes } - zend_hash_del_key_or_index : function(ht: PHashTable; arKey: zend_pchar; + {$IFDEF PHP7} + zend_hash_del_key_or_index : function(ht: Pzend_array; key:Pzend_string):longint; cdecl; + {$ELSE} + zend_hash_del_key_or_index : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; h: ulong; flag: Integer): Integer; cdecl; - - zend_get_hash_value : function(ht: PHashTable; arKey: zend_pchar; + {$ENDIF} + zend_get_hash_value : function(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; arKey: zend_pchar; nKeyLength: uint): Longint; cdecl; { Data retreival } - zend_hash_find : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; + zend_hash_find : function(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; arKey: zend_pchar; nKeyLength: uint; pData: Pointer): Integer; cdecl; - zend_hash_quick_find : function(ht: PHashTable; arKey: zend_pchar; + zend_hash_quick_find : function(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; arKey: zend_pchar; nKeyLength: uint; h: ulong; pData: Pointer): Integer; cdecl; - zend_hash_index_find : function(ht: PHashTable; h: ulong; pData: Pointer): Integer; cdecl; + zend_hash_index_find : function(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; h: ulong; pData: Pointer): Integer; cdecl; { Misc } - zend_hash_exists : function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint): Integer; cdecl; - - zend_hash_index_exists : function(ht: PHashTable; h: ulong): Integer; cdecl; - - zend_hash_next_free_element : function(ht: PHashTable): Longint; cdecl; + zend_hash_exists : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey: zend_pchar; nKeyLength: uint): Integer; cdecl; + zend_hash_index_exists : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; h: ulong): Integer; cdecl; + {$IFNDEF PHP7} + zend_hash_next_free_element : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}): Longint; cdecl; + {$ENDIF} { traversing } - zend_hash_move_forward_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; + zend_hash_move_forward_ex : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; pos: HashPosition): Integer; cdecl; - zend_hash_move_backwards_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; + zend_hash_move_backwards_ex : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; pos: HashPosition): Integer; cdecl; - zend_hash_get_current_key_ex : function(ht: PHashTable; + zend_hash_get_current_key_ex : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; var str_index: zend_pchar; var str_length: uint; var num_index: ulong; duplicate: boolean; pos: HashPosition): Integer; cdecl; - zend_hash_get_current_key_type_ex : function(ht: PHashTable; pos: HashPosition): Integer; cdecl; + zend_hash_get_current_key_type_ex : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; pos: HashPosition): Integer; cdecl; - zend_hash_get_current_data_ex : function(ht: PHashTable; pData: Pointer; pos: HashPosition): Integer; cdecl; + zend_hash_get_current_data_ex : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; pData: Pointer; pos: HashPosition): Integer; cdecl; - zend_hash_internal_pointer_reset_ex : procedure(ht: PHashTable; pos: HashPosition); cdecl; + zend_hash_internal_pointer_reset_ex : procedure(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; pos: HashPosition); cdecl; - zend_hash_internal_pointer_end_ex : procedure(ht: PHashTable; pos: HashPosition); cdecl; + zend_hash_internal_pointer_end_ex : procedure(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; pos: HashPosition); cdecl; { Copying, merging and sorting } - zend_hash_copy : procedure(target: PHashTable; source: PHashTable; + zend_hash_copy : procedure(target: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; source: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; pCopyConstructor: pointer; tmp: Pointer; size: uint); cdecl; - zend_hash_sort : function(ht: PHashTable; sort_func: pointer; + zend_hash_sort : + {$IFDEF PHP7} + function(ht:PZend_array; sort_func:sort_func_t; compare_func:compare_func_t; renumber:zend_bool):longint; cdecl; + {$ELSE} + function(ht: PHashTable; sort_func: pointer; compare_func: pointer; renumber: Integer; TSRMLS_DC: Pointer): Integer; cdecl; + {$ENDIF} - zend_hash_compare : function(ht1: PHashTable; ht2: PHashTable; + zend_hash_compare : function(ht1: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; ht2: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; compar: pointer; ordered: boolean; TSRMLS_DC: Pointer): Integer; cdecl; - zend_hash_minmax : function(ht: PHashTable; compar: pointer; + zend_hash_minmax : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; compar: pointer; flag: Integer; pData: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; - - zend_hash_num_elements : function(ht: PHashTable): Integer; cdecl; - - zend_hash_rehash : function(ht: PHashTable): Integer; cdecl; + {$IFNDEF PHP7} + zend_hash_num_elements : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}): Integer; cdecl; + {$ENDIF} + zend_hash_rehash : function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}): Integer; cdecl; zend_hash_func : function(arKey: zend_pchar; nKeyLength: uint): Longint; cdecl; -function zend_hash_get_current_data(ht: PHashTable; pData: Pointer): Integer; cdecl; -procedure zend_hash_internal_pointer_reset(ht: PHashTable); cdecl; +function zend_hash_get_current_data(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; pData: Pointer): Integer; cdecl; +procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}); cdecl; var @@ -463,11 +477,11 @@ procedure convert_to_string(op: pzval); convert_to_array : procedure(op: Pzval); cdecl; convert_to_object : procedure(op: Pzval); cdecl; - + {$IFNDEF PHP7} add_char_to_string : function(_result: Pzval; op1: Pzval; op2: Pzval): Integer; cdecl; add_string_to_string : function(_result: Pzval; op1: Pzval; op2: Pzval): Integer; cdecl; - + {$ENDIF} zend_string_to_double : function(number: zend_pchar; length: zend_uint): Double; cdecl; zval_is_true : function(op: Pzval): Integer; cdecl; @@ -532,20 +546,22 @@ procedure convert_to_string(op: pzval); zend_html_putc : procedure(c: zend_uchar); cdecl; zend_html_puts : procedure(s: zend_pchar; len: uint; TSRMLS_DC: Pointer); cdecl; - + {$IFDEF PHP7} + zend_parse_parameters_throw : function(num_args:longint; type_spec:PAnsiChar):longint; cdecl varargs; + {$ELSE} zend_indent : procedure; cdecl; - + {$ENDIF} ZendGetParameters : function: integer; cdecl; zend_get_params_ex : function(param_count : Integer; Args : {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) :integer; cdecl varargs; function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; function zend_get_parameters(ht: integer; param_count: integer; Params: array of -{$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}): integer; +ppzval): integer; var _zend_get_parameters_array_ex : function(param_count: integer; argument_array: - {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}; TSRMLS_CC: pointer): integer; cdecl; + pppzval; TSRMLS_CC: pointer): integer; cdecl; procedure dispose_pzval_array(Params: pzval_array); @@ -572,7 +588,7 @@ procedure dispose_pzval_array(Params: pzval_array); execute : procedure(op_array: pointer; TSRMLS_DC: Pointer); cdecl; zend_wrong_param_count : procedure(TSRMLS_D: pointer); cdecl; - _zend_hash_quick_add_or_update:function(ht: PHashTable; arKey: zend_pchar; nKeyLength: uint; h: uint; out pData: pzval; nDataSize: uint; pDest: PPointer; flag: Integer) : Integer; cdecl; + _zend_hash_quick_add_or_update:function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey: zend_pchar; nKeyLength: uint; h: uint; out pData: pzval; nDataSize: uint; pDest: PPointer; flag: Integer) : Integer; cdecl; {$IFDEF PHP4} add_property_long_ex : function(arg: pzval; key: zend_pchar; key_len: uint; l: longint): integer; cdecl; {$ELSE} @@ -597,8 +613,10 @@ procedure dispose_pzval_array(Params: pzval_array); add_property_zval_ex : function(arg: pzval; key: zend_pchar; key_len: uint; value: pzval; TSRMLS_DC: Pointer): integer; cdecl; {$ENDIF} - - call_user_function : function(function_table: PHashTable; object_pp: pzval; + {$IFDEF P_CUT} + call_user_function : procedure(func:pzval; argv:pzval; argc:integer);cdecl; + {$ELSE} + call_user_function : function(function_table: PHashTable; object_pp: pzval; function_name: pzval; return_ptr: pzval; param_count: zend_uint; params: pzval_array_ex; TSRMLS_DC: Pointer): integer; cdecl; @@ -607,8 +625,8 @@ procedure dispose_pzval_array(Params: pzval_array); params: pzval_array; no_separation: zend_uint; symbol_table: PHashTable; TSRMLS_DC: Pointer): integer; cdecl; - -{ + {$ENDIF} + { call_user_function_ex(HashTable *function_table, zval **object_pp, zval *function_name, @@ -748,15 +766,16 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array o procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overload; procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of string); overload; -procedure HashToArray(HT: PHashTable; var AR: TArrayVariant); overload; +procedure HashToArray(HT: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; var AR: TArrayVariant); overload; procedure ArrayToHash(AR: Array of Variant; var HT: pzval); overload; procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; function ToStrA(V: Variant): zend_ustr; function ToStr(V: Variant): String; function toWChar(s: zend_pchar): PWideChar; -function ZendToVariant(const Value: {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}): Variant; overload; -function ZendToVariant(const Value: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}): Variant; overload; - +{$IFNDEF PHP7} +function ZendToVariant(const Value: pppzval): Variant; overload; +function ZendToVariant(const Value: ppzval): Variant; overload; +{$ENDIF} procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); @@ -764,7 +783,8 @@ procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); procedure ZVAL_STRINGL(z: pzval; s: zend_pchar; l: integer; duplicate: boolean); procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); -procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: zend_pchar; functions: pointer); +procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: zend_pchar; functions: +{$IFDEF PHP7}HashTable{$ELSE}pointer{$ENDIF}); var @@ -776,12 +796,12 @@ procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: z {$IFDEF PHP5} zend_copy_constants: procedure(target: PHashTable; source: PHashTable); cdecl; - zend_objects_new : function (_object : pointer; class_type : pointer; TSRMLS_DC : pointer) : _zend_object_value; cdecl; - zend_objects_clone_obj: function(_object: pzval; TSRMLS_DC : pointer): _zend_object_value; cdecl; + zend_objects_new : function (_object : pointer; class_type : pointer; TSRMLS_DC : pointer) : {$IFDEF PHP7}zend_object{$ELSE}_zend_object_value{$ENDIF}; cdecl; + zend_objects_clone_obj: function(_object: pzval; TSRMLS_DC : pointer): {$IFDEF PHP7}zend_object{$ELSE}_zend_object_value{$ENDIF}; cdecl; zend_objects_store_add_ref: procedure (_object : pzval; TSRMLS_DC : pointer); cdecl; zend_objects_store_del_ref: procedure (_object : pzval; TSRMLS_DC : pointer); cdecl; - function_add_ref: procedure (func: PZendFunction); cdecl; + function_add_ref: procedure (func: {$IFDEF PHP7}Pzend_function{$ELSE}PZendFunction{$ENDIF}); cdecl; zend_class_add_ref: procedure(aclass: Ppzend_class_entry); cdecl; @@ -830,13 +850,13 @@ function GetCompilerGlobals : Pzend_compiler_globals; function GetExecutorGlobals : pzend_executor_globals; function GetAllocGlobals : pointer; -function zend_register_functions(functions : pzend_function_entry; function_table : PHashTable; _type: integer; TSRMLS_DC : pointer) : integer; -function zend_unregister_functions(functions : pzend_function_entry; count : integer; function_table : PHashTable; TSRMLS_DC : pointer) : integer; +function zend_register_functions(functions : {$IFDEF PHP7}P_zend_function_entry{$ELSE}pzend_function_entry{$ENDIF}; function_table : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; _type: integer; TSRMLS_DC : pointer) : integer; +function zend_unregister_functions(functions : {$IFDEF PHP7}P_zend_function_entry{$ELSE}pzend_function_entry{$ENDIF}; count : integer; function_table : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; TSRMLS_DC : pointer) : integer; {$IFDEF PHP5} var - zend_get_std_object_handlers : function() : pzend_object_handlers; + zend_get_std_object_handlers : function() : {$IFDEF PHP7}P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF}; zend_objects_get_address : function (_object : pzval; TSRMLS_DC : pointer) : pzend_object; cdecl; zend_is_true : function(z : pzval) : integer; cdecl; @@ -849,10 +869,10 @@ function Z_STRVAL(z : Pzval) : zend_ustr; function Z_STRUVAL(z : PZval): UTF8String; function Z_STRWVAL(z : pzval) : String; function Z_STRLEN(z : Pzval) : longint; -function Z_ARRVAL(z : Pzval ) : PHashTable; +function Z_ARRVAL(z : Pzval ) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; function Z_OBJ_HANDLE(z :Pzval) : zend_object_handle; -function Z_OBJ_HT(z : Pzval) : pzend_object_handlers; -function Z_OBJPROP(z : Pzval) : PHashtable; +function Z_OBJ_HT(z : Pzval) : {$IFDEF PHP7}hzend_types.P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF}; +function Z_OBJPROP(z : Pzval) : {$IFDEF PHP7}hzend_types.PHashTable{$ELSE}PHashTable{$ENDIF}; function Z_VARREC(z: pzval): TVarRec; procedure zend_addref_p(z: pzval); cdecl; @@ -865,11 +885,32 @@ function Z_VARREC(z: pzval): TVarRec; implementation -function zend_hash_add(ht : PHashTable; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; +function zend_hash_add(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; begin result := zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDest, HASH_ADD); end; +{$IFDEF PHP7} +function zend_hash_num_elements(ht: Pzend_array): integer; + begin + Result := integer(ht.nNumOfElements); + end; +function add_char_to_string (_result: Pzval; op1: Pzval; op2: Pzval): Integer; +Begin + Result := -1; + if op1.u1.v._type = IS_STRING then + begin + _result.value.str.len := op1.value.str.len + op2.value.str.len; + _result.value.str.val := zend_pchar(zend_ustr(op1.value.str.val) + zend_ustr(op2.value.str.val)); + Result := SUCCESS; + end; +End; +function add_string_to_string(_result: Pzval; op1: Pzval; op2: Pzval): Integer; +begin + Result := add_char_to_string(_result, op1, op2); +end; +{$ENDIF} + function STR_EMPTY_ALLOC : zend_pchar; begin Result := estrndup('', 0); @@ -942,37 +983,61 @@ procedure REGISTER_MAIN_STRINGL_CONSTANT(name: zend_pchar; str: zend_pchar; len: procedure ZVAL_RESOURCE(value: pzval; l: longint); begin - value^._type := IS_RESOURCE; + {$IFDEF PHP7} + value^.u1.v._type + {$ELSE} + value^._type + {$ENDIF} := IS_RESOURCE; value^.value.lval := l; end; procedure ZVAL_BOOL(z: pzval; b: boolean); begin - z^._type := IS_BOOL; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_BOOL; z^.value.lval := integer(b); end; procedure ZVAL_NULL(z: pzval); begin - z^._type := IS_NULL; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_NULL; end; procedure ZVAL_LONG(z: pzval; l: longint); begin - z^._type := IS_LONG; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_LONG; z^.value.lval := l; end; procedure ZVAL_DOUBLE(z: pzval; d: double); begin - z^._type := IS_DOUBLE; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_DOUBLE; z^.value.dval := d; end; procedure ZvalString(z:pzval); begin z^.value.str.len := 0; z^.value.str.val := ''; - z^._type := IS_STRING; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_STRING; end; procedure ZvalString(z:pzval; s:zend_pchar; len:Integer = 0); @@ -989,7 +1054,11 @@ procedure ZvalString(z:pzval; s:zend_pchar; len:Integer = 0); z^.value.str.len := lens; z^.value.str.val := estrndup(s, lens); - z^._type := IS_STRING; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_STRING; end; end; @@ -1044,24 +1113,40 @@ function ZvalStrW; procedure ZvalVAL(z:pzval; v:Boolean); Begin - z._type := IS_BOOL; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_BOOL; z.value.lval := integer(v); End; procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); Begin - z._type := _type; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := _type; z.value.lval := v; End; procedure ZvalVAL(z:pzval); Begin - z._type := IS_NULL; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_NULL; End; procedure ZvalVAL(z:pzval; v:Double); Begin - z._type := IS_LONG; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_LONG; z.value.dval := v; End; procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); @@ -1082,7 +1167,11 @@ procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); z^.value.str.len := lens; z^.value.str.val := _estrndup(AChar, lens, nil, 0, nil, 0); - z^._type := IS_STRING; + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_STRING; end; end; @@ -1093,7 +1182,11 @@ function AddElementZvalArray(z: pzval; Args: array of const; flag: Integer; arKey: zend_pchar; begin Result := FAILURE; - if z._type <> IS_ARRAY then + if {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} <> IS_ARRAY then exit; if len <> 0 then @@ -1104,17 +1197,23 @@ function AddElementZvalArray(z: pzval; Args: array of const; flag: Integer; end; tmp := GetArgPZval(Args[0], 1, true); - Result := _zend_hash_quick_add_or_update(z.value.ht, arKey, len, idx, tmp, + + Result := _zend_hash_quick_add_or_update( + {$IFDEF PHP7}z.value.arr{$ELSE}z.value.ht{$ENDIF}, arKey, len, idx, tmp, sizeof(pzval), nil, flag); end; // Add Next function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; begin Result := FAILURE; - if z._type <> IS_ARRAY then + if {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} <> IS_ARRAY then exit; Result := AddElementZvalArray(z, Args, HASH_NEXT_INSERT, - z.value.ht.nNextFreeElement); + {$IFDEF PHP7} z.value.arr.nNextFreeElement {$ELSE} z.value.ht.nNextFreeElement {$ENDIF}); end; // Add Index @@ -1133,37 +1232,45 @@ function ZvalArrayAdd(z: pzval; key: zend_ustr; Args: array of const) function IsArrayRetVal(v: pzval): Boolean; begin - Result := v._type = IS_ARRAY; + Result := {$IFDEF PHP7} + v^.u1.v._type + {$ELSE} + v^._type + {$ENDIF} = IS_ARRAY; end; function ZValArrayKeyExists(v: pzval; key: zend_ustr): Boolean; overload; begin Result := false; - if v._type <> IS_ARRAY then + if {$IFDEF PHP7} + v^.u1.v._type + {$ELSE} + v^._type + {$ENDIF} <> IS_ARRAY then exit; - if v.value.ht.nNumOfElements = 0 then + if {$IFDEF PHP7} v.value.arr.nNumOfElements {$ELSE} v.value.ht.nNumOfElements {$ENDIF} = 0 then exit; - Result := zend_hash_exists(v.value.ht, zend_pchar(key), Length(key) + 1) = 1; + Result := zend_hash_exists({$IFDEF PHP7}v.value.arr{$ELSE}v.value.ht{$ENDIF}, zend_pchar(key), Length(key) + 1) = 1; end; function ZValArrayKeyExists(v: pzval; idx: Integer): Boolean; overload; begin Result := false; - if (v._type <> IS_ARRAY) then + if ({$IFDEF PHP7} v.u1.v._type {$ELSE} v._type {$ENDIF} <> IS_ARRAY) then exit; - if v.value.ht.nNumOfElements = 0 then + if {$IFDEF PHP7} v.value.arr.nNumOfElements {$ELSE} v.value.ht.nNumOfElements {$ENDIF} = 0 then exit; - Result := zend_hash_index_exists(v.value.ht, idx) = 1; + Result := zend_hash_index_exists({$IFDEF PHP7}v.value.arr{$ELSE}v.value.ht{$ENDIF}, idx) = 1; end; function ZValArrayKeyExists(v: pzval; key: zend_ustr; out pData: pzval) : Boolean; overload; var - tmp: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; + tmp: ppzval; begin Result := ZValArrayKeyExists(v, key); if Result then @@ -1177,7 +1284,7 @@ function ZValArrayKeyExists(v: pzval; key: zend_ustr; out pData: pzval) function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) : Boolean; overload; var - tmp: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}; + tmp: ppzval; begin Result := ZValArrayKeyExists(v, idx); if Result then @@ -1189,22 +1296,46 @@ function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) end; function ZValArrayKeyDel(v: pzval; key: zend_ustr): Boolean; overload; +{$IFDEF PHP7} +var + pzs: pzend_string; +{$ENDIF} begin Result := false; if ZValArrayKeyExists(v, key) then + {$IFDEF PHP7} + begin + pzs^.len := strlen(zend_pchar(key)); + pzs^.val := zend_pchar(key); + Result := zend_hash_del_key_or_index(v.value.arr, pzs) = SUCCESS + end; + {$ELSE} Result := zend_hash_del_key_or_index(v.value.ht, zend_pchar(key), Length(key) + 1, 0, HASH_DEL_KEY) = SUCCESS; + {$ENDIF} end; function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; +{$IFDEF PHP7} +var + pzs: pzend_string; +{$ENDIF} begin Result := false; if ZValArrayKeyExists(v, idx) then - Result := zend_hash_del_key_or_index(v.value.ht, nil, 0, idx, + {$IFDEF PHP7} + begin + pzs^.len := strlen(zend_pchar(inttostr(idx))); + pzs^.val := zend_pchar(inttostr(idx)); + Result := zend_hash_del_key_or_index(v.value.arr, pzs) = SUCCESS + end; + {$ELSE} + Result := zend_hash_del_key_or_index({$IFDEF PHP7}v.value.arr{$ELSE}v.value.ht{$ENDIF}, nil, 0, idx, HASH_DEL_INDEX) = SUCCESS; + {$ENDIF} end; -function ZValArrayKeyFind(v: pzval; key: zend_ustr; out pData: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) +function ZValArrayKeyFind(v: pzval; key: zend_ustr; out pData: ppzval) : Boolean; overload; var keyStr: zend_pchar; @@ -1213,14 +1344,14 @@ function ZValArrayKeyFind(v: pzval; key: zend_ustr; out pData: {$IFNDEF PHP700} keyStr := zend_pchar(key); KeyLength := Length(key) + 1; - Result := zend_hash_quick_find(v.value.ht, keyStr, KeyLength, + Result := zend_hash_quick_find({$IFDEF PHP7}v.value.arr{$ELSE}v.value.ht{$ENDIF}, keyStr, KeyLength, zend_hash_func(keyStr, KeyLength), pData) = SUCCESS; end; -function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) +function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) : Boolean; overload; begin - Result := zend_hash_quick_find(v.value.ht, nil, 0, idx, pData) = SUCCESS; + Result := zend_hash_quick_find({$IFDEF PHP7}v.value.arr{$ELSE}v.value.ht{$ENDIF}, nil, 0, idx, pData) = SUCCESS; end; procedure MAKE_STD_ZVAL(out Result: pzval); begin @@ -1238,7 +1369,7 @@ function GetArgPZval; begin if Make then MAKE_STD_ZVAL(Result); - Result._type := IS_NULL; + {$IFDEF PHP7} Result.u1.v._type {$ELSE} Result._type {$ENDIF} := IS_NULL; end else if Args.VType = vtPointer then Result := Args.VPointer @@ -1293,7 +1424,7 @@ procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); z^.value.str.val := estrndup(__s, z^.value.str.len) else z^.value.str.val := __s; - z^._type := IS_STRING; + {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; end; procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); @@ -1311,7 +1442,7 @@ procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); z^.value.str.val := estrndup(__s, z^.value.str.len) else z^.value.str.val := __s; - z^._type := IS_STRING; + {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; end; procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); @@ -1335,7 +1466,7 @@ procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); z^.value.str.val := estrndup(__s, z^.value.str.len) else z^.value.str.val := __s; - z^._type := IS_STRING; + {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; end; procedure ZVAL_STRINGL(z: pzval; s: zend_pchar; l: integer; duplicate: boolean); @@ -1353,7 +1484,7 @@ procedure ZVAL_STRINGL(z: pzval; s: zend_pchar; l: integer; duplicate: boolean); z^.value.str.val := estrndup(__s, __l) else z^.value.str.val := __s; - z^._type := IS_STRING; + {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; end; procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); @@ -1378,7 +1509,7 @@ procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); z^.value.str.val := estrndup(__s, __l) else z^.value.str.val := __s; - z^._type := IS_STRING; + {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; end; procedure ZVAL_EMPTY_STRING(z: pzval); @@ -1389,18 +1520,18 @@ procedure ZVAL_EMPTY_STRING(z: pzval); (*{$ELSE} z^.value.str.val := ''; {$ENDIF}*) - z^._type := IS_STRING; + {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; end; procedure ZVAL_TRUE(z: pzval); begin - z^._type := IS_BOOL; + {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_BOOL; z^.value.lval := 1; end; procedure ZVAL_FALSE(z: pzval); begin - z^._type := IS_BOOL; + {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_BOOL; z^.value.lval := 0; end; function ToStrA(V: Variant): zend_ustr; @@ -1428,11 +1559,11 @@ function toWChar(s: zend_pchar): PWideChar; Result := PWideChar(ss); end; -function ZendToVariant(const Value: {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}): Variant; overload; +function ZendToVariant(const Value: pppzval): Variant; overload; Var S: String; begin - case Value^^^._type of + case {$IFDEF PHP7} Value^^^.u1.v._type {$ELSE}Value^^^._type{$ENDIF} of 1: Result := Value^^^.value.lval; 2: Result := Value^^^.value.dval; 6: begin S := Value^^^.value.str.val; Result := S; end; @@ -1440,12 +1571,12 @@ function ZendToVariant(const Value: {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDI end; end; -function ZendToVariant(const Value: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}): Variant; overload; +function ZendToVariant(const Value: ppzval): Variant; overload; Var S: String; begin Result := Null; - case Value^^._type of + case {$IFDEF PHP7} Value^^.u1.v._type {$ELSE}Value^^._type{$ENDIF} of 1: Result := Value^^.value.lval; 2: Result := Value^^.value.dval; 6: begin S := Value^^.value.str.val; Result := S; end; @@ -1453,10 +1584,10 @@ function ZendToVariant(const Value: {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF end; end; -procedure HashToArray(HT: PHashTable; var AR: TArrayVariant); overload; +procedure HashToArray(HT: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; var AR: TArrayVariant); overload; Var Len,I: Integer; - tmp : {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}; + tmp : pppzval; begin len := zend_hash_num_elements(HT); SetLength(AR,len); @@ -1588,7 +1719,11 @@ procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; if Length(arr) = 0 then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1611,7 +1746,11 @@ procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; if Length(arr) = 0 then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1634,7 +1773,11 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; if Length(arr) = 0 then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1657,7 +1800,11 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of zend_ustr); overload; if Length(arr) = 0 then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1680,7 +1827,11 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; if Length(arr) = 0 then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1702,7 +1853,11 @@ procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; if Length(arr) = 0 then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1716,7 +1871,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; var i: integer; - V: TVarData; + {V: TVarData;} begin if _array_init(z, nil, 0) = FAILURE then // begin @@ -1794,7 +1949,11 @@ procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of ansichar; keyvals: Array of if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1820,7 +1979,11 @@ procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1851,7 +2014,11 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overloa //z^.refcount := Length(keynames); // if (Length(keynames) = 0) then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1887,7 +2054,11 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1919,7 +2090,11 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -1950,7 +2125,11 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array o if (Length(keynames) = 0)and(Length(keynames) = Length(keyvals)) then begin - z^.refcount := 1; + {$IFDEF PHP7} + z^.value.counted.gc.refcount + {$ELSE} + z^.refcount + {$ENDIF} := 1; Exit; end; @@ -2154,97 +2333,108 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; zend_hash_add_or_update := GetProcAddress(PHPLib, 'zend_hash_add_or_update'); {$ELSE} // -- zend_hash_add_or_update - _zend_hash_add_or_update := GetProcAddress(PHPLib, '_zend_hash_add_or_update'); + _zend_hash_add_or_update := GetProcAddress(PHPLib, + {$IFDEF PHP7}'_zend_hash_add_or_update@@16'{$ELSE}'_zend_hash_add_or_update'{$ENDIF}); {$ENDIF} // -- zend_hash_destroy - zend_hash_destroy := GetProcAddress(PHPLib, 'zend_hash_destroy'); + zend_hash_destroy := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_destroy@@4'{$ELSE}'zend_hash_destroy'{$ENDIF}); // -- zend_hash_clean - zend_hash_clean := GetProcAddress(PHPLib, 'zend_hash_clean'); + zend_hash_clean := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_clean@@4'{$ELSE}'zend_hash_clean'{$ENDIF}); // -- zend_hash_add_empty_element - zend_hash_add_empty_element := GetProcAddress(PHPLib, 'zend_hash_add_empty_element'); + zend_hash_add_empty_element := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_add_empty_element@@8'{$ELSE}'zend_hash_add_empty_element'{$ENDIF}); // -- zend_hash_graceful_destroy - zend_hash_graceful_destroy := GetProcAddress(PHPLib, 'zend_hash_graceful_destroy'); + zend_hash_graceful_destroy := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_graceful_destroy@@4'{$ELSE}'zend_hash_graceful_destroy'{$ENDIF}); // -- zend_hash_graceful_reverse_destroy - zend_hash_graceful_reverse_destroy := GetProcAddress(PHPLib, 'zend_hash_graceful_reverse_destroy'); + zend_hash_graceful_reverse_destroy := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_graceful_reverse_destroy@@4'{$ELSE}'zend_hash_graceful_reverse_destroy'{$ENDIF}); // -- zend_hash_apply - zend_hash_apply := GetProcAddress(PHPLib, 'zend_hash_apply'); + zend_hash_apply := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_apply@@8'{$ELSE}'zend_hash_apply'{$ENDIF}); // -- zend_hash_apply_with_argument - zend_hash_apply_with_argument := GetProcAddress(PHPLib, 'zend_hash_apply_with_argument'); + zend_hash_apply_with_argument := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_apply_with_argument@@12'{$ELSE}'zend_hash_apply_with_argument'{$ENDIF}); // -- zend_hash_reverse_apply - zend_hash_reverse_apply := GetProcAddress(PHPLib, 'zend_hash_reverse_apply'); + zend_hash_reverse_apply := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_reverse_apply@@8'{$ELSE}'zend_hash_reverse_apply'{$ENDIF}); // -- zend_hash_del_key_or_index - zend_hash_del_key_or_index := GetProcAddress(PHPLib, 'zend_hash_del_key_or_index'); + zend_hash_del_key_or_index := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_del@@8'{$ELSE}'zend_hash_del_key_or_index'{$ENDIF}); // -- zend_get_hash_value zend_get_hash_value := GetProcAddress(PHPLib, {$IFDEF PHP560}'zend_hash_func'{$ELSE}'zend_get_hash_value'{$ENDIF}); // -- zend_hash_find - zend_hash_find := GetProcAddress(PHPLib, 'zend_hash_find'); + zend_hash_find := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_find@@8'{$ELSE}'zend_hash_find'{$ENDIF}); // -- zend_hash_quick_find - zend_hash_quick_find := GetProcAddress(PHPLib, 'zend_hash_quick_find'); + zend_hash_quick_find := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_find@@8'{$ELSE}'zend_hash_quick_find'{$ENDIF}); // -- zend_hash_index_find - zend_hash_index_find := GetProcAddress(PHPLib, 'zend_hash_index_find'); + zend_hash_index_find := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_index_find@@8'{$ELSE}'zend_hash_index_find'{$ENDIF}); // -- zend_hash_exists - zend_hash_exists := GetProcAddress(PHPLib, 'zend_hash_exists'); + zend_hash_exists := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_exists@@8'{$ELSE}'zend_hash_exists'{$ENDIF}); // -- zend_hash_index_exists - zend_hash_index_exists := GetProcAddress(PHPLib, 'zend_hash_index_exists'); - + zend_hash_index_exists := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_index_exists@@8'{$ELSE}'zend_hash_index_exists'{$ENDIF}); + {$IFDEF PHP7} + _zend_hash_add_or_update := GetProcAddress(PHPLib, '_zend_hash_add_or_update@@16'); + _zend_hash_add := GetProcAddress(PHPLib, '_zend_hash_add@@12'); + {$IFDEF P_CUT} + zend_hash_index_findZval := GetProcAddress(PHPLib,'zend_hash_index_findZval'); + zend_symtable_findTest := GetProcAddress(PHPLib,'zend_symtable_findTest'); + zend_hash_index_existsZval := GetProcAddress(PHPLib,'zend_hash_index_existsZval'); + {$ENDIF} + {$ELSE} // -- zend_hash_next_free_element zend_hash_next_free_element := GetProcAddress(PHPLib, 'zend_hash_next_free_element'); - + {$ENDIF} // -- zend_hash_move_forward_ex - zend_hash_move_forward_ex := GetProcAddress(PHPLib, 'zend_hash_move_forward_ex'); + zend_hash_move_forward_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_move_forward_ex@@8'{$ELSE}'zend_hash_move_forward_ex'{$ENDIF}); // -- zend_hash_move_backwards_ex - zend_hash_move_backwards_ex := GetProcAddress(PHPLib, 'zend_hash_move_backwards_ex'); + zend_hash_move_backwards_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_move_backwards_ex@@8'{$ELSE}'zend_hash_move_backwards_ex'{$ENDIF}); // -- zend_hash_get_current_key_ex - zend_hash_get_current_key_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_key_ex'); + zend_hash_get_current_key_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_get_current_key_ex@@16'{$ELSE}'zend_hash_get_current_key_ex'{$ENDIF}); // -- zend_hash_get_current_key_type_ex - zend_hash_get_current_key_type_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_key_type_ex'); + zend_hash_get_current_key_type_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_get_current_key_type_ex@@8'{$ELSE}'zend_hash_get_current_key_type_ex'{$ENDIF}); // -- zend_hash_get_current_data_ex - zend_hash_get_current_data_ex := GetProcAddress(PHPLib, 'zend_hash_get_current_data_ex'); + zend_hash_get_current_data_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_get_current_data_ex@@8'{$ELSE}'zend_hash_get_current_data_ex'{$ENDIF}); // -- zend_hash_internal_pointer_reset_ex - zend_hash_internal_pointer_reset_ex := GetProcAddress(PHPLib, 'zend_hash_internal_pointer_reset_ex'); + zend_hash_internal_pointer_reset_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_internal_pointer_reset_ex@@8'{$ELSE}'zend_hash_internal_pointer_reset_ex'{$ENDIF}); // -- zend_hash_internal_pointer_end_ex - zend_hash_internal_pointer_end_ex := GetProcAddress(PHPLib, 'zend_hash_internal_pointer_end_ex'); + zend_hash_internal_pointer_end_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_internal_pointer_end_ex@@8'{$ELSE}'zend_hash_internal_pointer_end_ex'{$ENDIF}); // -- zend_hash_copy - zend_hash_copy := GetProcAddress(PHPLib, 'zend_hash_copy'); + zend_hash_copy := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_copy@@12'{$ELSE}'zend_hash_copy'{$ENDIF}); // -- zend_hash_sort - zend_hash_sort := GetProcAddress(PHPLib, 'zend_hash_sort'); + zend_hash_sort := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_sort_ex@@16'{$ELSE}'zend_hash_sort'{$ENDIF}); // -- zend_hash_compare zend_hash_compare := GetProcAddress(PHPLib, 'zend_hash_compare'); // -- zend_hash_minmax - zend_hash_minmax := GetProcAddress(PHPLib, 'zend_hash_minmax'); + zend_hash_minmax := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_minmax@@12'{$ELSE}'zend_hash_minmax'{$ENDIF}); // -- zend_hash_num_elements + {$IFNDEF PHP7} zend_hash_num_elements := GetProcAddress(PHPLib, 'zend_hash_num_elements'); + {$ENDIF} // -- zend_hash_rehash - zend_hash_rehash := GetProcAddress(PHPLib, 'zend_hash_rehash'); + zend_hash_rehash := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_rehash@@4'{$ELSE}'zend_hash_rehash'{$ENDIF}); // -- zend_hash_func zend_hash_func := GetProcAddress(PHPLib, 'zend_hash_func'); @@ -2299,8 +2489,8 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; _zval_copy_ctor := GetProcAddress(PHPLib, '_zval_copy_ctor'); {$ELSE} - _zval_copy_ctor_func := GetProcAddress(PHPLib, '_zval_copy_ctor_func'); - _zval_dtor_func := GetProcAddress(PHPLib, '_zval_dtor_func'); + _zval_copy_ctor_func := GetProcAddress(PHPLib, {$IFDEF PHP7}'_zval_copy_ctor_func@@4'{$ELSE}'_zval_copy_ctor_func'{$ENDIF}); + _zval_dtor_func := GetProcAddress(PHPLib, {$IFDEF PHP7}'_zval_dtor_func@@4'{$ELSE}'_zval_dtor_func'{$ENDIF}); _zval_ptr_dtor := GetProcAddress(PHPLib, '_zval_ptr_dtor'); {$ENDIF} @@ -2342,160 +2532,160 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; zend_stack_apply_with_argument := GetProcAddress(PHPLib, 'zend_stack_apply_with_argument'); // -- _convert_to_string - _convert_to_string := GetProcAddress(PHPLib, '_convert_to_string'); + _convert_to_string := GetProcAddress(PHPLib, {$IFDEF PHP7}'_convert_to_string@@4'{$ELSE}'_convert_to_string'{$ENDIF}); // -- add_function - add_function := GetProcAddress(PHPLib, 'add_function'); + add_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'add_function@@12'{$ELSE}'add_function'{$ENDIF}); // -- sub_function - sub_function := GetProcAddress(PHPLib, 'sub_function'); + sub_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'sub_function@@12'{$ELSE}'sub_function'{$ENDIF}); // -- mul_function - mul_function := GetProcAddress(PHPLib, 'mul_function'); + mul_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'mul_function@@12'{$ELSE}'mul_function'{$ENDIF}); // -- div_function - div_function := GetProcAddress(PHPLib, 'div_function'); + div_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'div_function@@12'{$ELSE}'div_function'{$ENDIF}); // -- mod_function - mod_function := GetProcAddress(PHPLib, 'mod_function'); + mod_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'mod_function@@12'{$ELSE}'mod_function'{$ENDIF}); // -- boolean_xor_function - boolean_xor_function := GetProcAddress(PHPLib, 'boolean_xor_function'); + boolean_xor_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'boolean_xor_function@@12'{$ELSE}'boolean_xor_function'{$ENDIF}); // -- boolean_not_function - boolean_not_function := GetProcAddress(PHPLib, 'boolean_not_function'); + boolean_not_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'boolean_not_function@@8'{$ELSE}'boolean_not_function'{$ENDIF}); // -- bitwise_not_function - bitwise_not_function := GetProcAddress(PHPLib, 'bitwise_not_function'); + bitwise_not_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'bitwise_not_function@@8'{$ELSE}'bitwise_not_function'{$ENDIF}); // -- bitwise_or_function - bitwise_or_function := GetProcAddress(PHPLib, 'bitwise_or_function'); + bitwise_or_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'bitwise_or_function@@12'{$ELSE}'bitwise_or_function'{$ENDIF}); // -- bitwise_and_function - bitwise_and_function := GetProcAddress(PHPLib, 'bitwise_and_function'); + bitwise_and_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'bitwise_and_function@@12'{$ELSE}'bitwise_and_function'{$ENDIF}); // -- bitwise_xor_function - bitwise_xor_function := GetProcAddress(PHPLib, 'bitwise_xor_function'); + bitwise_xor_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'bitwise_xor_function@@12'{$ELSE}'bitwise_xor_function'{$ENDIF}); // -- shift_left_function - shift_left_function := GetProcAddress(PHPLib, 'shift_left_function'); + shift_left_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'shift_left_function@@12'{$ELSE}'shift_left_function'{$ENDIF}); // -- shift_right_function - shift_right_function := GetProcAddress(PHPLib, 'shift_right_function'); + shift_right_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'shift_right_function@@12'{$ELSE}'shift_right_function'{$ENDIF}); // -- concat_function - concat_function := GetProcAddress(PHPLib, 'concat_function'); + concat_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'concat_function@@12'{$ELSE}'concat_function'{$ENDIF}); // -- is_equal_function - is_equal_function := GetProcAddress(PHPLib, 'is_equal_function'); + is_equal_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_equal_function@@12'{$ELSE}'is_equal_function'{$ENDIF}); // -- is_identical_function - is_identical_function := GetProcAddress(PHPLib, 'is_identical_function'); + is_identical_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_identical_function@@12'{$ELSE}'is_identical_function'{$ENDIF}); // -- is_not_identical_function - is_not_identical_function := GetProcAddress(PHPLib, 'is_not_identical_function'); + is_not_identical_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_not_identical_function@@12'{$ELSE}'is_not_identical_function'{$ENDIF}); // -- is_not_equal_function - is_not_equal_function := GetProcAddress(PHPLib, 'is_not_equal_function'); + is_not_equal_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_not_equal_function@@12'{$ELSE}'is_not_equal_function'{$ENDIF}); // -- is_smaller_function - is_smaller_function := GetProcAddress(PHPLib, 'is_smaller_function'); + is_smaller_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_smaller_function@@12'{$ELSE}'is_smaller_function'{$ENDIF}); // -- is_smaller_or_equal_function - is_smaller_or_equal_function := GetProcAddress(PHPLib, 'is_smaller_or_equal_function'); + is_smaller_or_equal_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_smaller_or_equal_function@@12'{$ELSE}'is_smaller_or_equal_function'{$ENDIF}); // -- increment_function - increment_function := GetProcAddress(PHPLib, 'increment_function'); + increment_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'increment_function@@4'{$ELSE}'increment_function'{$ENDIF}); // -- decrement_function - decrement_function := GetProcAddress(PHPLib, 'decrement_function'); + decrement_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'decrement_function@@4'{$ELSE}'decrement_function'{$ENDIF}); // -- convert_scalar_to_number - convert_scalar_to_number := GetProcAddress(PHPLib, 'convert_scalar_to_number'); + convert_scalar_to_number := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_scalar_to_number@@4'{$ELSE}'convert_scalar_to_number'{$ENDIF}); // -- convert_to_long - convert_to_long := GetProcAddress(PHPLib, 'convert_to_long'); + convert_to_long := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_long@@4'{$ELSE}'convert_to_long'{$ENDIF}); // -- convert_to_double - convert_to_double := GetProcAddress(PHPLib, 'convert_to_double'); + convert_to_double := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_double@@4'{$ELSE}'convert_to_double'{$ENDIF}); // -- convert_to_long_base - convert_to_long_base := GetProcAddress(PHPLib, 'convert_to_long_base'); + convert_to_long_base := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_long_base@@8'{$ELSE}'convert_to_long_base'{$ENDIF}); // -- convert_to_null - convert_to_null := GetProcAddress(PHPLib, 'convert_to_null'); + convert_to_null := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_null@@4'{$ELSE}'convert_to_null'{$ENDIF}); // -- convert_to_boolean - convert_to_boolean := GetProcAddress(PHPLib, 'convert_to_boolean'); + convert_to_boolean := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_boolean@@4'{$ELSE}'convert_to_boolean'{$ENDIF}); // -- convert_to_array - convert_to_array := GetProcAddress(PHPLib, 'convert_to_array'); + convert_to_array := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_array@@4'{$ELSE}'convert_to_array'{$ENDIF}); // -- convert_to_object - convert_to_object := GetProcAddress(PHPLib, 'convert_to_object'); - + convert_to_object := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_object@@4'{$ELSE}'convert_to_object'{$ENDIF}); + {$IFNDEF PHP7} // -- add_char_to_string add_char_to_string := GetProcAddress(PHPLib, 'add_char_to_string'); // -- add_string_to_string add_string_to_string := GetProcAddress(PHPLib, 'add_string_to_string'); - + {$ENDIF} // -- zend_string_to_double - zend_string_to_double := GetProcAddress(PHPLib, 'zend_string_to_double'); + zend_string_to_double := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_strtod'{$ELSE}'zend_string_to_double'{$ENDIF}); // -- zval_is_true - zval_is_true := GetProcAddress(PHPLib, 'zval_is_true'); + zval_is_true := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_is_true@@4'{$ELSE}'zval_is_true'{$ENDIF}); // -- compare_function - compare_function := GetProcAddress(PHPLib, 'compare_function'); + compare_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'compare_function@@12'{$ELSE}'compare_function'{$ENDIF}); // -- numeric_compare_function - numeric_compare_function := GetProcAddress(PHPLib, 'numeric_compare_function'); + numeric_compare_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'numeric_compare_function@@8'{$ELSE}'numeric_compare_function'{$ENDIF}); // -- string_compare_function - string_compare_function := GetProcAddress(PHPLib, 'string_compare_function'); + string_compare_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'string_compare_function@@8'{$ELSE}'string_compare_function'{$ENDIF}); // -- zend_str_tolower - zend_str_tolower := GetProcAddress(PHPLib, 'zend_str_tolower'); + zend_str_tolower := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_str_tolower@@8'{$ELSE}'zend_str_tolower'{$ENDIF}); // -- zend_binary_zval_strcmp - zend_binary_zval_strcmp := GetProcAddress(PHPLib, 'zend_binary_zval_strcmp'); + zend_binary_zval_strcmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_zval_strcmp@@8'{$ELSE}'zend_binary_zval_strcmp'{$ENDIF}); // -- zend_binary_zval_strncmp - zend_binary_zval_strncmp := GetProcAddress(PHPLib, 'zend_binary_zval_strncmp'); + zend_binary_zval_strncmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_zval_strncmp@@12'{$ELSE}'zend_binary_zval_strncmp'{$ENDIF}); // -- zend_binary_zval_strcasecmp - zend_binary_zval_strcasecmp := GetProcAddress(PHPLib, 'zend_binary_zval_strcasecmp'); + zend_binary_zval_strcasecmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_zval_strcasecmp@@8'{$ELSE}'zend_binary_zval_strcasecmp'{$ENDIF}); // -- zend_binary_zval_strncasecmp - zend_binary_zval_strncasecmp := GetProcAddress(PHPLib, 'zend_binary_zval_strncasecmp'); + zend_binary_zval_strncasecmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_zval_strncasecmp@@12'{$ELSE}'zend_binary_zval_strncasecmp'{$ENDIF}); // -- zend_binary_strcmp - zend_binary_strcmp := GetProcAddress(PHPLib, 'zend_binary_strcmp'); + zend_binary_strcmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_strcmp@@16'{$ELSE}'zend_binary_strcmp'{$ENDIF}); // -- zend_binary_strncmp - zend_binary_strncmp := GetProcAddress(PHPLib, 'zend_binary_strncmp'); + zend_binary_strncmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_strncmp@@20'{$ELSE}'zend_binary_strncmp'{$ENDIF}); // -- zend_binary_strcasecmp - zend_binary_strcasecmp := GetProcAddress(PHPLib, 'zend_binary_strcasecmp'); + zend_binary_strcasecmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_strcasecmp@@16'{$ELSE}'zend_binary_strcasecmp'{$ENDIF}); // -- zend_binary_strncasecmp - zend_binary_strncasecmp := GetProcAddress(PHPLib, 'zend_binary_strncasecmp'); + zend_binary_strncasecmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_strncasecmp@@20'{$ELSE}'zend_binary_strncasecmp'{$ENDIF}); // -- zendi_smart_strcmp - zendi_smart_strcmp := GetProcAddress(PHPLib, 'zendi_smart_strcmp'); + zendi_smart_strcmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zendi_smart_strcmp@@8'{$ELSE}'zendi_smart_strcmp'{$ENDIF}); // -- zend_compare_symbol_tables - zend_compare_symbol_tables := GetProcAddress(PHPLib, 'zend_compare_symbol_tables'); + zend_compare_symbol_tables := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_compare_symbol_tables@@8'{$ELSE}'zend_compare_symbol_tables'{$ENDIF}); // -- zend_compare_arrays - zend_compare_arrays := GetProcAddress(PHPLib, 'zend_compare_arrays'); + zend_compare_arrays := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_compare_arrays@@8'{$ELSE}'zend_compare_arrays'{$ENDIF}); // -- zend_compare_objects - zend_compare_objects := GetProcAddress(PHPLib, 'zend_compare_objects'); + zend_compare_objects := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_compare_objects@@8'{$ELSE}'zend_compare_objects'{$ENDIF}); // -- zend_atoi - zend_atoi := GetProcAddress(PHPLib, 'zend_atoi'); + zend_atoi := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_atoi@@8'{$ELSE}'zend_atoi'{$ENDIF}); // -- get_active_function_name get_active_function_name := GetProcAddress(PHPLib, 'get_active_function_name'); @@ -2532,12 +2722,15 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; // -- zend_html_puts zend_html_puts := GetProcAddress(PHPLib, 'zend_html_puts'); - + {$IFDEF PHP7} + // -- zend_parse_parameters_throw + zend_parse_parameters_throw := GetProcAddress(PHPLib, 'zend_parse_parameters_throw'); + {$ELSE} // -- zend_indent zend_indent := GetProcAddress(PHPLib, 'zend_indent'); - + {$ENDIF} // -- _zend_get_parameters_array_ex - _zend_get_parameters_array_ex := GetProcAddress(PHPLib, '_zend_get_parameters_array_ex'); + _zend_get_parameters_array_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}{$ELSE}{$ENDIF}'_zend_get_parameters_array_ex'); // -- zend_ini_refresh_caches zend_ini_refresh_caches := GetProcAddress(PHPLib, 'zend_ini_refresh_caches'); @@ -2593,9 +2786,10 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; // -- add_property_zval_ex add_property_zval_ex := GetProcAddress(PHPLib, 'add_property_zval_ex'); - call_user_function := GetProcAddress(PHPLib, 'call_user_function'); + call_user_function := GetProcAddress(PHPLib, {$IFDEF P_CUT}'__call_function'{$ELSE}'call_user_function'{$ENDIF}); + {$IFNDEF P_CUT} call_user_function_ex := GetProcAddress(PHPLib, 'call_user_function_ex'); - + {$ENDIF} // -- add_assoc_long_ex add_assoc_long_ex := GetProcAddress(PHPLib, 'add_assoc_long_ex'); @@ -2750,7 +2944,7 @@ procedure convert_to_string(op: pzval); _convert_to_string(op, nil, 0); end; -procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: zend_pchar; functions: pointer); +procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: zend_pchar; functions: {$IFDEF PHP7}HashTable{$ELSE}pointer{$ENDIF}); begin if class_name = nil then @@ -2761,12 +2955,19 @@ procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: z {$IFNDEF COMPILER_VC9} class_container.name := strdup(class_name); {$ELSE} - class_container.name := estrdup(class_name); + {$IFDEF PHP7} + class_container.name.val := estrdup(class_name); + {$ELSE} + class_container.name := estrdup(class_name); + {$ENDIF} {$ENDIF} - + {$IFDEF PHP7} + class_container.name.len := strlen(class_name); + class_container.function_table := functions; + {$ELSE} class_container.name_length := strlen(class_name); class_container.builtin_functions := functions; - + {$ENDIF} {$IFDEF PHP4} class_container.handle_function_call := nil; class_container.handle_property_get := nil; @@ -2791,19 +2992,26 @@ procedure ALLOC_ZVAL(out Result: pzval); {$ENDIF} procedure INIT_PZVAL(p: pzval); begin + {$IFDEF PHP7} + p^.value.counted.gc.refcount := 1; + {$ELSE} p^.refcount := 1; p^.is_ref := 0; + {$ENDIF} end; procedure LOCK_ZVAL(p: pzval); begin - Inc(p^.refcount); + Inc({$IFDEF PHP7} + p^.value.counted.gc.refcount{$ELSE}p^.refcount{$ENDIF}); end; procedure UNLOCK_ZVAL(p: pzval); begin - if p^.refcount > 0 then - Dec(p^.refcount); + if {$IFDEF PHP7} + p^.value.counted.gc.refcount{$ELSE}p^.refcount{$ENDIF} > 0 then + Dec({$IFDEF PHP7} + p^.value.counted.gc.refcount{$ELSE}p^.refcount{$ENDIF}); end; function MAKE_STD_ZVAL: pzval; @@ -2833,7 +3041,7 @@ function zend_get_parameters_ex(number: integer; var Params: pzval_array): integ function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; var i : integer; - p: {$IFNDEF PHP700} pppzval {$ELSE} pzval{$ENDIF}; + p: pppzval; begin SetLength(Params, number); if number = 0 then @@ -2850,9 +3058,9 @@ function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS for i := 0 to number - 1 do begin - {$IFNDEF PHP700}Params[i]^ := p^^ {$ELSE}Params[i] := p{$ENDIF}; + Params[i]^ := p^^; if i <> number then - inc(integer({$IFNDEF PHP700}p^{$ELSE}p{$ENDIF}), sizeof({$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF})); + inc(integer(p^), sizeof(ppzval)); end; efree(p); @@ -2969,7 +3177,18 @@ procedure CheckZendErrors; if @zend_hash_index_find = nil then raise EPHP4DelphiException.Create('zend_hash_index_find'); if @zend_hash_exists = nil then raise EPHP4DelphiException.Create('zend_hash_exists'); if @zend_hash_index_exists = nil then raise EPHP4DelphiException.Create('zend_hash_index_exists'); + {$IFDEF PHP7} + if @_zend_hash_add = nil then raise EPHP4DelphiException.Create('_zend_hash_add'); + if @_zend_hash_add_or_update = nil then raise EPHP4DelphiException.Create('_zend_hash_add_or_update'); + + if @zend_hash_index_findZval = nil then raise EPHP4DelphiException.Create('zend_hash_index_findZval'); + if @zend_symtable_findTest = nil then raise EPHP4DelphiException.Create('zend_symtable_findTest'); + if @zend_hash_index_existsZval = nil then raise EPHP4DelphiException.Create('zend_hash_index_existsZval'); + + {$ENDIF} + {$IFNDEF PHP7} if @zend_hash_next_free_element = nil then raise EPHP4DelphiException.Create('zend_hash_next_free_element'); + {$ENDIF} if @zend_hash_move_forward_ex = nil then raise EPHP4DelphiException.Create('zend_hash_move_forward_ex'); if @zend_hash_move_backwards_ex = nil then raise EPHP4DelphiException.Create('zend_hash_move_backwards_ex'); if @zend_hash_get_current_key_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_key_ex'); @@ -3003,7 +3222,7 @@ procedure CheckZendErrors; if @_zval_copy_ctor = nil then raise EPHP4DelphiException.Create('_zval_copy_ctor'); {$ELSE} if @_zval_dtor_func = nil then raise EPHP4DelphiException.Create('_zval_dtor_func'); - if @_zval_copy_ctor_func = nil then raise EPHP4DelphiException.Create('_zval_ctor_func'); + if @_zval_copy_ctor_func = nil then raise EPHP4DelphiException.Create('_zval_copy_ctor_func'); {$ENDIF} if @zend_print_variable = nil then raise EPHP4DelphiException.Create('zend_print_variable'); @@ -3081,7 +3300,11 @@ procedure CheckZendErrors; if @highlight_string = nil then raise EPHP4DelphiException.Create('highlight_string'); if @zend_html_putc = nil then raise EPHP4DelphiException.Create('zend_html_putc'); if @zend_html_puts = nil then raise EPHP4DelphiException.Create('zend_html_puts'); + {$IFDEF PHP7} + if @zend_parse_parameters_throw = nil then EPHP4DelphiException.Create('zend_parse_parameters_throw'); + {$ELSE} if @zend_indent = nil then raise EPHP4DelphiException.Create('zend_indent'); + {$ENDIF} if @_zend_get_parameters_array_ex = nil then raise EPHP4DelphiException.Create('_zend_get_parameters_array_ex'); if @zend_ini_refresh_caches = nil then raise EPHP4DelphiException.Create('zend_ini_refresh_caches'); if @zend_alter_ini_entry = nil then raise EPHP4DelphiException.Create('zend_alter_ini_entry'); @@ -3101,7 +3324,9 @@ procedure CheckZendErrors; if @add_property_stringl_ex = nil then raise EPHP4DelphiException.Create('add_property_stringl_ex'); if @add_property_zval_ex = nil then raise EPHP4DelphiException.Create('add_property_zval_ex'); if @call_user_function = nil then raise EPHP4DelphiException.Create('call_user_function'); + {$IFNDEF P_CUT} if @call_user_function_ex = nil then raise EPHP4DelphiException.Create('call_user_function_ex'); + {$ENDIF} if @add_assoc_long_ex = nil then raise EPHP4DelphiException.Create('add_assoc_long_ex'); if @add_assoc_null_ex = nil then raise EPHP4DelphiException.Create('add_assoc_null_ex'); if @add_assoc_bool_ex = nil then raise EPHP4DelphiException.Create('add_assoc_bool_ex'); @@ -3147,14 +3372,14 @@ procedure CheckZendErrors; end; {$ENDIF} -function zend_hash_get_current_data(ht: PHashTable; pData: Pointer): Integer; cdecl; +function zend_hash_get_current_data(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; pData: Pointer): Integer; cdecl; begin - result := zend_hash_get_current_data_ex(ht, pData, nil); + result := zend_hash_get_current_data_ex(ht, pData, cardinal(nil)); end; -procedure zend_hash_internal_pointer_reset(ht: PHashTable); cdecl; +procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}); cdecl; begin - zend_hash_internal_pointer_reset_ex(ht, nil); + zend_hash_internal_pointer_reset_ex(ht, cardinal(nil)); end; function ts_resource(id : integer) : pointer; @@ -3174,10 +3399,13 @@ function zval_copy_ctor(val : pzval) : integer; end; {$ENDIF} -function zend_unregister_functions(functions : pzend_function_entry; count : integer; function_table : PHashTable; TSRMLS_DC : pointer) : integer; +function zend_unregister_functions(functions : {$IFDEF PHP7}P_zend_function_entry{$ELSE}pzend_function_entry{$ENDIF}; count : integer; function_table : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; TSRMLS_DC : pointer) : integer; var i : integer; - ptr : pzend_function_entry; + {$IFDEF PHP7} + pzs: pzend_string; + {$ENDIF} + ptr : {$IFDEF PHP7}P_zend_function_entry{$ELSE}pzend_function_entry{$ENDIF}; begin Result := SUCCESS; i := 0; @@ -3188,7 +3416,13 @@ function zend_unregister_functions(functions : pzend_function_entry; count : int begin if ( count <> -1 ) and (i >= count) then break; + {$IFDEF PHP7} + pzs^.len := strlen(ptr.fname); + pzs^.val := ptr.fname; + zend_hash_del_key_or_index(function_table, pzs); + {$ELSE} zend_hash_del_key_or_index(function_table, ptr.fname, strlen(ptr.fname) +1, 0, HASH_DEL_KEY); + {$ENDIF} inc(ptr); inc(i); end; @@ -3196,14 +3430,14 @@ function zend_unregister_functions(functions : pzend_function_entry; count : int // registers all functions in *library_functions in the function hash -function zend_register_functions(functions : pzend_function_entry; function_table : PHashTable; _type: integer; TSRMLS_DC : pointer) : integer; +function zend_register_functions(functions : {$IFDEF PHP7}P_zend_function_entry{$ELSE}pzend_function_entry{$ENDIF}; function_table : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; _type: integer; TSRMLS_DC : pointer) : integer; var - ptr : pzend_function_entry; - _function : zend_function; - internal_function : PzendInternalFunction; + ptr : {$IFDEF PHP7}P_zend_function_entry{$ELSE}pzend_function_entry{$ENDIF}; + _function : {$IFDEF PHP7} _zend_function{$ELSE}zend_function{$ENDIF}; + internal_function :{$IFDEF PHP7}P_zend_internal_function{$ELSE}PzendInternalFunction{$ENDIF}; count : integer; unload : integer; - target_function_table : PHashTable; + target_function_table : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; error_type : integer; begin @@ -3230,8 +3464,12 @@ function zend_register_functions(functions : pzend_function_entry; function_tab while (ptr.fname <> nil) do begin internal_function.handler := ptr.handler; + {$IFDEF PHP7} + internal_function.function_name.val := ptr.fname; + {$ELSE} internal_function.function_name := ptr.fname; - if (internal_function.handler = nil) then begin + {$ENDIF} + if not Assigned(internal_function.handler) then begin zend_error(error_type, 'Null function defined as active function'); zend_unregister_functions(functions, count, target_function_table, TSRMLS_DC); Result := FAILURE; @@ -3314,7 +3552,7 @@ function GetAllocGlobals : pointer; procedure zend_addref_p; begin - Inc(z.refcount); + Inc({$IFDEF PHP7}z.value.counted.gc.refcount{$ELSE}z.refcount{$ENDIF}); end; procedure my_class_add_ref; @@ -3355,10 +3593,10 @@ function Z_LVAL(z : pzval) : longint; exit; end; - if z._type = IS_LONG then + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_LONG then Result := z.value.lval else - case z._type of + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of IS_DOUBLE: Result := Trunc(z.value.dval); IS_BOOL : Result := z.value.lval; IS_STRING: Result := StrToIntDef( Z_STRVAL(z), 0 ); @@ -3375,10 +3613,10 @@ function Z_BVAL(z : pzval) : boolean; exit; end; - if z._type = IS_BOOL then + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_BOOL then Result := zend_bool(z.value.lval) else - case z._type of + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of IS_DOUBLE: if Trunc(z.value.dval) = 0 then Result := false else Result := true; IS_LONG : if z.value.lval = 0 then Result := false else Result := true; IS_STRING: if Z_STRVAL(z) = '' then Result := False else Result := True; @@ -3396,10 +3634,10 @@ function Z_DVAL(z : pzval) : double; exit; end; - if z._type = IS_DOUBLE then + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_DOUBLE then Result := z.value.dval else - case z._type of + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of IS_LONG, IS_BOOL: Result := z.value.lval; IS_STRING: Result := StrToFloatDef( Z_STRVAL(z), 0 ); else @@ -3418,7 +3656,7 @@ function Z_VARREC(z: pzval): TVarRec; exit; end; - case z._type of + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of IS_BOOL: begin Result.VType := vtBoolean; Result.VBoolean := Boolean(z.value.lval); @@ -3460,12 +3698,12 @@ function Z_STRUVAL(z : pzval) : UTF8String; exit; end; - if z._type = IS_STRING then + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then begin SetLength(Result, z.value.str.len); Move(z.value.str.val^, Result[1], z.value.str.len); end else - case z._type of + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of IS_LONG: Result := IntToStr(z.value.lval); IS_DOUBLE: Result := FloatToStr(z.value.dval); IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; @@ -3482,12 +3720,12 @@ function Z_STRVAL(z : pzval) : zend_ustr; exit; end; - if z._type = IS_STRING then + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then begin SetLength(Result, z.value.str.len); Move(z.value.str.val^, Result[1], z.value.str.len); end else - case z._type of + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of IS_LONG: Result := IntToStr(z.value.lval); IS_DOUBLE: Result := FloatToStr(z.value.dval); IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; @@ -3504,12 +3742,12 @@ function Z_STRWVAL(z : pzval) : String; exit; end; - if z._type = IS_STRING then + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then begin SetLength(Result, z.value.str.len); Move(z.value.str.val^, Result[1], z.value.str.len); end else - case z._type of + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of IS_LONG: Result := IntToStr(z.value.lval); IS_DOUBLE: Result := FloatToStr(z.value.dval); IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; @@ -3523,9 +3761,9 @@ function Z_STRLEN(z : pzval) : longint; Result := Length(Z_STRVAL(z)); end; -function Z_ARRVAL(z : pzval ) : PHashTable; +function Z_ARRVAL(z : pzval ) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; begin - Result := z.value.ht; + Result := {$IFDEF PHP7} z.value.arr {$ELSE}z.value.ht{$ENDIF}; end; function Z_OBJ_HANDLE(z :pzval) : zend_object_handle; @@ -3533,18 +3771,24 @@ function Z_OBJ_HANDLE(z :pzval) : zend_object_handle; Result := z.value.obj.handle; end; -function Z_OBJ_HT(z : pzval) : pzend_object_handlers; +function Z_OBJ_HT(z : pzval) : {$IFDEF PHP7}hzend_types.P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF}; begin Result := z.value.obj.handlers; end; -function Z_OBJPROP(z : pzval) : PHashtable; +function Z_OBJPROP(z : pzval) : {$IFDEF PHP7}hzend_types.PHashTable{$ELSE}PHashTable{$ENDIF}; +{$IFDEF PHP7} +begin + Result := Z_OBJ_HT(z)^.get_properties(z); +end; +{$ELSE} var TSRMLS_DC : pointer; begin TSRMLS_DC := ts_resource_ex(0, nil); Result := Z_OBJ_HT(z)^.get_properties(@z, TSRMLS_DC); end; +{$ENDIF} {$ENDIF} @@ -3552,7 +3796,7 @@ function Z_OBJPROP(z : pzval) : PHashtable; {$IFDEF PHP5} procedure _zval_copy_ctor (val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); begin - if val^._type <= IS_BOOL then + if {$IFDEF PHP7}val^.u1.v._type{$ELSE}val^._type{$ENDIF} <= IS_BOOL then Exit else _zval_copy_ctor_func(val, __zend_filename, __zend_lineno); @@ -3560,28 +3804,38 @@ procedure _zval_copy_ctor (val: pzval; __zend_filename: zend_pchar; __zend_line procedure _zval_dtor(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); begin - if val^._type <= IS_BOOL then + if {$IFDEF PHP7}val^.u1.v._type{$ELSE}val^._type{$ENDIF} <= IS_BOOL then Exit else _zval_dtor_func(val, __zend_filename, __zend_lineno); end; -function zend_hash_init (ht : PHashTable; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool) : integer; +function zend_hash_init (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool) : integer; begin Result := _zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent, nil, 0); end; -function zend_hash_add_or_update(ht : PHashTable; arKey : zend_pchar; - nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; +function zend_hash_add_or_update(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey : zend_pchar; + nKeyLength : uint; pData : {$IFDEF PHP7}pzval{$ELSE}pointer{$ENDIF}; nDataSize : uint; pDes : pointer; flag : integer) : integer; +{$IFDEF PHP7} +var pz: Pzend_string; +{$ENDIF} begin + {$IFDEF PHP7} + pz^.len := strlen(arKey); + pz^.val := arKey; + if Assigned(_zend_hash_add_or_update) then + Result := _zend_hash_add_or_update(ht, pz, pData, flag, '', 0).u2.fe_iter_idx + {$ELSE} if Assigned(_zend_hash_add_or_update) then Result := _zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDes, flag, nil, 0) + {$ENDIF} else Result := FAILURE; end; -function zend_hash_init_ex (ht : PHashTable; nSize : uint; pHashFunction : pointer; +function zend_hash_init_ex (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent : zend_bool; bApplyProtection : zend_bool): integer; begin Result := _zend_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection, nil, 0); diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index ae23209..627b682 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -16,7 +16,7 @@ interface uses - {$IFNDEF FPC} Windows {$ELSE} LCLType{$ENDIF}, SysUtils; + {$IFNDEF FPC} Windows {$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7} hzend_types, {$ENDIF} SysUtils; const //zend.h @@ -504,28 +504,32 @@ _zend_refcounted = record gc : zend_refcounted_h; end; zend_refcounted = _zend_refcounted; - zend_string = record + _zend_string = record gc : zend_refcounted_h; h : zend_ulong; len : size_t; val : zend_pchar; end; + + P_zend_refcounted = ^_zend_refcounted; + zend_string = _zend_string; + P_zend_string = ^_zend_string; {$ENDIF} zend_ushort = word; unsigned_char = byte; { Common Types } +{$IFNDEF PHP7} type pzend_string = {$IFDEF PHP_UNICE}PUTF8Char{$ELSE}PAnsiChar{$ENDIF}; - +{$ENDIF} type uint = longword; PINT = ^Integer; size_t = cardinal; - {$IFNDEF PHP700} + {$IFNDEF PHP7} ppointer = ^pointer; pppointer = ^ppointer; {$ENDIF} - PStat = ^TStat; TStat = record st_dev: Word; @@ -574,7 +578,7 @@ TBucket = record pLast: PBucket; arKey: array[0..0] of zend_uchar; end; - + {$IFNDEF PHP7} PHashTable = ^THashTable; THashTable = record @@ -591,10 +595,10 @@ TBucket = record nApplyCount: Byte; bApplyProtection: boolean; end; + {$ENDIF} + HashPosition = {$IFDEF PHP7} cardinal {$ELSE} PBucket {$ENDIF}; - HashPosition = PBucket; - - + {$IFNDEF PHP7} {$IFDEF PHP5} zend_op_array = @@ -707,13 +711,12 @@ zend_object_iterator_funcs = record move_forward : pointer; rewind : pointer; end; - zend_object_iterator = record data : pointer; funcs : PZendObjectIteratorFuncs; index : ulong; end; - + {$ENDIF} zend_class_iterator_funcs = record funcs : pointer; new_iterator : pointer; @@ -793,9 +796,10 @@ zend_function = record end; {$ENDIF} - + {$IFNDEF PHP7} Pzend_class_entry = ^Tzend_class_entry; PPZend_class_entry = ^PZend_class_entry; + {$ENDIF} {$IFDEF PHP4} Tzend_class_entry = record @@ -813,7 +817,7 @@ zend_function = record handle_property_set: pointer; end; {$ELSE} - + {$IFNDEF PHP7} Tzend_class_entry = record _type : zend_uchar; name : zend_pchar; @@ -823,35 +827,35 @@ Tzend_class_entry = record constants_updated : zend_bool; ce_flags : zend_uint; - function_table : THashTable; - default_properties : THashTable; - properties_info : THashTable; - default_static_members : THashTable; + function_table : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; + default_properties : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; + properties_info : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; + default_static_members : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; static_members : PHashTable; - constants_table : THashTable; + constants_table : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; builtin_functions : pointer; - _constructor : PZendFunction; - _destructor : PZendFunction; - clone : PZendFunction; - __get : PZendFunction; - __set : PZendFunction; - //{$IFDEF PHP510} - __unset : PZendFunction; - __isset : PZendFunction; - //{$ENDIF} - __call: PZendFunction; - //{$IFDEF PHP530} - __callstatic : PZendFunction; - //{$ENDIF} - //{$IFDEF PHP520} - __tostring : pointer; - //{$ENDIF} - //{$IFDEF PHP510} - serialize_func : PZendFunction; - unserialize_func : PZendFunction; - // {$ENDIF} + _constructor : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + _destructor : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + clone : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + __get : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + __set : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + {$IFDEF PHP510} + __unset : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + __isset : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + {$ENDIF} + __call: {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + {$IFDEF PHP530} + __callstatic : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + {$ENDIF} + {$IFDEF PHP520} + __tostring : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + {$ENDIF} + {$IFDEF PHP510} + serialize_func : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + unserialize_func : {$IFDEF PHP7}P_zend_function{$ELSE}PZendFunction{$ENDIF}; + {$ENDIF} iterator_funcs : zend_class_iterator_funcs; create_object : pointer; @@ -875,7 +879,9 @@ Tzend_class_entry = record module : pointer; end; {$ENDIF} - + {$ENDIF} + {$IFNDEF PHP7} + //P_zend_object_handlers = ^_zend_object_handlers; Pzend_Object = ^Tzend_object; PPzend_Object = ^PZend_Object; _zend_object = record @@ -894,18 +900,19 @@ _zend_object = record {$ENDIF} end; Tzend_Object = _zend_object; - {$IFDEF PHP5} + {$ENDIF} type - Tzend_object_get_properties = function (_object : pointer; TSRMLS_DC : pointer) : PHashtable; cdecl; + Tzend_object_get_properties = function (_object : pointer; TSRMLS_DC : pointer) :{$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; cdecl; Pzend_object_get_propeeries = ^Tzend_object_get_properties; Tzend_object_get_classname = function(_object : pointer; class_name : pointer; class_name_len : pointer; p : integer; TSRMLS_DC : pointer) : integer; cdecl; - zend_object_handlers = record + {$IFNDEF PHP7} + zend_object_handlers = record // general object functions add_ref : pointer; del_ref : pointer; @@ -936,40 +943,23 @@ zend_object_handlers = record get_closure : pointer; {$ENDIF} end; + {$ENDIF} + zend_object_handle = cardinal; + {$IFNDEF PHP7} pzend_object_handlers = ^zend_object_handlers; - zend_object_handle = cardinal; + _zend_object_value = record handle : zend_object_handle; handlers : pzend_object_handlers; end; TZendObjectValue = _zend_object_value; PZendObjectValue = ^TZendObjectValue; + {$ENDIF} {$ENDIF} - Pzvalue_value = ^zvalue_value; - {$IFDEF PHP7} - zvalue_value = Packed record - case longint of - 0 : ( lval : zend_long ); - 1 : ( dval : double ); - 2 : ( counted : P_zend_refcounted ); - 3 : ( str : Pzend_string ); - 4 : ( arr : Pzend_array ); - 5 : ( obj : Pzend_object ); - 6 : ( res : Pzend_resource ); - 7 : ( ref : P_zend_reference ); - 8 : ( ast : P_zend_ast_ref ); - 9 : ( zv : Pzval ); - 10 : ( ptr : pointer ); - 11 : ( ce : P_zend_class_entry ); - 12 : ( func : P_zend_function ); - 13 : ( ww : Packed record - w1 : cardinal; - w2 : cardinal; - end ); - end; - {$ELSE} +{$IFNDEF PHP7} +Pzvalue_value = ^zvalue_value; zvalue_value = record case longint of 0: (lval: zend_long); @@ -985,12 +975,8 @@ zvalue_value = record 4 : (obj : _zend_object_value); {$ENDIF} end; - {$ENDIF} - {$IFNDEF PHP700} pppzval = ^ppzval; ppzval = ^pzval; - {$ENDIF} - {$IFDEF PHP4} Pzval = ^zval; zval = record @@ -1001,33 +987,8 @@ zval = record end; Tzval = zval; {$ELSE} + pzval = ^zval; - {$IFDEF PHP7} - _zval_struct = Packed record - value : zend_value; - u1 : Packed record - case longint of - 0 : ( v : record - _type : zend_uchar; - type_flags : zend_uchar; - const_flags : zend_uchar; - reserved : zend_uchar; - end ); - 1 : ( type_info : cardinal ); - end; - u2 : Packed record - case longint of - 0 : ( var_flags : LongWord ); - 1 : ( next : cardinal ); - 2 : ( cache_slot : cardinal ); - 3 : ( lineno : cardinal ); - 4 : ( num_args : cardinal ); - 5 : ( fe_pos : cardinal ); - 6 : ( fe_iter_idx : cardinal ); - end; - end; - zval = _zval_struct; - {$ENDIF} zval = record value : zvalue_value; refcount : zend_uint; @@ -1035,9 +996,10 @@ zval = record is_ref : byte; end; {$ENDIF} +{$ENDIF} ppzval_array = ^pzval_array; - pzval_array = array of {$IFNDEF PHP700} ppzval{$ELSE} pzval{$ENDIF}; + pzval_array = array of ppzval; pzval_array_ex = array of pzval; @@ -1213,6 +1175,7 @@ _zend_arg_info = record PZendArgInfo = ^TZendArgInfo; {$ENDIF} + {$IFNDEF PHP7} Pzend_function_entry = ^Tzend_function_entry; zend_function_entry = record fname: zend_pchar; @@ -1239,6 +1202,7 @@ _zend_function_entry = record num_args : uint; flags : uint; end; + {$ENDIF} Pzend_module_entry = ^Tzend_module_entry; p_zend_module_entry = ^_zend_module_entry; _zend_module_entry = record @@ -1445,12 +1409,12 @@ zend_compiler_globals = record active_op_array : pointer; - function_table : PHashTable; // function symbol table - class_table : PHashTable; // class table + function_table : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; // function symbol table + class_table : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; // class table - filenames_table : THashTable; + filenames_table : {$IFDEF PHP7} zend_array {$ELSE} THashTable{$ENDIF}; - auto_globals : PHashTable; + auto_globals : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; in_compilation : zend_bool; short_tags : zend_bool; @@ -1520,7 +1484,7 @@ type _zend_property_info = record Pzend_executor_globals = ^zend_executor_globals; zend_executor_globals = record - return_value_ptr_ptr : {$IFNDEF PHP700} ppzval{$ELSE} pzval{$ENDIF}; + return_value_ptr_ptr : {$IFNDEF PHP7} ppzval{$ELSE} pzval{$ENDIF}; uninitialized_zval : zval; uninitialized_zval_ptr : pzval; @@ -1543,9 +1507,9 @@ zend_executor_globals = record {$ENDIF} active_symbol_table : PHashTable; - symbol_table : THashTable; // main symbol table + symbol_table : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; // main symbol table - included_files : THashTable; // files already included */ + included_files : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; // files already included */ {$IFDEF PHP4} bailout : jump_buf; @@ -1559,9 +1523,9 @@ zend_executor_globals = record active_op_array : pointer; - function_table : PHashTable; // function symbol table */ - class_table : PHashTable; // class table - zend_constants : PHashTable; // constants table */ + function_table : {$IFDEF PHP7}Pzval{$ELSE}PHashTable{$ENDIF}; // function symbol table */ + class_table : {$IFDEF PHP7}Pzval{$ELSE}PHashTable{$ENDIF}; // class table + zend_constants : {$IFDEF PHP7}Pzval{$ELSE}PHashTable{$ENDIF}; // constants table */ {$IFDEF PHP5} scope : pointer; @@ -1594,8 +1558,8 @@ zend_executor_globals = record timed_out : zend_bool; - regular_list : THashTable; - persistent_list : ThashTable; + regular_list : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; + persistent_list : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; argument_stack : zend_ptr_stack; diff --git a/Source/hzend_types.pas b/Source/hzend_types.pas new file mode 100644 index 0000000..b24c349 --- /dev/null +++ b/Source/hzend_types.pas @@ -0,0 +1,3024 @@ +unit hzend_types; + +interface + +uses Winapi.Windows; + +var + _TestCreate:Pointer; + +const +{#define IS_UNDEF 0 +#define IS_NULL 1 +#define IS_FALSE 2 +#define IS_TRUE 3 +#define IS_LONG 4 +#define IS_DOUBLE 5 +#define IS_STRING 6 +#define IS_ARRAY 7 +#define IS_OBJECT 8 +#define IS_RESOURCE 9 +#define IS_REFERENCE 10} + + E_ERROR = 1 shl 0; + E_WARNING = 1 shl 1; + E_PARSE = 1 shl 2; + E_NOTICE = 1 shl 3; + E_CORE_ERROR = 1 shl 4; + E_CORE_WARNING = 1 shl 5; + E_COMPILE_ERROR = 1 shl 6; + E_COMPILE_WARNING = 1 shl 7; + E_USER_ERROR = 1 shl 8; + E_USER_WARNING = 1 shl 9; + E_USER_NOTICE = 1 shl 10; + E_STRICT = 1 shl 11; + E_RECOVERABLE_ERROR = 1 shl 12; + E_DEPRECATED = 1 shl 13; + E_USER_DEPRECATED = 1 shl 14; + E_ALL = (((((((((((((E_ERROR or E_WARNING) or E_PARSE) or E_NOTICE) or E_CORE_ERROR) or E_CORE_WARNING) or E_COMPILE_ERROR) or E_COMPILE_WARNING) or E_USER_ERROR) or E_USER_WARNING) or E_USER_NOTICE) or E_RECOVERABLE_ERROR) or E_DEPRECATED) or E_USER_DEPRECATED) or E_STRICT; + E_CORE = E_CORE_ERROR or E_CORE_WARNING; + + + ZEND_INI_USER = 1 shl 0; + ZEND_INI_PERDIR = 1 shl 1; + ZEND_INI_SYSTEM = 1 shl 2; + ZEND_INI_ALL = (ZEND_INI_USER or ZEND_INI_PERDIR or ZEND_INI_SYSTEM); + + + ZEND_INI_DISPLAY_ORIG = 1 ; + ZEND_INI_DISPLAY_ACTIVE= 2 ; + + ZEND_INI_STAGE_STARTUP = 1 or 0; + ZEND_INI_STAGE_SHUTDOWN = 1 or 1; +ZEND_INI_STAGE_ACTIVATE = 1 or 2; + ZEND_INI_STAGE_DEACTIVATE = 1 or 3; +ZEND_INI_STAGE_RUNTIME = 1 or 4; +ZEND_INI_STAGE_HTACCESS = 1 or 5; + + + IS_UNDEF = 0 ; + IS_NULL = 1 ; + IS_FALSE = 2 ; + IS_TRUE = 3 ; + IS_LONG = 4 ; + IS_DOUBLE = 5 ; + IS_STRING = 6 ; + IS_ARRAY = 7 ; + IS_OBJECT = 8 ; + IS_RESOURCE = 9 ; + IS_REFERENCE = 10 ; + + + IS_CONSTANT = 11 ; + IS_CONSTANT_AST = 12 ; + + + IS_BOOL = 13 ; + IS_CALLABLE = 14 ; + + IS_INDIRECT = 15 ; + IS_PTR = 17 ; + // IS_BOOL = 4; + + IS_TYPE_CONSTANT = (1 SHL 0); + IS_TYPE_IMMUTABLE = (1 SHL 1) ; + IS_TYPE_REFCOUNTED = (1 SHL 2) ; +IS_TYPE_COLLECTABLE = (1 SHL 3); + IS_TYPE_COPYABLE = (1 SHL 4) ; + IS_TYPE_SYMBOLTABLE = (1 SHL 5) ; + +Z_TYPE_FLAGS_SHIFT = 8 ; +Z_CONST_FLAGS_SHIFT = 16; + + + + + + IS_STRING_EX = IS_STRING or ((IS_TYPE_REFCOUNTED or IS_TYPE_COPYABLE) shl Z_TYPE_FLAGS_SHIFT); + + + + SUCCESS = 0; + FAILURE = -1; + + + + HASH_UPDATE = 1 SHL 0; + HASH_ADD = 1 SHL 1; + HASH_NEXT_INSERT = 1 SHL 2; + + HASH_DEL_KEY = 0; + HASH_DEL_INDEX = 1; + HASH_DEL_KEY_QUICK = 2; + + ZEND_AST_SPECIAL_SHIFT = 6; +ZEND_AST_IS_LIST_SHIFT = 7; +ZEND_AST_NUM_CHILDREN_SHIFT = 8; + + PHP_API_VERSION = 20151012 ; + YYDEBUG = 0 ; + PHP_DEFAULT_CHARSET = 'UTF-8'; + + MODULE_PERSISTENT = 1; + MODULE_TEMPORARY = 2; + + SAPI_HEADER_ADD = 1 shr 0; + + SAPI_HEADER_SENT_SUCCESSFULLY = 1 ; +SAPI_HEADER_DO_SEND = 2 ; + SAPI_HEADER_SEND_FAILED = 3 ; + + SAPI_DEFAULT_MIMETYPE = 'text/html'; + SAPI_DEFAULT_CHARSET = PHP_DEFAULT_CHARSET; + SAPI_PHP_VERSION_HEADER = 'X-Powered-By: PHP/" PHP_VERSION'; + + +type + pppointer = ^ppointer; + + + + + + _zend_ast_kind = (ZEND_AST_ZVAL_ = 1 shl ZEND_AST_SPECIAL_SHIFT,ZEND_AST_ZNODE_,ZEND_AST_FUNC_DECL, + ZEND_AST_CLOSURE,ZEND_AST_METHOD,ZEND_AST_CLASS, + ZEND_AST_ARG_LIST = 1 shl ZEND_AST_IS_LIST_SHIFT,ZEND_AST_LIST_,ZEND_AST_ARRAY, + ZEND_AST_ENCAPS_LIST,ZEND_AST_EXPR_LIST, + ZEND_AST_STMT_LIST,ZEND_AST_IF,ZEND_AST_SWITCH_LIST, + ZEND_AST_CATCH_LIST,ZEND_AST_PARAM_LIST, + ZEND_AST_CLOSURE_USES,ZEND_AST_PROP_DECL, + ZEND_AST_CONST_DECL,ZEND_AST_CLASS_CONST_DECL, + ZEND_AST_NAME_LIST,ZEND_AST_TRAIT_ADAPTATIONS, + ZEND_AST_USE,ZEND_AST_MAGIC_CONST = 0 shl ZEND_AST_NUM_CHILDREN_SHIFT, + ZEND_AST_TYPE,ZEND_AST_VAR = 1 shl ZEND_AST_NUM_CHILDREN_SHIFT,ZEND_AST_CONST, + ZEND_AST_UNPACK,ZEND_AST_UNARY_PLUS,ZEND_AST_UNARY_MINUS, + ZEND_AST_CAST,ZEND_AST_EMPTY,ZEND_AST_ISSET, + ZEND_AST_SILENCE,ZEND_AST_SHELL_EXEC,ZEND_AST_CLONE, + ZEND_AST_EXIT,ZEND_AST_PRINT,ZEND_AST_INCLUDE_OR_EVAL, + ZEND_AST_UNARY_OP,ZEND_AST_PRE_INC,ZEND_AST_PRE_DEC, + ZEND_AST_POST_INC,ZEND_AST_POST_DEC,ZEND_AST_YIELD_FROM, + ZEND_AST_GLOBAL,ZEND_AST_UNSET,ZEND_AST_RETURN, + ZEND_AST_LABEL,ZEND_AST_REF_,ZEND_AST_HALT_COMPILER, + ZEND_AST_ECHO,ZEND_AST_THROW,ZEND_AST_GOTO, + ZEND_AST_BREAK,ZEND_AST_CONTINUE,ZEND_AST_DIM = 2 shl ZEND_AST_NUM_CHILDREN_SHIFT, + ZEND_AST_PROP,ZEND_AST_STATIC_PROP,ZEND_AST_CALL, + ZEND_AST_CLASS_CONST,ZEND_AST_ASSIGN,ZEND_AST_ASSIGN_REF, + ZEND_AST_ASSIGN_OP,ZEND_AST_BINARY_OP,ZEND_AST_GREATER, + ZEND_AST_GREATER_EQUAL,ZEND_AST_AND,ZEND_AST_OR, + ZEND_AST_ARRAY_ELEM,ZEND_AST_NEW,ZEND_AST_INSTANCEOF, + ZEND_AST_YIELD,ZEND_AST_COALESCE,ZEND_AST_STATIC, + ZEND_AST_WHILE,ZEND_AST_DO_WHILE,ZEND_AST_IF_ELEM, + ZEND_AST_SWITCH,ZEND_AST_SWITCH_CASE,ZEND_AST_DECLARE, + ZEND_AST_CONST_ELEM,ZEND_AST_USE_TRAIT, + ZEND_AST_TRAIT_PRECEDENCE,ZEND_AST_METHOD_REFERENCE, + ZEND_AST_NAMESPACE,ZEND_AST_USE_ELEM,ZEND_AST_TRAIT_ALIAS, + ZEND_AST_GROUP_USE,ZEND_AST_METHOD_CALL = 3 shl ZEND_AST_NUM_CHILDREN_SHIFT, + ZEND_AST_STATIC_CALL,ZEND_AST_CONDITIONAL, + ZEND_AST_TRY,ZEND_AST_CATCH,ZEND_AST_PARAM, + ZEND_AST_PROP_ELEM,ZEND_AST_FOR = 4 shl ZEND_AST_NUM_CHILDREN_SHIFT,ZEND_AST_FOREACH + ); + plongint = ^longint; + + P_zend_objects_store = ^_zend_objects_store; + Pzend_objects_store = ^zend_objects_store; + uint32_t = CARDINAL; + + + zend_pchar = {$IFDEF PHP_UNICE}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; + zend_pstr = {$IFDEF PHP_UNICE}PUtf8String{$ELSE}PAnsiString{$ENDIF}; + + //zend_uchar = {$IFDEF PHP_UNICE}Utf8Char{$ELSE}AnsiChar{$ENDIF}; + zend_ustr = {$IFDEF PHP_UNICE}Utf8String{$ELSE}AnsiString{$ENDIF}; + + + + + + + + + P_zend_object = ^_zend_object; + PP_zend_object = ^P_zend_object; + PPP_zend_object = ^PP_zend_object; + Pzend_object = ^_zend_object; + PPzend_object = ^P_zend_object; + PPPzend_object = ^PP_zend_object; + + P_zend_refcounted = ^_zend_refcounted; + P_zend_string = ^_zend_string; + PP_zend_string = ^P_zend_string; + PPP_zend_string = ^PP_zend_string; + Pzend_string = ^_zend_string; + PPzend_string = ^P_zend_string; + PPPzend_string = ^PP_zend_string; + + Pzend_mm_chunk_alloc_t = ^zend_mm_chunk_alloc_t; + P_zend_resource = ^_zend_resource; + PP_zend_resource =^P_zend_resource; + PPP_zend_resource =^PP_zend_resource; + Pzend_resource = ^_zend_resource; + PPzend_resource =^P_zend_resource; + PPPzend_resource =^PP_zend_resource; + P_zend_ast_ref = ^_zend_ast_ref; + P_zend_reference = ^_zend_reference; + P_zend_array = ^_zend_array; + PP_zend_array = ^P_zend_array; + PPP_zend_array = ^PP_zend_array; + Pzend_array = ^_zend_array; + PPzend_array = ^P_zend_array; + PPPzend_array = ^PP_zend_array; + + P_zval_struct = ^_zval_struct; + P_zend_function = ^_zend_function; + PP_zend_function = ^P_zend_function; + PPP_zend_function = ^PP_zend_function; + Pzend_function = ^_zend_function; + PPzend_function = ^P_zend_function; + PPPzend_function = ^PP_zend_function; + P_zend_value = ^_zend_value; + Pzend_ast_kind = ^zend_ast_kind; + zend_ast_kind = Word; + Pzend_ast_attr = ^zend_ast_attr; + zend_ast_attr = Word; + Pzend_bool = ^zend_bool; + zend_bool = byte; + Pzend_uchar = ^zend_uchar; + zend_uchar = byte; + zend_long = integer; + Pzend_long = ^zend_long; + PPzend_long = ^Pzend_long; + Pzend_stack = ^zend_stack; + P_zend_stack = ^_zend_stack; + + + zend_ulong = FixedUInt; + P_zend_ulong = ^zend_ulong; + zend_off_t = integer; + Pzend_off_t = ^zend_off_t; + PPzend_off_t = ^Pzend_off_t; + P_zend_mm_huge_list = ^_zend_mm_huge_list; + + P_zend_mm_free_slot = ^_zend_mm_free_slot; + P_zend_mm_bin = ^_zend_mm_bin; + P_zend_mm_page = ^_zend_mm_page; + P_zend_mm_chunk = ^_zend_mm_chunk; + P_zend_mm_heap = ^_zend_mm_heap; + PP_zend_mm_heap = ^P_zend_mm_heap; + PPP_zend_mm_heap = ^PP_zend_mm_heap; + Pzend_mm_heap = ^_zend_mm_heap; + PPzend_mm_heap = ^P_zend_mm_heap; + PPPzend_mm_heap = ^PP_zend_mm_heap; + P_zend_mm_debug_info = ^_zend_mm_debug_info; + + Pzend_ini_entry_def = ^zend_ini_entry_def; + + P_zend_ini_entry = ^_zend_ini_entry; + P_zend_ini_entry_def = ^_zend_ini_entry_def; + + zend_uint = uint; + zend_ushort = ushort; + Pzend_value = ^zend_value; + Pzend_file_handle = ^zend_file_handle; + P_zend_ast = ^_zend_ast; + P_zend_ast_list = ^_zend_ast_list; + Pzend_ast_list = ^zend_ast_list; + Pzend_ast_decl = ^zend_ast_decl; + P_zend_ast_zval = ^_zend_ast_zval; + Pzend_ast_zval = ^zend_ast_zval; + P_zend_ast_decl = ^_zend_ast_decl; + PHashTable = Pzend_array; + PPHashTable = ^PHashTable; + Pzend_intptr_t = ^zend_intptr_t; + Pzend_uintptr_t = ^zend_uintptr_t; + pzval = ^zval; + ppzval = ^pzval; + pppzval = ^ppzval; + Pzend_utility_values = ^zend_utility_values; + Pzend_utility_functions = ^zend_utility_functions; + Pzend_trait_alias = ^zend_trait_alias; + Pzend_trait_precedence = ^zend_trait_precedence; + Pzend_trait_method_reference = ^zend_trait_method_reference; + PZEND_RESULT_CODE = ^ZEND_RESULT_CODE; + P_zend_serialize_data = ^_zend_serialize_data; + P_zend_unserialize_data = ^_zend_unserialize_data; + P_zend_trait_method_reference = ^_zend_trait_method_reference; + P_zend_trait_precedence = ^_zend_trait_precedence; + P_zend_trait_alias = ^_zend_trait_alias; + P_zend_class_entry = ^_zend_class_entry; + PP_zend_class_entry = ^P_zend_class_entry; + PPP_zend_class_entry = ^PP_zend_class_entry; + Pzend_class_entry = ^_zend_class_entry; + PPzend_class_entry = ^P_zend_class_entry; + PPPzend_class_entry = ^PP_zend_class_entry; + + P_zend_utility_functions = ^_zend_utility_functions; + P_zend_utility_values = ^_zend_utility_values; + Pzend_error_handling_t = ^zend_error_handling_t; + Pzend_error_handling = ^zend_error_handling; + Pzend_stream_type = ^zend_stream_type; + + P_zend_op = ^_zend_op; + P_zend_execute_data = ^_zend_execute_data; + PP_zend_execute_data = ^P_zend_execute_data; + PPP_zend_execute_data = ^PP_zend_execute_data; + Pzend_execute_data = ^_zend_execute_data; + PPzend_execute_data = ^P_zend_execute_data; + PPPzend_execute_data = ^PP_zend_execute_data; + P_zend_function_entry = ^_zend_function_entry; + P_zend_fcall_info_cache = ^_zend_fcall_info_cache; + Pzend_function_entry = ^zend_function_entry; + Pzend_declarables = ^zend_declarables; + Pzend_ast_znode = ^zend_ast_znode; + Pznode = ^znode; + Pznode_op = ^znode_op; + Pzend_stream = ^zend_stream; + Pzend_mmap = ^zend_mmap; + Pzend_fcall_info_cache = ^zend_fcall_info_cache; + P_zend_mmap = ^_zend_mmap; + P_zend_stream = ^_zend_stream; + P_zend_file_handle = ^_zend_file_handle; + P_znode_op = ^_znode_op; + P_znode = ^_znode; + P_zend_ast_znode = ^_zend_ast_znode; + P_zend_declarables = ^_zend_declarables; + P_zend_oparray_context = ^_zend_oparray_context; + Pzend_internal_function_info = ^zend_internal_function_info; + Pzend_arg_info = ^zend_arg_info; + Pzend_internal_arg_info = ^zend_internal_arg_info; + Pzend_property_info = ^zend_property_info; + Pzend_try_catch_element = ^zend_try_catch_element; + Pzend_label = ^zend_label; + Pzend_closure = ^zend_closure; + P_zend_closure = ^_zend_closure; + P_zend_multibyte_functions = ^_zend_multibyte_functions; + Pzend_encoding_internal_encoding_getter = ^zend_encoding_internal_encoding_getter; + Pzend_encoding_detector = ^zend_encoding_detector; + + Pzend_brk_cont_element = ^zend_brk_cont_element; + Pzend_parser_stack_elem = ^zend_parser_stack_elem; + Pzend_file_context = ^zend_file_context; + Pzend_oparray_context = ^zend_oparray_context; + P_zend_file_context = ^_zend_file_context; + P_zend_parser_stack_elem = ^_zend_parser_stack_elem; + P_zend_brk_cont_element = ^_zend_brk_cont_element; + P_zend_label = ^_zend_label; + P_zend_try_catch_element = ^_zend_try_catch_element; + P_zend_property_info = ^_zend_property_info; + P_zend_internal_arg_info = ^_zend_internal_arg_info; + P_zend_arg_info = ^_zend_arg_info; + P_zend_internal_function_info = ^_zend_internal_function_info; + P_zend_op_array = ^_zend_op_array; + PP_zend_op_array = ^P_zend_op_array; + PPP_zend_op_array = ^PP_zend_op_array; + Pzend_op_array = ^_zend_op_array; + PPzend_op_array = ^P_zend_op_array; + PPPzend_op_array = ^PP_zend_op_array; + PHashTableIterator = ^HashTableIterator; + P_zend_object_handlers = ^_zend_object_handlers; + PBucket = ^Bucket; + Pzend_refcounted_h = ^zend_refcounted_h; + Pzend_auto_global = ^zend_auto_global; + Pzend_internal_function = ^zend_internal_function; + P_zend_internal_function = ^_zend_internal_function; + P_zend_call_kind = ^_zend_call_kind; + P_zend_auto_global = ^_zend_auto_global; + P_zend_refcounted_h = ^_zend_refcounted_h; + P_Bucket = ^_Bucket; + PHashPosition = ^HashPosition; + P_HashTableIterator = ^_HashTableIterator; + Pzend_object_read_property_t = ^zend_object_read_property_t; + Pzend_object_read_dimension_t = ^zend_object_read_dimension_t; + Pzend_object_get_property_ptr_ptr_t = ^zend_object_get_property_ptr_ptr_t; + Pzend_object_get_t = ^zend_object_get_t; + Pzend_object_get_properties_t = ^zend_object_get_properties_t; + Pzend_object_get_method_t = ^zend_object_get_method_t; + Pzend_object_get_constructor_t = ^zend_object_get_constructor_t; + Pzend_object_get_debug_info_t = ^zend_object_get_debug_info_t; + Pzend_call_kind = ^zend_call_kind; + Pzend_object_clone_obj_t = ^zend_object_clone_obj_t; + Pzend_object_get_class_name_t = ^zend_object_get_class_name_t; + Pzend_object_get_gc_t = ^zend_object_get_gc_t; + P_zend_class_iterator_funcs = ^_zend_class_iterator_funcs; + P_zend_object_iterator_funcs = ^_zend_object_iterator_funcs; + Pzend_object_iterator_funcs = ^zend_object_iterator_funcs; + P_zend_arena = ^_zend_arena; + Pzend_leak_info = ^zend_leak_info; + Pzend_mm_debug_info = ^zend_mm_debug_info; + Pzend_mm_handlers = ^zend_mm_handlers; + P_zend_mm_storage = ^_zend_mm_storage; + P_zend_mm_handlers = ^_zend_mm_handlers; + P_zend_leak_info = ^_zend_leak_info; + P_zend_object_iterator = ^_zend_object_iterator; + PP_zend_object_iterator = ^P_zend_object_iterator; + PPP_zend_object_iterator = ^PP_zend_object_iterator; + Pzend_object_iterator = ^_zend_object_iterator; + PPzend_object_iterator = ^P_zend_object_iterator; + PPPzend_object_iterator = ^PP_zend_object_iterator; + Pzend_class_iterator_funcs = ^zend_class_iterator_funcs; + P_zend_module_dep = ^_zend_module_dep; + P_zend_module_entry = ^_zend_module_entry; + PP_zend_module_entry = ^P_zend_module_entry; + PPP_zend_module_entry = ^PP_zend_module_entry; + Pzend_module_entry = ^_zend_module_entry; + PPzend_module_entry = ^P_zend_module_entry; + PPPzend_module_entry = ^PP_zend_module_entry; + psmart_str = ^Tsmart_str; + + Psapi_globals_struct = ^sapi_globals_struct; + Psapi_header_struct = ^sapi_header_struct; + Psapi_headers_struct = ^sapi_headers_struct; + Pzend_mm_chunk_free_t = ^zend_mm_chunk_free_t; + Pzend_mm_chunk_truncate_t = ^zend_mm_chunk_truncate_t; + Pzend_mm_chunk_extend_tt = ^zend_mm_chunk_extend_t; + Psapi_request_info = ^sapi_request_info; + P_sapi_globals_struct = ^_sapi_globals_struct; + Psapi_header_line = ^sapi_header_line; + Psapi_header_op_enum = ^sapi_header_op_enum; + P_sapi_module_struct = ^_sapi_module_struct; + PP_sapi_module_struct = ^P_sapi_module_struct; + PPP_sapi_module_struct = ^PP_sapi_module_struct; + Psapi_module_struct = ^_sapi_module_struct; + PPsapi_module_struct = ^P_sapi_module_struct; + PPPsapi_module_struct = ^PP_sapi_module_struct; + P_sapi_post_entry = ^_sapi_post_entry; + PP_sapi_post_entry = ^P_sapi_post_entry; + PPP_sapi_post_entry = ^PP_sapi_post_entry; + Psapi_post_entry = ^_sapi_post_entry; + PPsapi_post_entry = ^P_sapi_post_entry; + PPPsapi_post_entry = ^PP_sapi_post_entry; + Pphp_stream_dirent = ^php_stream_dirent; + Pphp_stream_ops = ^php_stream_ops; + P_php_stream = ^_php_stream; + PP_php_stream = ^P_php_stream; + PPP_php_stream = ^PP_php_stream; + Pphp_stream = ^_php_stream; + PPphp_stream = ^P_php_stream; + PPPphp_stream = ^PP_php_stream; + P_php_stream_wrapper = ^_php_stream_wrapper; + PP_php_stream_wrapper = ^P_php_stream_wrapper; + PPP_php_stream_wrapper = ^PP_php_stream_wrapper; + Pphp_stream_wrapper = ^_php_stream_wrapper; + PPphp_stream_wrapper = ^P_php_stream_wrapper; + PPPphp_stream_wrapper = ^PP_php_stream_wrapper; + P_php_stream_wrapper_ops = ^_php_stream_wrapper_ops; + P_php_stream_ops = ^_php_stream_ops; + P_php_stream_statbuf = ^_php_stream_statbuf; + Pzend_llist = ^zend_llist; + Pzend_llist_element = ^zend_llist_element; + P_zend_llist_element = ^_zend_llist_element; + P_zend_llist = ^_zend_llist; + Pzend_llist_position = ^zend_llist_position; + Pphp_stream_filter_ops = ^php_stream_filter_ops; + Pphp_stream_filter_chain = ^php_stream_filter_chain; + Pphp_stream_filter_factory = ^php_stream_filter_factory; + P_php_stream_filter_factory = ^_php_stream_filter_factory; + P_php_stream_filter = ^_php_stream_filter; + PP_php_stream_filter = ^P_php_stream_filter; + PPP_php_stream_filter = ^PP_php_stream_filter; + Pphp_stream_filter = ^_php_stream_filter; + PPphp_stream_filter = ^P_php_stream_filter; + PPPphp_stream_filter = ^PP_php_stream_filter; + P_php_stream_filter_chain = ^_php_stream_filter_chain; + P_php_stream_filter_ops = ^_php_stream_filter_ops; + Pphp_stream_filter_status_t = ^php_stream_filter_status_t; + P_php_stream_bucket_brigade = ^_php_stream_bucket_brigade; + PP_php_stream_bucket_brigade = ^P_php_stream_bucket_brigade; + PPP_php_stream_bucket_brigade = ^PP_php_stream_bucket_brigade; + Pphp_stream_bucket_brigade = ^_php_stream_bucket_brigade; + PPphp_stream_bucket_brigade = ^P_php_stream_bucket_brigade; + PPPphp_stream_bucket_brigade = ^PP_php_stream_bucket_brigade; + P_php_stream_bucket = ^_php_stream_bucket; + PP_php_stream_bucket = ^P_php_stream_bucket; + PPP_php_stream_bucket = ^PP_php_stream_bucket; + Pphp_stream_bucket = ^_php_stream_bucket; + PPphp_stream_bucket = ^P_php_stream_bucket; + PPPphp_stream_bucket = ^PP_php_stream_bucket; + Puid_t = ^uid_t; + uid_t = longint; + Pphp_stream_wrapper_ops = ^php_stream_wrapper_ops; zend_encoding = pointer ; + Pzend_encoding= ^zend_encoding; + PPzend_encoding = ^Pzend_encoding; + PPPzend_encoding = ^PPzend_encoding; + Pgid_t = ^gid_t; + gid_t = longint; +Pzend_ptr_stack = ^zend_ptr_stack; + P_zend_ptr_stack = ^_zend_ptr_stack; + Pzend_free_op = ^zend_free_op; + zend_free_op = Pzval; + + Pzend_vm_stack = ^_zend_vm_stack; + Pzend_ini_parser_param = ^zend_ini_parser_param; + P_zend_ini_parser_param = ^_zend_ini_parser_param; + + P_zend_php_scanner_globals = ^_zend_php_scanner_globals; + Pzend_php_scanner_event = ^zend_php_scanner_event; + zend_php_scanner_event = (ON_TOKEN,ON_FEEDBACK,ON_STOP); + P_zend_ini_scanner_globals = ^_zend_ini_scanner_globals; + P_zend_executor_globals = ^_zend_executor_globals; + P_zend_compiler_globals = ^_zend_compiler_globals; + + + Pcaddr_t = ^caddr_t; + caddr_t = zend_pchar; + _zend_fcall_info_cache = record + initialized : zend_bool; + function_handler : P_zend_function; + calling_scope : P_zend_class_entry; + called_scope : P_zend_class_entry; + _object : P_zend_object; + end; + zend_fcall_info_cache = _zend_fcall_info_cache; + Pphp_stream_statbuf = ^php_stream_statbuf; + P_php_stream_notifier = ^_php_stream_notifier; + P_php_stream_context = ^_php_stream_context; + PP_php_stream_context = ^P_php_stream_context; + PPP_php_stream_context = ^PP_php_stream_context; + Pphp_stream_context = ^_php_stream_context; + PPphp_stream_context = ^P_php_stream_context; + PPPphp_stream_context = ^PP_php_stream_context; + + P_php_stream_dirent = ^_php_stream_dirent; + + PP_zend_llist_element = ^P_zend_llist_element; + PPP_zend_llist_element = ^PP_zend_llist_element; + + zend_stat_t = pointer; + P_zend_stat_t =^zend_stat_t; + PP_zend_stat_t = ^P_zend_stat_t; + PPP_zend_stat_t = ^PP_zend_stat_t; + _zend_value = Packed record + case longint of + 0 : ( lval : zend_long ); + 1 : ( dval : double ); + 2 : ( counted : P_zend_refcounted ); + 3 : ( str : Pzend_string ); + 4 : ( arr : Pzend_array ); + 5 : ( obj : Pzend_object ); + 6 : ( res : Pzend_resource ); + 7 : ( ref : P_zend_reference ); + 8 : ( ast : P_zend_ast_ref ); + 9 : ( zv : Pzval ); + 10 : ( ptr : pointer ); + 11 : ( ce : P_zend_class_entry ); + 12 : ( func : P_zend_function ); + 13 : ( ww : Packed record + w1 : cardinal; + w2 : cardinal; + end ); + end; + zend_value = _zend_value; + + _zval_struct = Packed record + value : zend_value; + u1 : Packed record + case longint of + 0 : ( v : record + _type : zend_uchar; + type_flags : zend_uchar; + const_flags : zend_uchar; + reserved : zend_uchar; + end ); + 1 : ( type_info : cardinal ); + end; + u2 : Packed record + case longint of + 0 : ( var_flags : LongWord ); + 1 : ( next : cardinal ); + 2 : ( cache_slot : cardinal ); + 3 : ( lineno : cardinal ); + 4 : ( num_args : cardinal ); + 5 : ( fe_pos : cardinal ); + 6 : ( fe_iter_idx : cardinal ); + end; + end; + zval = _zval_struct; + + + compare_func_t = function (_para1:pointer; _para2:pointer):longint;cdecl; + + swap_func_t = procedure (_para1:pointer; _para2:pointer);cdecl; + + sort_func_t = procedure (_para1:pointer; _para2:size_t; _para3:size_t; _para4:compare_func_t; _para5:swap_func_t);cdecl; + + dtor_func_t = procedure (pDest:pzval);cdecl; + + copy_ctor_func_t = procedure (pElement:pzval);cdecl; + + + P_zend_vm_stack = ^_zend_vm_stack; + + _zend_vm_stack = record + top : Pzval; + _end : Pzval; + prev : POINTER; + end; + + + _zend_refcounted_h = record + refcount : cardinal; + u : record + case longint of + 0 : ( v : record + _type : zend_uchar; + flags : zend_uchar; + gc_info : word; + end ); + 1 : ( type_info : cardinal ); + end; + end; + + + zend_refcounted_h = _zend_refcounted_h; + + _zend_refcounted = record + gc : zend_refcounted_h; + end; + zend_refcounted = _zend_refcounted; + + + + _zend_string = record + gc : zend_refcounted_h; + h : zend_ulong; + len : size_t; + val : zend_pchar; + end; + zend_string = _zend_string; + + _Bucket = record + val : zval; + h : zend_ulong; + key : P_zend_string; + end; + Bucket = _Bucket; + _zend_ini_entry = record + name : P_zend_string; + on_modify : pointer; + mh_arg1 : pointer; + mh_arg2 : pointer; + mh_arg3 : pointer; + value : P_zend_string; + orig_value : P_zend_string; + displayer : procedure (ini_entry:p_zend_ini_entry; _type:longint);cdecl; + modifiable : longint; + orig_modifiable : longint; + modified : longint; + module_number : longint; + end; + + _zend_ini_entry_def = record + name : zend_pchar; + on_modify : pointer; + mh_arg1 : pointer; + mh_arg2 : pointer; + mh_arg3 : pointer; + value : zend_pchar; + displayer : procedure (ini_entry:p_zend_ini_entry; _type:longint);cdecl; + modifiable : longint; + name_length : uint; + value_length : uint; + end; + zend_ini_entry_def = _zend_ini_entry_def; +zend_ini_parser_cb_t = procedure (arg1:pzval; arg2:pzval; arg3:pzval; callback_type:longint; arg:pointer);cdecl; + + + + _zend_array = record + gc : zend_refcounted_h; + u : record + case longint of + 0 : ( v : record + flags : zend_uchar; + nApplyCount : zend_uchar; + nIteratorsCount : zend_uchar; + reserve : zend_uchar; + end ); + 1 : ( flags : cardinal ); + end; + nTableMask : cardinal; + arData : PBucket; + nNumUsed : cardinal; + nNumOfElements : cardinal; + nTableSize : cardinal; + nInternalPointer : cardinal; + nNextFreeElement : zend_long; + pDestructor : dtor_func_t; + end; + HashTable = _zend_array ; + zend_array = _zend_array; + + _zend_ast = record + kind : zend_ast_kind; + attr : zend_ast_attr; + lineno : Cardinal; + child : array[0..0] of P_zend_ast; + end; + + zend_ast = _zend_ast; + pzend_ast = ^zend_ast; + ppzend_ast = ^pzend_ast; + pppzend_ast = ^ppzend_ast; + + _zend_ast_list = record + kind : zend_ast_kind; + attr : zend_ast_attr; + lineno : Cardinal; + children : Cardinal; + child : array[0..0] of P_zend_ast; + end; + zend_ast_list = _zend_ast_list; + + + + + P_zend_fcall_info = ^_zend_fcall_info; + _zend_fcall_info = record + size : size_t; + function_table : PHashTable; + function_name : zval; + symbol_table : P_zend_array; + retval : Pzval; + params : Pzval; + _object : P_zend_object; + no_separation : zend_bool; + param_count : cardinal; + end; + zend_fcall_info = _zend_fcall_info; + Pzend_fcall_info = ^zend_fcall_info; + + + _zend_ast_zval = record + kind : zend_ast_kind; + attr : zend_ast_attr; + val : zval; + end; + zend_ast_zval = _zend_ast_zval; + + _zend_ast_decl = record + kind : zend_ast_kind; + attr : zend_ast_attr; + start_lineno : Cardinal; + end_lineno : Cardinal; + flags : Cardinal; + lex_pos : Pbyte; + doc_comment : P_zend_string; + name : P_zend_string; + child : array[0..3] of P_zend_ast; + end; + zend_ast_decl = _zend_ast_decl; + + zend_ast_process_t = procedure (ast:pzend_ast);cdecl; + + + zend_ast_apply_func = procedure (ast_ptr:pPzend_ast);cdecl; + + + + + + {$IFDEF _WIN64} + IntPtr = Int64; + UIntPtr = UInt64; + {$ELSE} + IntPtr = Longint; + UIntPtr = LongWord; + {$ENDIF} + + + + uintptr_t = Cardinal; + + + ZEND_RESULT_CODE = (SUCCESS_ = 0,FAILURE_ = -(1)); + + zend_intptr_t = intptr; + + zend_uintptr_t = uintptr_t; + //zend_object_handlers = _zend_object_handlers; + + + // Pzend_function = ^zend_function; + + + Pzend_mm_page_info = ^zend_mm_page_info; + zend_mm_page_info = uint32_t; + + + Pzend_mm_bitset = ^zend_mm_bitset; + zend_mm_bitset = zend_ulong; + + + + + + + + + _zend_serialize_data = record end; + + _zend_unserialize_data = record end; + + zend_serialize_data = _zend_serialize_data; + zend_unserialize_data = _zend_unserialize_data; + + _zend_trait_method_reference = record + method_name : P_zend_string; + ce : P_zend_class_entry; + class_name : P_zend_string; + end; + zend_trait_method_reference = _zend_trait_method_reference; + + + hgerhrh343erg = record + case longint of + 0 : ( ce : P_zend_class_entry ); + 1 : ( class_name : P_zend_string ); + end; + _zend_trait_precedence = record + trait_method : Pzend_trait_method_reference; + exclude_from_classes : ^hgerhrh343erg; + end; + zend_trait_precedence = _zend_trait_precedence; + + _zend_trait_alias = record + trait_method : Pzend_trait_method_reference; + alias : P_zend_string; + modifiers : Cardinal; + end; + zend_trait_alias = _zend_trait_alias; + + _zend_class_iterator_funcs = record + funcs : Pzend_object_iterator_funcs; + zf_new_iterator : P_zend_function; + zf_valid : P_zend_function; + zf_current : P_zend_function; + zf_key : P_zend_function; + zf_next : P_zend_function; + zf_rewind : P_zend_function; + end; + zend_class_iterator_funcs = _zend_class_iterator_funcs; + + _zend_class_entry = record + _type : char; + name : P_zend_string; + parent : P_zend_class_entry; + refcount : longint; + ce_flags : Cardinal; + default_properties_count : longint; + default_static_members_count : longint; + default_properties_table : Pzval; + default_static_members_table : Pzval; + static_members_table : Pzval; + function_table : HashTable; + properties_info : HashTable; + constants_table : HashTable; + _constructor : P_zend_function; + _destructor : P_zend_function; + clone : P_zend_function; + __get : P_zend_function; + __set : P_zend_function; + __unset : P_zend_function; + __isset : P_zend_function; + __call : P_zend_function; + __callstatic : P_zend_function; + __tostring : P_zend_function; + __debugInfo : P_zend_function; + serialize_func : P_zend_function; + unserialize_func : P_zend_function; + iterator_funcs : zend_class_iterator_funcs; + create_object : function (class_type:p_zend_class_entry):P_zend_object;cdecl; + get_iterator : function (ce:p_zend_class_entry; _object:pzval; by_ref:longint):P_zend_object_iterator;cdecl; + interface_gets_implemented : function (iface:p_zend_class_entry; class_type:p_zend_class_entry):longint;cdecl; + get_static_method : function (ce:p_zend_class_entry; method:p_zend_string):P_zend_function;cdecl; + serialize : function (_object:pzval; buffer:LPBYTE; buf_len:Psize_t; data:p_zend_serialize_data):longint;cdecl; + unserialize : function (_object:pzval; ce:p_zend_class_entry; buf:pbyte; buf_len:size_t; data:p_zend_unserialize_data):longint;cdecl; + num_interfaces : Cardinal; + num_traits : Cardinal; + interfaces : ^P_zend_class_entry; + traits : ^P_zend_class_entry; + trait_aliases : ^Pzend_trait_alias; + trait_precedences : ^Pzend_trait_precedence; + info : record + case longint of + 0 : ( user : record + filename : P_zend_string; + line_start : Cardinal; + line_end : Cardinal; + doc_comment : P_zend_string; + end ); + 1 : ( internal : record + builtin_functions : P_zend_function_entry; + module : P_zend_module_entry; + end ); + end; + end; + zend_class_entry = _zend_class_entry; + TZend_class_entry = _zend_class_entry; + + zend_stream_fsizer_t = function ( handle:pointer):size_t;cdecl; + + zend_stream_reader_t = function ( handle:pointer; buf:zend_pchar; len:size_t):size_t;cdecl; + + zend_stream_closer_t = procedure ( handle:pointer);cdecl; + + + + // __stat64 = zend_stat_t; + // stat = zend_stat_t; + + zend_stream_type = (ZEND_HANDLE_FILENAME,ZEND_HANDLE_FD,ZEND_HANDLE_FP, + ZEND_HANDLE_STREAM,ZEND_HANDLE_MAPPED); + +_zend_mmap = record + len : size_t; + pos : size_t; + map : pointer; + buf : zend_pchar; + old_handle : pointer; + old_closer : zend_stream_closer_t; +end; + zend_mmap = _zend_mmap; + + _zend_stream = record + handle : pointer; + isatty : longint; + mmap : zend_mmap; + reader : zend_stream_reader_t; + fsizer : zend_stream_fsizer_t; + closer : zend_stream_closer_t; + end; + zend_stream = _zend_stream; + + _zend_file_handle = record + handle : record + case longint of + 0 : ( fd : longint ); + 1 : ( fp : pointer ); + 2 : ( stream : zend_stream ); + end; + filename : zend_pchar; + opened_path : P_zend_string; + _type : zend_stream_type; + free_filename : zend_bool; + end; + zend_file_handle = _zend_file_handle; + + + _zend_utility_functions = record + error_function : procedure (_type:longint; error_filename:zend_pchar; error_lineno:uint; format:zend_pchar; args:va_list);cdecl; + printf_function : function (format:zend_pchar):size_t;cdecl varargs; + write_function : function (str:zend_pchar; str_length:size_t):size_t;cdecl; + fopen_function : function (filename:zend_pchar; opened_path:pP_zend_string):POINTER;cdecl; + message_handler : procedure (message:zend_long; data:pointer);cdecl; + block_interruptions : procedure ;cdecl; + unblock_interruptions : procedure ;cdecl; + get_configuration_directive : function (name:p_zend_string):Pzval;cdecl; + ticks_function : procedure (ticks:longint);cdecl; + on_timeout : procedure (seconds:longint);cdecl; + stream_open_function : function (filename:zend_pchar; handle:pzend_file_handle):longint;cdecl; + vspprintf_function : function (pbuf:PPchar; max_len:size_t; format:zend_pchar; ap:va_list):size_t;cdecl; + vstrpprintf_function : function (max_len:size_t; format:zend_pchar; ap:va_list):P_zend_string;cdecl; + getenv_function : function (name:zend_pchar; name_len:size_t):zend_pchar;cdecl; + resolve_path_function : function (filename:zend_pchar; filename_len:longint):P_zend_string;cdecl; + end; + zend_utility_functions = _zend_utility_functions; + + _zend_utility_values = record + import_use_extension : zend_pchar; + import_use_extension_length : uint; + html_errors : zend_bool; + end; + zend_utility_values = _zend_utility_values; + + zend_write_func_t = function (str:zend_pchar; str_length:size_t):longint;cdecl; + + + zend_error_handling_t = (EH_NORMAL = 0,EH_SUPPRESS,EH_THROW); + + zend_error_handling = record + handling : zend_error_handling_t; + exception : P_zend_class_entry; + user_handler : zval; + end; + + + + + + + _znode_op = record + case longint of + 0 : ( constant : cardinal ); + 1 : ( _var : cardinal ); + 2 : ( num : cardinal ); + 3 : ( opline_num : cardinal ); + 4 : ( jmp_offset : cardinal ); + 5 : ( zv : Pzval ); + end; + znode_op = _znode_op; + + _znode = record + op_type : zend_uchar; + flag : zend_uchar; + u : record + case longint of + 0 : ( op : znode_op ); + 1 : ( constant : zval ); + end; + end; + znode = _znode; + + _zend_ast_znode = record + kind : zend_ast_kind; + attr : zend_ast_attr; + lineno : Cardinal; + node : znode; + end; + zend_ast_znode = _zend_ast_znode; + + _zend_declarables = record + ticks : zend_long; + end; + zend_declarables = _zend_declarables; + + _zend_oparray_context = record + opcodes_size : Cardinal; + vars_size : longint; + literals_size : longint; + current_brk_cont : longint; + backpatch_count : longint; + in_finally : longint; + fast_call_var : Cardinal; + labels : PHashTable; + end; + zend_oparray_context = _zend_oparray_context; + + _zend_file_context = record + declarables : zend_declarables; + implementing_class : znode; + current_namespace : P_zend_string; + in_namespace : zend_bool; + has_bracketed_namespaces : zend_bool; + imports : PHashTable; + imports_function : PHashTable; + imports_const : PHashTable; + end; + zend_file_context = _zend_file_context; + + _zend_parser_stack_elem = record + case longint of + 0 : ( ast : P_zend_ast ); + 1 : ( str : P_zend_string ); + 2 : ( num : zend_ulong ); + end; + zend_parser_stack_elem = _zend_parser_stack_elem; + + + _zend_execute_data = record + opline : P_zend_op; + call :P_zend_execute_data; + return_value :Pzval; + func : P_zend_function; + This : zval; + called_scope : P_zend_class_entry; + prev_execute_data :P_zend_execute_data; + symbol_table :P_zend_array; + run_time_cache : ^pointer; + literals : Pzval; + end; + zend_execute_data = _zend_execute_data; + + user_opcode_handler_t = function (execute_data:p_zend_execute_data):longint;cdecl; + + _zend_op = record + handler : pointer; + op1 : znode_op; + op2 : znode_op; + result : znode_op; + extended_value : Cardinal; + lineno : Cardinal; + opcode : zend_uchar; + op1_type : zend_uchar; + op2_type : zend_uchar; + result_type : zend_uchar; + end; + zend_op = _zend_op ; + + + _zend_brk_cont_element = record + start : longint; + cont : longint; + brk : longint; + parent : longint; + end; + zend_brk_cont_element = _zend_brk_cont_element; + + _zend_label = record + brk_cont : longint; + opline_num : Cardinal; + end; + zend_label = _zend_label; + + _zend_try_catch_element = record + try_op : Cardinal; + catch_op : Cardinal; + finally_op : Cardinal; + finally_end : Cardinal; + end; + zend_try_catch_element = _zend_try_catch_element; + + _zend_property_info = record + offset : Cardinal; + flags : Cardinal; + name : P_zend_string; + doc_comment : P_zend_string; + ce : P_zend_class_entry; + end; + zend_property_info = _zend_property_info; + + _zend_internal_arg_info = record + name : zend_pchar; + class_name : zend_pchar; + type_hint : zend_uchar; + pass_by_reference : zend_uchar; + allow_null : zend_bool; + is_variadic : zend_bool; + end; + zend_internal_arg_info = _zend_internal_arg_info; + + _zend_arg_info = record + name : P_zend_string; + class_name : P_zend_string; + type_hint : zend_uchar; + pass_by_reference : zend_uchar; + allow_null : zend_bool; + is_variadic : zend_bool; + end; + zend_arg_info = _zend_arg_info; + + _zend_internal_function_info = record + required_num_args : zend_uintptr_t; + class_name : zend_pchar; + type_hint : zend_uchar; + return_reference : zend_bool; + allow_null : zend_bool; + _is_variadic : zend_bool; + end; + zend_internal_function_info = _zend_internal_function_info; + + _zend_op_array = record + _type : zend_uchar; + arg_flags : array[0..2] of zend_uchar; + fn_flags : Cardinal; + function_name : P_zend_string; + scope : P_zend_class_entry; + prototype : P_zend_function; + num_args : Cardinal; + required_num_args : Cardinal; + arg_info : Pzend_arg_info; + refcount : ^Cardinal; + this_var : Cardinal; + last : Cardinal; + opcodes : P_zend_op; + last_var : longint; + T : Cardinal; + vars : ^P_zend_string; + last_brk_cont : longint; + last_try_catch : longint; + brk_cont_array : Pzend_brk_cont_element; + try_catch_array : Pzend_try_catch_element; + static_variables : PHashTable; + filename : P_zend_string; + line_start : Cardinal; + line_end : Cardinal; + doc_comment : P_zend_string; + early_binding : Cardinal; + last_literal : longint; + literals : Pzval; + cache_size : longint; + run_time_cache : ^pointer; + reserved : array[0..3] of pointer; + end; + zend_op_array = _zend_op_array; + + + _zend_internal_function = record + _type : zend_uchar; + arg_flags : array[0..2] of zend_uchar; + fn_flags : Cardinal; + function_name : P_zend_string; + scope : P_zend_class_entry; + prototype : P_zend_function; + num_args : Cardinal; + required_num_args : Cardinal; + arg_info : Pzend_internal_arg_info; + handler : procedure (execute_data:p_zend_execute_data; return_value:pzval);cdecl; + module : P_zend_module_entry; + reserved : array[0..3] of pointer; + end; + zend_internal_function = _zend_internal_function; + + + + + _zend_function = record + case longint of + 0 : ( _type : zend_uchar ); + 1 : ( common : record + _type : zend_uchar; + arg_flags : array[0..2] of zend_uchar; + fn_flags : Cardinal; + function_name : P_zend_string; + scope : P_zend_class_entry; + prototype : P_zend_function; + num_args : Cardinal; + required_num_args : Cardinal; + arg_info : Pzend_arg_info; + end ); + 2 : ( op_array : zend_op_array ); + 3 : ( internal_function : zend_internal_function ); + end; + + zend_function = _zend_function; + + + + + _zend_call_kind = (ZEND_CALL_NESTED_FUNCTION,ZEND_CALL_NESTED_CODE, + ZEND_CALL_TOP_FUNCTION,ZEND_CALL_TOP_CODE + ); + zend_call_kind = _zend_call_kind; + + + + + + + + unary_op_type = function (a:pzval; b:pzval):longint;cdecl; + + binary_op_type = function (a:pzval; b:pzval; c:pzval):longint;cdecl; + zend_auto_global_callback = function (name:p_zend_string):zend_bool;cdecl; + + + _zend_auto_global = record + name : P_zend_string; + auto_global_callback : zend_auto_global_callback; + jit : zend_bool; + armed : zend_bool; + end; + zend_auto_global = _zend_auto_global; + + + + + + + + + + + + + + HashPosition = cardinal; + + _HashTableIterator = record + ht : PHashTable; + pos : HashPosition; + end; + HashTableIterator = _HashTableIterator; + + _zend_object = record + gc : zend_refcounted_h; + handle : cardinal; + ce : P_zend_class_entry; + handlers : P_zend_object_handlers; + properties : PHashTable; + properties_table : array[0..0] of zval; + end; + zend_object = _zend_object; + + _zend_resource = record + gc : zend_refcounted_h; + handle : longint; + _type : longint; + ptr : pointer; + end; + zend_resource = _zend_resource; + + _zend_reference = record + gc : zend_refcounted_h; + val : zval; + end; + zend_reference = _zend_reference; + + _zend_ast_ref = record + gc : zend_refcounted_h; + ast : P_zend_ast; + end; + zend_ast_ref = _zend_ast_ref; + + + zend_object_read_property_t = function (_object:pzval; member:pzval; _type:longint; cache_slot:ppointer; rv:pzval):Pzval;cdecl; + + zend_object_read_dimension_t = function (_object:pzval; offset:pzval; _type:longint; rv:pzval):Pzval;cdecl; + + zend_object_write_property_t = procedure (_object:pzval; member:pzval; value:pzval; cache_slot:ppointer);cdecl; + + zend_object_write_dimension_t = procedure (_object:Pzval; offset:Pzval; value:pzval);cdecl; + + zend_object_get_property_ptr_ptr_t = function (_object:Pzval; member:Pzval; _type:longint; cache_slot:pointer):Pzval;cdecl; + + zend_object_set_t = procedure (_object:Pzval; value:pzval);cdecl; + + zend_object_get_t = function (_object:Pzval; rv:pzval):Pzval;cdecl; + + zend_object_has_property_t = function (_object:Pzval; member:Pzval; has_set_exists:longint; cache_slot:pointer):longint;cdecl; + + + zend_object_has_dimension_t = function (_object:Pzval; member:Pzval; check_empty:longint):longint;cdecl; + + + zend_object_unset_property_t = procedure (_object:Pzval; member:Pzval; cache_slot:pointer);cdecl; + + + zend_object_unset_dimension_t = procedure (_object:Pzval; offset:pzval);cdecl; + + + zend_object_get_properties_t = function (_object:pzval):PHashTable;cdecl; + + + zend_object_get_debug_info_t = function (_object:Pzval; is_temp:plongint):PHashTable;cdecl; + + + + + zend_object_call_method_t = function (method:P_zend_string; _object:P_zend_object; execute_data:P_zend_execute_data; return_value:pzval):longint;cdecl; + + zend_object_get_method_t = function (_object:PP_zend_object; method:P_zend_string; key:pzval):P_zend_function;cdecl; + + zend_object_get_constructor_t = function (_object:pzend_object):P_zend_function;cdecl; + + + zend_object_dtor_obj_t = procedure (_object:pzend_object);cdecl; + + zend_object_free_obj_t = procedure (_object:pzend_object);cdecl; + + zend_object_clone_obj_t = function (_object:pzval):P_zend_object;cdecl; + + zend_object_get_class_name_t = function (_object:pzend_object):P_zend_string;cdecl; + + zend_object_compare_t = function (object1:Pzval; object2:pzval):longint;cdecl; + + zend_object_compare_zvals_t = function (resul:Pzval; op1:Pzval; op2:pzval):longint;cdecl; + + + zend_object_cast_t = function (readobj:Pzval; retval:Pzval; _type:longint):longint;cdecl; + + + zend_object_count_elements_t = function (_object:Pzval; count:pzend_long):longint;cdecl; + + zend_object_get_closure_t = function (obj:Pzval; ce_ptr:PP_zend_class_entry; fptr_ptr:PP_zend_function; obj_ptr:pP_zend_object):longint;cdecl; + + zend_object_get_gc_t = function (_object:Pzval; table:PPzval; n:plongint):PHashTable;cdecl; + + zend_object_do_operation_t = function (opcode:zend_uchar; result:Pzval; op1:Pzval; op2:pzval):longint;cdecl; + + + _zend_stack = record + size : longint; + top : longint; + max : longint; + elements : pointer; + end; + zend_stack = _zend_stack; + + + _zend_object_handlers = record + offset : longint; + free_obj : zend_object_free_obj_t; + dtor_obj : zend_object_dtor_obj_t; + clone_obj : zend_object_clone_obj_t; + read_property : zend_object_read_property_t; + write_property : zend_object_write_property_t; + read_dimension : zend_object_read_dimension_t; + write_dimension : zend_object_write_dimension_t; + get_property_ptr_ptr : zend_object_get_property_ptr_ptr_t; + get : zend_object_get_t; + _set : zend_object_set_t; + has_property : zend_object_has_property_t; + unset_property : zend_object_unset_property_t; + has_dimension : zend_object_has_dimension_t; + unset_dimension : zend_object_unset_dimension_t; + get_properties : zend_object_get_properties_t; + get_method : zend_object_get_method_t; + call_method : zend_object_call_method_t; + get_constructor : zend_object_get_constructor_t; + get_class_name : zend_object_get_class_name_t; + compare_objects : zend_object_compare_t; + cast_object : zend_object_cast_t; + count_elements : zend_object_count_elements_t; + get_debug_info : zend_object_get_debug_info_t; + get_closure : zend_object_get_closure_t; + get_gc : zend_object_get_gc_t; + do_operation : zend_object_do_operation_t; + compare : zend_object_compare_zvals_t; + end; + + + + + + + _zend_object_iterator = record + std : zend_object; + data : zval; + funcs : Pzend_object_iterator_funcs; + index : zend_ulong; + end; + + + zend_object_iterator = _zend_object_iterator; + _zend_object_iterator_funcs = record + dtor : procedure (iter:pzend_object_iterator);cdecl; + valid : function (iter:pzend_object_iterator):longint;cdecl; + get_current_data : function (iter:pzend_object_iterator):Pzval;cdecl; + get_current_key : procedure (iter:P_zend_object_iterator; key:pzval);cdecl; + move_forward : procedure (iter:pzend_object_iterator);cdecl; + rewind : procedure (iter:pzend_object_iterator);cdecl; + invalidate_current : procedure (iter:pzend_object_iterator);cdecl; + end; + zend_object_iterator_funcs = _zend_object_iterator_funcs; + + + + _zend_ini_parser_param = record + ini_parser_cb : zend_ini_parser_cb_t; + arg : pointer; + end; + zend_ini_parser_param = _zend_ini_parser_param; + + + _zend_module_entry = record + size : word; + zend_api : dword; + zend_debug : byte; + zts : byte; + ini_entry : P_zend_ini_entry; + deps : P_zend_module_dep; + name : zend_pchar; + functions : P_zend_function_entry; + module_startup_func : function (_type:longint; module_number:longint):longint;cdecl; + module_shutdown_func : function (_type:longint; module_number:longint):longint;cdecl; + request_startup_func : function (_type:longint; module_number:longint):longint;cdecl; + request_shutdown_func : function (_type:longint; module_number:longint):longint;cdecl; + info_func : procedure (zend_module:p_zend_module_entry);cdecl; + version : zend_pchar; + globals_size : size_t; + globals_ptr : pointer; + globals_ctor : procedure (global:pointer);cdecl; + globals_dtor : procedure (global:pointer);cdecl; + post_deactivate_func : function :longint;cdecl; + module_started : longint; + _type : byte; + handle : pointer; + module_number : longint; + build_id : zend_pchar; + end; + zend_module_entry = _zend_module_entry; + + + + + + _zend_module_dep = record + name : zend_pchar; + rel : zend_pchar; + version : zend_pchar; + _type : byte; + end; + + zend_module_dep = _zend_module_dep; + + _zend_function_entry = record + fname : zend_pchar; + handler : pointer; + //handler: procedure (execute_data:P_zend_execute_data; return_value:Pointer);cdecl; + arg_info : P_zend_internal_arg_info; + num_args : Cardinal; + flags : Cardinal; + end; + zend_function_entry = _zend_function_entry; + + _php_stream_context = record + notifier : P_php_stream_notifier; + options : zval; + res : P_zend_resource; + end; + php_stream_context = _php_stream_context ; + php_stream_notification_func = procedure (context:P_php_stream_context; notifycode:longint; severity:longint; xmsg:zend_pchar; xcode:longint; + bytes_sofar:size_t; bytes_max:size_t; ptr:pointer);cdecl; + + + _php_stream_notifier = record + func : php_stream_notification_func; + dtor : procedure (notifier:p_php_stream_notifier); + ptr : zval; + mask : longint; + progress : size_t; + progress_max : size_t; + end; + + + + + + + + + + _php_stream_bucket = record + next : P_php_stream_bucket; + prev : P_php_stream_bucket; + brigade : P_php_stream_bucket_brigade; + buf : zend_pchar; + buflen : size_t; + own_buf : longint; + is_persistent : longint; + refcount : longint; + end; + + _php_stream_bucket_brigade = record + head : P_php_stream_bucket; + tail : P_php_stream_bucket; + end; + + php_stream_bucket = _php_stream_bucket ; + php_stream_bucket_brigade = _php_stream_bucket_brigade ; + + php_stream_filter_status_t = (PSFS_ERR_FATAL,PSFS_FEED_ME,PSFS_PASS_ON + ); + + + _php_stream_filter_chain = record + head : P_php_stream_filter; + tail : P_php_stream_filter; + stream : P_php_stream; + end; + php_stream_filter_chain = _php_stream_filter_chain; + _php_stream = record + ops : Pphp_stream_ops; + _abstract : pointer; + readfilters : php_stream_filter_chain; + writefilters : php_stream_filter_chain; + wrapper : P_php_stream_wrapper; + wrapperthis : pointer; + wrapperdata : zval; + fgetss_state : longint; + is_persistent : longint; + mode : array[0..15] of char; + res : P_zend_resource; + in_free : longint; + fclose_stdiocast : longint; + stdiocast : POINTER; + __exposed : longint; + orig_path : zend_pchar; + ctx : P_zend_resource; + flags : longint; + eof : longint; + position : zend_off_t; + readbuf : Pbyte; + readbuflen : size_t; + readpos : zend_off_t; + writepos : zend_off_t; + chunk_size : size_t; + open_filename : zend_pchar; + open_lineno : uint; + enclosing_stream : P_php_stream; + end; + + php_stream = _php_stream ; + _php_stream_filter = record + fops : Pphp_stream_filter_ops; + _abstract : zval; + next : P_php_stream_filter; + prev : P_php_stream_filter; + is_persistent : longint; + chain : Pphp_stream_filter_chain; + buffer : php_stream_bucket_brigade; + res : P_zend_resource; + end; + php_stream_filter = _php_stream_filter ; + _php_stream_filter_ops = record + filter : function (stream:P_php_stream; thisfilter:P_php_stream_filter; buckets_in:P_php_stream_bucket_brigade; buckets_out:P_php_stream_bucket_brigade; bytes_consumed:Psize_t; + flags:longint):php_stream_filter_status_t;cdecl; + dtor : procedure (thisfilter:p_php_stream_filter);cdecl; + _label : zend_pchar; + end; + php_stream_filter_ops = _php_stream_filter_ops; + + + + + + _php_stream_filter_factory = record + create_filter : function (filtername:zend_pchar; filterparams:Pzval; persistent:longint):P_php_stream_filter;cdecl; + end; + php_stream_filter_factory = _php_stream_filter_factory; + + + + + + + _php_stream_statbuf = record + sb : zend_stat_t; + end; + php_stream_statbuf = _php_stream_statbuf; + + _php_stream_dirent = record + d_name : array[0..(256)-1] of char; + end; + php_stream_dirent = _php_stream_dirent; + + + + _php_stream_ops = record + write : function (stream:P_php_stream; buf:zend_pchar; count:size_t):size_t;cdecl; + read : function (stream:P_php_stream; buf:zend_pchar; count:size_t):size_t;cdecl; + close : function (stream:P_php_stream; close_handle:longint):longint;cdecl; + flush : function (stream:p_php_stream):longint;cdecl; + _label : zend_pchar; + seek : function (stream:P_php_stream; offset:zend_off_t; whence:longint; newoffset:pzend_off_t):longint;cdecl; + cast : function (stream:P_php_stream; castas:longint; ret:ppointer):longint;cdecl; + stat : function (stream:P_php_stream; ssb:pphp_stream_statbuf):longint;cdecl; + set_option : function (stream:P_php_stream; option:longint; value:longint; ptrparam:pointer):longint;cdecl; + end; + php_stream_ops = _php_stream_ops; + + _php_stream_wrapper = record + wops : Pphp_stream_wrapper_ops; + _abstract : pointer; + is_url : longint; + end; + php_stream_wrapper = _php_stream_wrapper ; + + _php_stream_wrapper_ops = record + stream_opener : function (wrapper:P_php_stream_wrapper; filename:zend_pchar; mode:zend_pchar; options:longint; opened_path:PP_zend_string; context:P_php_stream_context; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):P_php_stream;cdecl; + stream_closer : function (wrapper:P_php_stream_wrapper; stream:p_php_stream):longint;cdecl; + stream_stat : function (wrapper:P_php_stream_wrapper; stream:P_php_stream; ssb:pphp_stream_statbuf):longint;cdecl; + url_stat : function (wrapper:P_php_stream_wrapper; url:zend_pchar; flags:longint; ssb:Pphp_stream_statbuf; context:pphp_stream_context):longint;cdecl; + dir_opener : function (wrapper:P_php_stream_wrapper; filename:zend_pchar; mode:zend_pchar; options:longint; opened_path:PP_zend_string; context:P_php_stream_context; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):P_php_stream;cdecl; + _label : zend_pchar; + unlink : function (wrapper:P_php_stream_wrapper; url:zend_pchar; options:longint; context:pphp_stream_context):longint;cdecl; + rename : function (wrapper:P_php_stream_wrapper; url_from:zend_pchar; url_to:zend_pchar; options:longint; context:pphp_stream_context):longint;cdecl; + stream_mkdir : function (wrapper:P_php_stream_wrapper; url:zend_pchar; mode:longint; options:longint; context:pphp_stream_context):longint;cdecl; + stream_rmdir : function (wrapper:P_php_stream_wrapper; url:zend_pchar; options:longint; context:Pphp_stream_context):longint;cdecl; + stream_metadata : function (wrapper:P_php_stream_wrapper; url:zend_pchar; options:longint; value:Ppointer; context:Pphp_stream_context):longint;cdecl; + end; + php_stream_wrapper_ops = _php_stream_wrapper_ops; + + + + + + + + sapi_header_struct = record + header : zend_pchar; + header_len : size_t; + end; + + + + + _zend_llist_element = record + next : P_zend_llist_element; + prev : P_zend_llist_element; + data : array[0..0] of char; + end; + zend_llist_element = _zend_llist_element; + + + llist_dtor_func_t = procedure (_para1:pointer);cdecl; + + llist_compare_func_t = function (_para1:PP_zend_llist_element; _para2:PP_zend_llist_element):longint;cdecl; + + llist_apply_with_args_func_t = procedure (data:Ppointer; num_args:longint; args:va_list);cdecl; + + llist_apply_with_arg_func_t = procedure (data:Ppointer; arg:Ppointer);cdecl; + + llist_apply_func_t = procedure (_para1:pointer);cdecl; + + _zend_llist = record + head : Pzend_llist_element; + tail : Pzend_llist_element; + count : size_t; + size : size_t; + dtor : llist_dtor_func_t; + persistent : byte; + traverse_ptr : Pzend_llist_element; + end; + zend_llist = _zend_llist; + + zend_llist_position = Pzend_llist_element; + + + sapi_headers_struct = record + headers : zend_llist; + http_response_code : longint; + send_default_content_type : byte; + mimetype : zend_pchar; + http_status_line : zend_pchar; + end; + + _sapi_post_entry = record + content_type : zend_pchar; + content_type_len : uint; + post_reader : procedure ;cdecl; + post_handler : procedure (content_type_dup:zend_pchar; arg:Ppointer);cdecl; + end; + sapi_post_entry = _sapi_post_entry; + + + + sapi_request_info = record + request_method : zend_pchar; + query_string : zend_pchar; + cookie_data : zend_pchar; + content_length : zend_long; + path_translated : zend_pchar; + request_uri : zend_pchar; + request_body : P_php_stream; + content_type : zend_pchar; + headers_only : zend_bool; + no_headers : zend_bool; + headers_read : zend_bool; + post_entry : P_sapi_post_entry; + content_type_dup : zend_pchar; + auth_user : zend_pchar; + auth_password : zend_pchar; + auth_digest : zend_pchar; + argv0 : zend_pchar; + current_user : zend_pchar; + current_user_length : longint; + argc : longint; + argv : ^zend_pchar; + proto_num : longint; + end; + + + _sapi_globals_struct = record + server_context : pointer; + request_info : sapi_request_info; + sapi_headers : sapi_headers_struct; + read_post_bytes : FixedUInt ; + post_read : byte; + headers_sent : byte; + global_stat : zend_stat_t; + default_mimetype : zend_pchar; + default_charset : zend_pchar; + rfc1867_uploaded_files : PHashTable; + post_max_size : zend_long; + options : longint; + sapi_started : zend_bool; + global_request_time : double; + known_post_content_types : HashTable; + callback_func : zval; + fci_cache : zend_fcall_info_cache; + end; + sapi_globals_struct = _sapi_globals_struct; + + sapi_header_line = record + line : zend_pchar; + line_len : size_t; + response_code : zend_long; + end; + + + + + + sapi_header_op_enum = (SAPI_HEADER_REPLACE,SAPI_HEADER_ADD_,SAPI_HEADER_DELETE, + SAPI_HEADER_DELETE_ALL,SAPI_HEADER_SET_STATUS + ); + + + _sapi_module_struct = record + name : zend_pchar; + pretty_name : zend_pchar; + startup : function (sapi_module:P_sapi_module_struct):longint;cdecl; + shutdown : function (sapi_module:P_sapi_module_struct):longint;cdecl; + activate : function :longint;cdecl; + deactivate : function :longint;cdecl; + ub_write : function (str:zend_pchar; str_length:size_t):size_t;cdecl; + flush : procedure (server_context:Ppointer);cdecl; + get_stat : function :P_zend_stat_t;cdecl; + getenv : function (name:zend_pchar; name_len:size_t):zend_pchar;cdecl; + sapi_error : procedure (_type:longint; error_msg:zend_pchar);cdecl varargs; + header_handler : function (sapi_header:Psapi_header_struct; op:sapi_header_op_enum; sapi_headers:Psapi_headers_struct):longint;cdecl; + send_headers : function (sapi_headers:Psapi_headers_struct):longint;cdecl; + send_header : procedure (sapi_header:Psapi_header_struct; server_context:Ppointer);cdecl; + read_post : function (buffer:zend_pchar; count_bytes:size_t):size_t;cdecl; + read_cookies : function :zend_pchar;cdecl; + register_server_variables : procedure (track_vars_array:Pzval);cdecl; + log_message : procedure (message:zend_pchar);cdecl; + get_request_time : function :double;cdecl; + terminate_process : procedure ;cdecl; + php_ini_path_override : zend_pchar; + block_interruptions : procedure ;cdecl; + unblock_interruptions : procedure ;cdecl; + default_post_reader : procedure ;cdecl; + treat_data : procedure (arg:longint; str:zend_pchar; destArray:Pzval);cdecl; + executable_location : zend_pchar; + php_ini_ignore : longint; + php_ini_ignore_cwd : longint; + get_fd : function (fd:Plongint):longint;cdecl; + force_http_10 : function :longint;cdecl; + get_target_uid : function (_para1:Puid_t):longint;cdecl; + get_target_gid : function (_para1:Pgid_t):longint;cdecl; + input_filter : function (arg:longint; _var:zend_pchar; val:PPchar; val_len:size_t; new_val_len:Psize_t):dword;cdecl; + ini_defaults : procedure (configuration_hash:PHashTable);cdecl; + phpinfo_as_text : longint; + ini_entries : zend_pchar; + additional_functions : Pzend_function_entry; + input_filter_init : function :dword;cdecl; + end; + sapi_module_struct = _sapi_module_struct; + + + Ptsrm_intptr_t = ^tsrm_intptr_t; + Ptsrm_uintptr_t = ^tsrm_uintptr_t; + Pts_rsrc_id = ^ts_rsrc_id; + + tsrm_intptr_t = intptr; + tsrm_uintptr_t = uintptr_t; + + + ts_rsrc_id = longint; + + Pbeos_ben = ^beos_ben; + beos_ben = record + sem : integer; + ben : longint; + end; + + ts_allocate_ctor = procedure (_para1:pointer);cdecl; + + ts_allocate_dtor = procedure (_para1:pointer);cdecl; + + tsrm_thread_begin_func_t = procedure (thread_id:DWORD);cdecl; + + tsrm_thread_end_func_t = procedure (thread_id:DWORD);cdecl; + + + + zend_ini_entry = _zend_ini_entry ; + + + + _zend_arena = record + ptr : zend_pchar; + _end : zend_pchar; + prev : P_zend_arena; + end; + zend_arena = _zend_arena; + _zend_compiler_globals = record + loop_var_stack : zend_stack; + active_class_entry : P_zend_class_entry; + compiled_filename : P_zend_string; + zend_lineno : longint; + active_op_array : P_zend_op_array; + function_table : PHashTable; + class_table : PHashTable; + filenames_table : HashTable; + auto_globals : PHashTable; + parse_error : zend_bool; + in_compilation : zend_bool; + short_tags : zend_bool; + unclean_shutdown : zend_bool; + ini_parser_unbuffered_errors : zend_bool; + open_files : zend_llist; + ini_parser_param : P_zend_ini_parser_param; + start_lineno : uint32_t; + increment_lineno : zend_bool; + doc_comment : P_zend_string; + compiler_options : uint32_t; + const_filenames : HashTable; + context : zend_oparray_context; + file_context : zend_file_context; + arena : P_zend_arena; + empty_string : P_zend_string; + one_char_string : array[0..255] of P_zend_string; + interned_strings : HashTable; + script_encoding_list : PPzend_encoding; + script_encoding_list_size : size_t; + multibyte : zend_bool; + detect_unicode : zend_bool; + encoding_declared : zend_bool; + ast : P_zend_ast; + ast_arena : P_zend_arena; + delayed_oplines_stack : pointer; + static_members_table : ^Pzval; + last_static_member : longint; + end; + + + _zend_objects_store = record + object_buckets : ^P_zend_object; + top : uint32_t; + size : uint32_t; + free_list_head : longint; + end; + zend_objects_store = _zend_objects_store; + + + _zend_executor_globals = record + uninitialized_zval : zval; + error_zval : zval; + symtable_cache : array[0..(32)-1] of P_zend_array; + symtable_cache_limit : ^P_zend_array; + symtable_cache_ptr : ^P_zend_array; + symbol_table : zend_array; + included_files : HashTable; + bailout : pointer; + error_reporting : longint; + exit_status : longint; + function_table : PHashTable; + class_table : PHashTable; + zend_constants : PHashTable; + vm_stack_top : Pzval; + vm_stack_end : Pzval; + vm_stack : _zend_vm_stack; + current_execute_data : P_zend_execute_data; + scope : P_zend_class_entry; + precision : zend_long; + ticks_count : longint; + in_autoload : PHashTable; + autoload_func : P_zend_function; + full_tables_cleanup : zend_bool; + no_extensions : zend_bool; + timed_out : zend_bool; + windows_version_info : OSVERSIONINFOEX; + regular_list : HashTable; + persistent_list : HashTable; + user_error_handler_error_reporting : longint; + user_error_handler : zval; + user_exception_handler : zval; + user_error_handlers_error_reporting : zend_stack; + user_error_handlers : zend_stack; + user_exception_handlers : zend_stack; + error_handling : zend_error_handling_t; + exception_class : P_zend_class_entry; + timeout_seconds : zend_long; + lambda_count : longint; + ini_directives : PHashTable; + modified_ini_directives : PHashTable; + error_reporting_ini_entry : P_zend_ini_entry; + objects_store : zend_objects_store; + exception : P_zend_object; + prev_exception : P_zend_object; + opline_before_exception : P_zend_op; + exception_op : array[0..2] of zend_op; + current_module : P_zend_module_entry; + active : zend_bool; + valid_symbol_table : zend_bool; + assertions : zend_long; + ht_iterators_count : uint32_t; + ht_iterators_used : uint32_t; + ht_iterators : PHashTableIterator; + ht_iterators_slots : array[0..15] of HashTableIterator; + // saved_fpu_cw_ptr : pointer; + saved_fpu_cw : LONGINT; + trampoline : zend_function; + call_trampoline_op : zend_op; + reserved : array[0..(4)-1] of pointer; + end; + + _zend_ini_scanner_globals = record + yy_in : Pzend_file_handle; + yy_out : Pzend_file_handle; + yy_leng : dword; + yy_start : Pbyte; + yy_text : Pbyte; + yy_cursor : Pbyte; + yy_marker : Pbyte; + yy_limit : Pbyte; + yy_state : longint; + state_stack : zend_stack; + filename : zend_pchar; + lineno : longint; + scanner_mode : longint; + end; + + _zend_ptr_stack = record + top : longint; + max : longint; + elements : ^pointer; + top_element : ^pointer; + persistent : zend_bool; + end; + zend_ptr_stack = _zend_ptr_stack; + + + + + zend_encoding_filter = function (str:LPBYTE; str_length:Psize_t; buf:Pbyte; length:size_t):size_t;cdecl; + + Pzend_encoding_fetcher = ^zend_encoding_fetcher; + zend_encoding_fetcher = function (encoding_name:zend_pchar):Pzend_encoding;cdecl; + + Pzend_encoding_name_getter = ^zend_encoding_name_getter; + zend_encoding_name_getter = function (encoding:Pzend_encoding):zend_pchar;cdecl; + + zend_encoding_lexer_compatibility_checker = function (encoding:Pzend_encoding):longint;cdecl; + + zend_encoding_detector = function (_string:Pbyte; length:size_t; list:PPzend_encoding; list_size:size_t):Pzend_encoding;cdecl; + + zend_encoding_converter = function (_to:LPBYTE; to_length:Psize_t; from:Pbyte; from_length:size_t; encoding_to:Pzend_encoding; + encoding_from:Pzend_encoding):size_t;cdecl; + + zend_encoding_list_parser = function (encoding_list:zend_pchar; encoding_list_len:size_t; return_list:PPPzend_encoding; return_size:Psize_t; persistent:longint):longint;cdecl; + + zend_encoding_internal_encoding_getter = function :Pzend_encoding;cdecl; + + zend_encoding_internal_encoding_setter = function (encoding:Pzend_encoding):longint;cdecl; + + + _zend_multibyte_functions = record + provider_name : zend_pchar; + encoding_fetcher : zend_encoding_fetcher; + encoding_name_getter : zend_encoding_name_getter; + lexer_compatibility_checker : zend_encoding_lexer_compatibility_checker; + encoding_detector : zend_encoding_detector; + encoding_converter : zend_encoding_converter; + encoding_list_parser : zend_encoding_list_parser; + internal_encoding_getter : zend_encoding_internal_encoding_getter; + internal_encoding_setter : zend_encoding_internal_encoding_setter; + end; + zend_multibyte_functions = _zend_multibyte_functions; + + _zend_leak_info = record + addr : pointer; + size : size_t; + filename : zend_pchar; + orig_filename : zend_pchar; + lineno : uint; + orig_lineno : uint; + end; + zend_leak_info = _zend_leak_info; + + + + _zend_mm_debug_info = record + size : size_t; + filename : zend_pchar; + orig_filename : zend_pchar; + lineno : uint; + orig_lineno : uint; + end; + zend_mm_debug_info = _zend_mm_debug_info; + + _zend_mm_heap = record + use_custom_heap : longint; + storage : P_zend_mm_storage; + size : size_t; + peak : size_t; + free_slot : array[0..(30)-1] of P_zend_mm_free_slot; + real_size : size_t; + real_peak : size_t; + limit : size_t; + overflow : longint; + huge_list : P_zend_mm_huge_list; + main_chunk : P_zend_mm_chunk; + cached_chunks : P_zend_mm_chunk; + chunks_count : longint; + peak_chunks_count : longint; + cached_chunks_count : longint; + avg_chunks_count : double; + custom_heap : record + case longint of + 0 : ( std : record + _malloc : function (_para1:size_t):pointer;cdecl; + _free : procedure (_para1:pointer);cdecl; + _realloc : function (_para1:pointer; _para2:size_t):pointer;cdecl; + end ); + 1 : ( debug : record + _malloc : function (g:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer;cdecl; + _free : procedure (g:Ppointer; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint);cdecl; + _realloc : function (g:Ppointer; gg:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; + __zend_orig_lineno:uint):pointer;cdecl; + end ); + end; + end; + + + _zend_mm_chunk = record + heap : P_zend_mm_heap; + next : P_zend_mm_chunk; + prev : P_zend_mm_chunk; + free_pages : longint; + free_tail : longint; + num : longint; + reserve : array[0..(64 - (sizeof(POINTER) * 3 + sizeof(integer) * 3))] of char; + heap_slot : _zend_mm_heap; + free_map : pointer; + map : Pointer; + end; + + _zend_mm_page = record + bytes : array[0..(4 * 1024)-1] of char; + end; + + _zend_mm_bin = record + bytes : array[0..(4 * 1024*8)-1] of char; + end; + + _zend_mm_free_slot = record + next_free_slot : P_zend_mm_free_slot; + end; + + + _zend_mm_huge_list = record + ptr : pointer; + size : size_t; + next : P_zend_mm_huge_list; + dbg : zend_mm_debug_info; + end; + + + + zend_mm_chunk_alloc_t = function (storage:PPointer; size:size_t; alignment:size_t):pointer;cdecl; + + zend_mm_chunk_free_t = procedure (storage:PPointer; chunk:Ppointer; size:size_t);cdecl; + + zend_mm_chunk_truncate_t = function (storage:PPointer; chunk:Ppointer; old_size:size_t; new_size:size_t):longint;cdecl; + + zend_mm_chunk_extend_t = function (storage:PPointer; chunk:Ppointer; old_size:size_t; new_size:size_t):longint;cdecl; + + + + zend_mm_heap =_zend_mm_heap ; + _zend_mm_handlers = record + chunk_alloc : zend_mm_chunk_alloc_t; + chunk_free : zend_mm_chunk_free_t; + chunk_truncate : zend_mm_chunk_truncate_t; + chunk_extend : zend_mm_chunk_extend_t; + end; + zend_mm_handlers = _zend_mm_handlers; + _zend_mm_storage = record + handlers : zend_mm_handlers; + data : pointer; + end; + zend_mm_storage = _zend_mm_storage ; + + + _zend_closure = record + std : zend_object; + func : zend_function; + this_ptr : zval; + called_scope : Pzend_class_entry; + orig_internal_handler : procedure (var execute_data:zend_execute_data; var return_value:zval);cdecl; + end; + zend_closure = _zend_closure; + + + + _zend_php_scanner_globals = record + yy_in : Pzend_file_handle; + yy_out : Pzend_file_handle; + yy_leng : dword; + yy_start : Pbyte; + yy_text : Pbyte; + yy_cursor : Pbyte; + yy_marker : Pbyte; + yy_limit : Pbyte; + yy_state : longint; + state_stack : zend_stack; + heredoc_label_stack : zend_ptr_stack; + script_org : Pbyte; + script_org_size : size_t; + script_filtered : Pbyte; + script_filtered_size : size_t; + input_filter : zend_encoding_filter; + output_filter : zend_encoding_filter; + script_encoding : Pzend_encoding; + scanned_string_len : longint; + on_event : procedure (event:zend_php_scanner_event; token:longint; line:longint);cdecl; + end; + + Pzend_hash_key = ^Tzend_hash_key; + Tzend_hash_key = record + h : zend_ulong; + key : Pzend_string; + end; + + Tsmart_str = record + s:Pzend_string; + a:size_t; + end; + + + + + + Tmerge_checker_func_t = function (target_ht:PHashTable; source_data:Pzval; hash_key:Pzend_hash_key; pParam:Ppointer):zend_bool;cdecl; + Tapply_func_t = function (pDest:Pzval):longint;cdecl; + Tapply_func_arg_t = function (pDest:Pzval; argument:Ppointer):longint;cdecl; + Tapply_func_args_t = function (pDest:Pzval; num_args:longint; args:va_list; hash_key:Pzend_hash_key):longint;cdecl; + + + + + +IEJORGJIERGE = procedure (ini_entry:P_zend_ini_entry; _type:longint); +EWKGERGJ945YG45 = procedure (_para1:size_t); +OERGJOERJGIERGHRE = procedure (_para1:size_t); + +ERG4JG09E84GJ8945H45H = procedure (_para1:pointer; _para2:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint); +EWFG439EGRG45 = procedure (_para1:pointer); +G5J90E4GK495Y4 = procedure (_para1:pointer); + f584hj4i5hth = procedure (_para1:pointer); + KD45T5H65HTHRTH = function (element:Ppointer; arg:Ppointer):longint; + IEJG9458U9845Y45 = function (element:Ppointer):longint; + ERGERG43T4T545YH546 = function (element1:Ppointer; element2:Ppointer):longint; + RGEKG34I9TI3434 = function (data:Ppointer):longint; +var +smart_str_erealloc:procedure(str:psmart_str; len:size_t);cdecl; +smart_str_realloc:procedure(str:psmart_str; len:size_t); cdecl; +tsrm_set_new_thread_begin_handler:function(new_thread_begin_handler:tsrm_thread_begin_func_t):pointer; cdecl; +tsrm_set_new_thread_end_handler:function(new_thread_end_handler:tsrm_thread_end_func_t):pointer; cdecl; +tsrm_new_interpreter_context:function:pointer; cdecl; +tsrm_set_interpreter_context:function(new_ctx:Ppointer):pointer; cdecl; +tsrm_free_interpreter_context:procedure(context:Ppointer); cdecl; +tsrm_get_ls_cache:function:pointer; cdecl; +tsrm_error_set:procedure(level:longint; debug_filename:zend_pchar); cdecl; +tsrm_thread_id:function:DWORD; cdecl; +tsrm_mutex_alloc:function:pointer; cdecl; +tsrm_mutex_free:procedure(mutexp:Ppointer); cdecl; +tsrm_mutex_lock:function(mutexp:Ppointer):longint; cdecl; +tsrm_mutex_unlock:function(mutexp:Ppointer):longint; cdecl; +tsrm_startup:function(expected_threads:longint; expected_resources:longint; debug_level:longint; debug_filename:zend_pchar):longint; cdecl; +tsrm_shutdown:procedure; cdecl; +ts_allocate_id:function(rsrc_id:Pts_rsrc_id; size:size_t; ctor:ts_allocate_ctor; dtor:ts_allocate_dtor):ts_rsrc_id; cdecl; +ts_resource_ex:function(id:ts_rsrc_id; th_id:pointer):pointer; cdecl; +ts_free_thread:procedure; cdecl; +ts_free_id:procedure(id:ts_rsrc_id); cdecl; +php_request_startup:function:longint; cdecl; +php_request_shutdown:procedure( dummy:pointer); cdecl; +php_request_shutdown_for_exec:procedure(dummy:Ppointer); cdecl; +php_module_startup:function( sf:p_sapi_module_struct; additional_modules:p_zend_module_entry; num_additional_modules:uint):longint; cdecl; +php_module_shutdown:procedure; cdecl; +php_module_shutdown_for_exec:procedure; cdecl; +php_module_shutdown_wrapper:function(sapi_globals:Psapi_module_struct):longint; cdecl; +php_request_startup_for_hook:function:longint; cdecl; +php_request_shutdown_for_hook:procedure(dummy:Ppointer); cdecl; +php_register_extensions:function(ptr:PP_zend_module_entry; count:longint):longint; cdecl; +php_execute_script:function( primary_file:p_zend_file_handle):longint; cdecl; +php_execute_simple_script:function(primary_file:Pzend_file_handle; ret:Pzval):longint; cdecl; +php_handle_special_queries:function:longint; cdecl; +php_lint_script:function(_file:Pzend_file_handle):longint; cdecl; +php_handle_aborted_connection:procedure; cdecl; +php_handle_auth_data:function(auth:zend_pchar):longint; cdecl; +php_html_puts:procedure(str:zend_pchar; siz:size_t); cdecl; +php_stream_open_for_zend_ex:function(filename:zend_pchar; handle:Pzend_file_handle; mode:longint):longint; cdecl; + + +zend_strndup:function(s:zend_pchar; length:size_t):zend_pchar; cdecl; +_emalloc:function(size:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_safe_emalloc:function(nmemb:size_t; size:size_t; offset:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_safe_malloc:function(nmemb:size_t; size:size_t; offset:size_t):pointer; cdecl; +_efree:procedure(ptr:Ppointer; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint); cdecl; +_ecalloc:function(nmemb:size_t; size:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_erealloc:function(ptr:Ppointer; size:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_erealloc2:function(ptr:Ppointer; size:size_t; copy_size:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_safe_erealloc:function(ptr:Ppointer; nmemb:size_t; size:size_t; offset:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_safe_realloc:function(ptr:Ppointer; nmemb:size_t; size:size_t; offset:size_t):pointer; cdecl; +_estrdup:function(s:zend_pchar; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):zend_pchar; cdecl; +_estrndup:function(s:zend_pchar; length:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):zend_pchar; cdecl; +_zend_mem_block_size:function(ptr:Ppointer; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):size_t; cdecl; +_emalloc_large:function(size:size_t):pointer; cdecl; +_emalloc_huge:function(size:size_t):pointer; cdecl; +_efree_large:procedure(_para1:pointer; size:size_t); cdecl; +_efree_huge:procedure(_para1:pointer; size:size_t); cdecl; +__zend_malloc:function(len:size_t):pointer; cdecl; +__zend_calloc:function(nmemb:size_t; len:size_t):pointer; cdecl; +__zend_realloc:function(p:Ppointer; len:size_t):pointer; cdecl; +zend_set_memory_limit:function(memory_limit:size_t):longint; cdecl; +start_memory_manager:procedure; cdecl; +shutdown_memory_manager:procedure(silent:longint; full_shutdown:longint); cdecl; +is_zend_mm:function:longint; cdecl; +zend_memory_usage:function(real_usage:longint):size_t; cdecl; +zend_memory_peak_usage:function(real_usage:longint):size_t; cdecl; +zend_mm_startup:function:P_zend_mm_heap; cdecl; +zend_mm_shutdown:procedure(heap:P_zend_mm_heap; full_shutdown:longint; silent:longint); cdecl; +_zend_mm_alloc:function(heap:P_zend_mm_heap; size:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_zend_mm_free:procedure(heap:P_zend_mm_heap; p:Ppointer; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint); cdecl; +_zend_mm_realloc:function(heap:P_zend_mm_heap; p:Ppointer; size:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_zend_mm_realloc2:function(heap:P_zend_mm_heap; p:Ppointer; size:size_t; copy_size:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):pointer; cdecl; +_zend_mm_block_size:function(heap:P_zend_mm_heap; p:Ppointer; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):size_t; cdecl; +zend_mm_set_heap:function(new_heap:Pzend_mm_heap):P_zend_mm_heap; cdecl; +zend_mm_get_heap:function:P_zend_mm_heap; cdecl; +zend_mm_gc:function(heap:Pzend_mm_heap):size_t; cdecl; +zend_mm_is_custom_heap:function(new_heap:Pzend_mm_heap):longint; cdecl; + +zend_mm_get_storage:function(heap:Pzend_mm_heap):P_zend_mm_storage; cdecl; +zend_mm_startup_ex:function(handlers:Pzend_mm_handlers; data:Ppointer; data_size:size_t):P_zend_mm_heap; cdecl; + + + zend_stack_init:function(stack:Pzend_stack; size:longint):longint; + zend_stack_push:function(stack:Pzend_stack; element:Ppointer):longint; + zend_stack_top:function(stack:Pzend_stack):pointer; + zend_stack_del_top:function(stack:Pzend_stack):longint; + zend_stack_int_top:function(stack:Pzend_stack):longint; + zend_stack_is_empty:function(stack:Pzend_stack):longint; + zend_stack_destroy:function(stack:Pzend_stack):longint; + zend_stack_base:function(stack:Pzend_stack):pointer; + zend_stack_count:function(stack:Pzend_stack):longint; + zend_stack_apply:procedure(stack:Pzend_stack; _type:longint; apply_function:IEJG9458U9845Y45); + zend_stack_apply_with_argument:procedure(stack:Pzend_stack; _type:longint; apply_function:KD45T5H65HTHRTH; arg:Ppointer); + zend_stack_clean:procedure(stack:Pzend_stack; func:f584hj4i5hth; free_elements:zend_bool); + + zend_std_get_static_method:function(ce:P_zend_class_entry; function_name_strval:P_zend_string; key:Pzval):P_zend_function; cdecl; + zend_std_get_static_property:function(ce:P_zend_class_entry; property_name:P_zend_string; silent:zend_bool):Pzval; cdecl; + zend_std_unset_static_property:function(ce:P_zend_class_entry; property_name:P_zend_string):zend_bool; cdecl; + zend_std_get_constructor:function(_object:Pzend_object):P_zend_function; cdecl; + zend_get_property_info:function(ce:P_zend_class_entry; member:P_zend_string; silent:longint):P_zend_property_info; cdecl; + zend_std_get_properties:function(_object:Pzval):PHashTable; cdecl; + zend_std_get_debug_info:function(_object:Pzval; is_temp:Plongint):PHashTable; cdecl; + zend_std_cast_object_tostring:function(readobj:Pzval; writeobj:Pzval; _type:longint):longint; cdecl; + zend_std_write_property:procedure(_object:Pzval; member:Pzval; value:Pzval; cache_slot:Ppointer); cdecl; + rebuild_object_properties:procedure(zobj:Pzend_object); cdecl; + zend_check_private:function(fbc:P_zend_function; ce:P_zend_class_entry; function_name:Pzend_string):longint; cdecl; + zend_check_protected:function(ce:P_zend_class_entry; scope:Pzend_class_entry):longint; cdecl; + zend_check_property_access:function(zobj:P_zend_object; prop_info_name:P_zend_string):longint; cdecl; + zend_get_call_trampoline_func:function(ce:P_zend_class_entry; method_name:P_zend_string; is_static:longint):P_zend_function; cdecl; + zend_ast_create_znode:function(node:Pznode):P_zend_ast; cdecl; + lex_scan:function(zendlval:Pzval):longint; cdecl; + zend_set_compiled_filename:function(new_compiled_filename:P_zend_string):P_zend_string; cdecl; + zend_restore_compiled_filename:procedure(original_compiled_filename:P_zend_string); cdecl; + zend_get_compiled_filename:function:P_zend_string; cdecl; + zend_get_compiled_lineno:function:longint; cdecl; + zend_get_scanned_file_offset:function:size_t; cdecl; + zend_get_compiled_variable_name:function(op_array:P_zend_op_array; _var:Cardinal):P_zend_string; cdecl; + get_unary_op:function(opcode:longint):unary_op_type; cdecl; + get_binary_op:function(opcode:longint):binary_op_type; cdecl; + do_bind_function:function(op_array:P_zend_op_array; opline:P_zend_op; function_table:PHashTable; compile_time:zend_bool):longint; cdecl; + do_bind_class:function(op_array:P_zend_op_array; opline:P_zend_op; class_table:PHashTable; compile_time:zend_bool):P_zend_class_entry; cdecl; + do_bind_inherited_class:function(op_array:P_zend_op_array; opline:P_zend_op; class_table:PHashTable; parent_ce:P_zend_class_entry; compile_time:zend_bool):P_zend_class_entry; cdecl; + zend_do_delayed_early_binding:procedure(op_array:Pzend_op_array); cdecl; + function_add_ref:procedure(_function:Pzend_function); cdecl; + compile_file:function(file_handle:Pzend_file_handle; _type:longint):P_zend_op_array; cdecl; + compile_string:function(source_string:Pzval; filename:zend_pchar):P_zend_op_array; cdecl; + compile_filename:function(_type:longint; filename:Pzval):P_zend_op_array; cdecl; + zend_try_exception_handler:procedure; cdecl; + zend_execute_scripts:function(_type:longint; retval:Pzval; file_count:longint):longint; cdecl varargs; + open_file_for_scanning:function(file_handle:Pzend_file_handle):longint; cdecl; + init_op_array:procedure(op_array:P_zend_op_array; _type:zend_uchar; initial_ops_size:longint); cdecl; + destroy_op_array:procedure(op_array:Pzend_op_array); cdecl; + zend_destroy_file_handle:procedure(file_handle:Pzend_file_handle); cdecl; + zend_cleanup_user_class_data:procedure(ce:Pzend_class_entry); cdecl; + zend_cleanup_internal_class_data:procedure(ce:Pzend_class_entry); cdecl; + zend_cleanup_internal_classes:procedure; cdecl; + zend_cleanup_op_array_data:procedure(op_array:Pzend_op_array); cdecl; + clean_non_persistent_function_full:function(zv:Pzval):longint; cdecl; + clean_non_persistent_class_full:function(zv:Pzval):longint; cdecl; + destroy_zend_function:procedure(_function:Pzend_function); cdecl; + zend_function_dtor:procedure(zv:Pzval); cdecl; + destroy_zend_class:procedure(zv:Pzval); cdecl; + zend_mangle_property_name:function(src1:zend_pchar; src1_length:size_t; src2:zend_pchar; src2_length:size_t; internal:longint):P_zend_string; cdecl; + zend_unmangle_property_name_ex:function(name:Pzend_string; class_name:PPchar; prop_name:PPchar; prop_len:Psize_t):longint; cdecl; + pass_two:function(op_array:Pzend_op_array):longint; cdecl; + zend_is_compiling:function:zend_bool; cdecl; + zend_make_compiled_string_description:function(name:zend_pchar):zend_pchar; cdecl; + zend_initialize_class_data:procedure(ce:Pzend_class_entry; nullify_handlers:zend_bool); cdecl; + zend_get_call_op:function(init_op:zend_uchar; fbc:Pzend_function):zend_uchar; cdecl; + zend_register_auto_global:function(name:Pzend_string; jit:zend_bool; auto_global_callback:zend_auto_global_callback):longint; cdecl; + zend_activate_auto_globals:procedure; cdecl; + zend_is_auto_global:function(name:Pzend_string):zend_bool; cdecl; + zend_is_auto_global_str:function(name:zend_pchar; len:size_t):zend_bool; cdecl; + zend_dirname:function(path:zend_pchar; len:size_t):size_t; cdecl; + zend_set_function_arg_flags:procedure(func:Pzend_function); cdecl; + zend_assert_valid_class_name:procedure(const_name:Pzend_string); cdecl; + zend_ast_create_zval_ex:function(zv:Pzval; attr:zend_ast_attr):P_zend_ast; cdecl; + zend_ast_create_ex:function(kind:zend_ast_kind; attr:zend_ast_attr):P_zend_ast; cdecl varargs; + zend_ast_create:function(kind:zend_ast_kind):P_zend_ast; cdecl varargs; + zend_ast_create_decl:function(kind:zend_ast_kind; flags:Cardinal; start_lineno:Cardinal; doc_comment:Pzend_string; name:Pzend_string; child0:Pzend_ast; child1:Pzend_ast; child2:Pzend_ast; child3:Pzend_ast):P_zend_ast; cdecl; + zend_ast_create_list:function(init_children:Cardinal; kind:zend_ast_kind):P_zend_ast; cdecl varargs; + zend_ast_list_add:function(list:Pzend_ast; op:Pzend_ast):P_zend_ast; cdecl; + zend_ast_evaluate:function(result:Pzval; ast:Pzend_ast; scope:Pzend_class_entry):longint; cdecl; + zend_ast_export:function(prefix:zend_pchar; ast:Pzend_ast; suffix:zend_pchar):P_zend_string; cdecl; + zend_ast_copy:function(ast:Pzend_ast):P_zend_ast; cdecl; + zend_ast_destroy:procedure(ast:Pzend_ast); cdecl; + zend_ast_destroy_and_free:procedure(ast:Pzend_ast); cdecl; + zend_ast_apply:procedure(ast:Pzend_ast; fn:zend_ast_apply_func); cdecl; + zend_stream_open:function(filename:zend_pchar; handle:Pzend_file_handle):longint; cdecl; + zend_stream_fixup:function(file_handle:Pzend_file_handle; buf:PPchar; len:Psize_t):longint; cdecl; + zend_file_handle_dtor:procedure(fh:Pzend_file_handle); cdecl; + zend_compare_file_handles:function(fh1:Pzend_file_handle; fh2:Pzend_file_handle):longint; cdecl; + zend_startup:function(utility_functions:Pzend_utility_functions; extensions:PPchar):longint; cdecl; + zend_shutdown:procedure; cdecl; + zend_register_standard_ini_entries:procedure; cdecl; + zend_post_startup:procedure; cdecl; + zend_set_utility_values:procedure(utility_values:Pzend_utility_values); cdecl; + _zend_bailout:procedure(filename:zend_pchar; lineno:uint); cdecl; + get_zend_version:function:zend_pchar; cdecl; + zend_make_printable_zval:function(expr:Pzval; expr_copy:Pzval):longint; cdecl; + zend_print_zval:function(expr:Pzval; indent:longint):size_t; cdecl; + zend_print_zval_ex:function(write_func:zend_write_func_t; expr:Pzval; indent:longint):size_t; cdecl; + zend_print_zval_r:procedure(expr:Pzval; indent:longint); cdecl; + zend_print_flat_zval_r:procedure(expr:Pzval); cdecl; + zend_print_zval_r_ex:procedure(write_func:zend_write_func_t; expr:Pzval; indent:longint); cdecl; + zend_output_debug_string:procedure(trigger_break:zend_bool; format:zend_pchar); cdecl varargs; + zend_activate:procedure; cdecl; + zend_deactivate:procedure; cdecl; + zend_call_destructors:procedure; cdecl; + zend_activate_modules:procedure; cdecl; + zend_deactivate_modules:procedure; cdecl; + zend_post_deactivate_modules:procedure; cdecl; + free_estring:procedure(str_p:PPchar); cdecl; + zend_error:procedure(_type:longint; format:zend_pchar); cdecl varargs; + zend_throw_error:procedure(exception_ce:Pzend_class_entry; format:zend_pchar); cdecl varargs; + zend_type_error:procedure(format:zend_pchar); cdecl varargs; + zend_internal_type_error:procedure(throw_exception:zend_bool; format:zend_pchar); cdecl varargs; + zenderror:procedure(error:zend_pchar); cdecl; + zend_message_dispatcher:procedure(message:zend_long; data:Ppointer); cdecl; + zend_get_configuration_directive:function(name:Pzend_string):Pzval; cdecl; + zend_next_free_module:function:longint cdecl; + zend_get_parameters:function(ht:longint; param_count:longint):longint; cdecl varargs; + zend_get_parameters_ex:function(param_count:longint):longint; cdecl varargs; + ZvalGetArgs: function(Count: Integer; Args: ppzval): Integer;cdecl varargs; + _zend_get_parameters_array_ex:function(param_count:longint; argument_array:Pzval):longint; cdecl; + zend_copy_parameters_array:function(param_count:longint; argument_array:Pzval):longint; cdecl; + zend_parse_parameters:function(num_args:longint; type_spec:zend_pchar):longint; cdecl varargs; + zend_parse_parameters_ex:function(flags:longint; num_args:longint; type_spec:zend_pchar):longint; cdecl varargs; + zend_parse_parameters_throw:function(num_args:longint; type_spec:zend_pchar):longint; cdecl varargs; + zend_zval_type_name:function(arg:Pzval):zend_pchar; cdecl; + zend_parse_method_parameters:function(num_args:longint; this_ptr:Pzval; type_spec:zend_pchar):longint; cdecl varargs; + zend_parse_method_parameters_ex:function(flags:longint; num_args:longint; this_ptr:Pzval; type_spec:zend_pchar):longint; cdecl varargs; + zend_parse_parameter:function(flags:longint; arg_num:longint; arg:Pzval; spec:zend_pchar):longint; cdecl varargs; + zend_register_functions:function(scope:Pzend_class_entry; functions:Pzend_function_entry; function_table:PHashTable; _type:longint):longint; cdecl; + zend_unregister_functions:procedure(functions:Pzend_function_entry; count:longint; function_table:PHashTable); cdecl; + zend_startup_module:function(module_entry:Pzend_module_entry):longint; cdecl; + zend_register_internal_module:function(module_entry:Pzend_module_entry):P_zend_module_entry; cdecl; + zend_register_module_ex:function(module:Pzend_module_entry):P_zend_module_entry; cdecl; + zend_startup_module_ex:function(module:Pzend_module_entry):longint; cdecl; + zend_startup_modules:function:longint cdecl; + zend_check_magic_method_implementation:procedure(ce:Pzend_class_entry; fptr:Pzend_function; error_type:longint); cdecl; + zend_register_internal_class:function(class_entry:Pzend_class_entry):P_zend_class_entry; cdecl; + zend_register_internal_class_ex:function(class_entry:Pzend_class_entry; parent_ce:Pzend_class_entry):P_zend_class_entry; cdecl; + zend_register_internal_interface:function(orig_class_entry:Pzend_class_entry):P_zend_class_entry; cdecl; + zend_class_implements:procedure(class_entry:Pzend_class_entry; num_interfaces:longint); cdecl varargs; + zend_register_class_alias_ex:function(name:zend_pchar; name_len:size_t; ce:Pzend_class_entry):longint; cdecl; + zend_disable_function:function(function_name:zend_pchar; function_name_length:size_t):longint; cdecl; + zend_disable_class:function(class_name:zend_pchar; class_name_length:size_t):longint; cdecl; + zend_is_callable_ex:function(callable:Pzval; _object:Pzend_object; check_flags:uint; callable_name:PP_zend_string; fcc:Pzend_fcall_info_cache; error:PPchar):zend_bool; cdecl; + zend_is_callable:function(callable:Pzval; check_flags:uint; callable_name:PP_zend_string):zend_bool; cdecl; + zend_make_callable:function(callable:Pzval; callable_name:PP_zend_string):zend_bool; cdecl; + zend_get_module_version:function(module_name:zend_pchar):zend_pchar; cdecl; + zend_get_module_started:function(module_name:zend_pchar):longint; cdecl; + zend_declare_property_ex:function(ce:Pzend_class_entry; name:Pzend_string; _property:Pzval; access_type:longint; doc_comment:Pzend_string):longint; cdecl; + zend_declare_property:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; _property:Pzval; access_type:longint):longint; cdecl; + zend_declare_property_null:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; access_type:longint):longint; cdecl; + zend_declare_property_bool:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_long; access_type:longint):longint; cdecl; + zend_declare_property_long:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_long; access_type:longint):longint; cdecl; + zend_declare_property_double:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:double; access_type:longint):longint; cdecl; + zend_declare_property_string:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_pchar; access_type:longint):longint; cdecl; + zend_declare_property_stringl:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_pchar; value_len:size_t; access_type:longint):longint; cdecl; + zend_declare_class_constant:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:Pzval):longint; cdecl; + zend_declare_class_constant_null:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t):longint; cdecl; + zend_declare_class_constant_long:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_long):longint; cdecl; + zend_declare_class_constant_bool:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_bool):longint; cdecl; + zend_declare_class_constant_double:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:double):longint; cdecl; + zend_declare_class_constant_stringl:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_pchar; value_length:size_t):longint; cdecl; + zend_declare_class_constant_string:function(ce:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_pchar):longint; cdecl; + zend_update_class_constants:function(class_type:Pzend_class_entry):longint; cdecl; + zend_update_property_ex:procedure(scope:Pzend_class_entry; _object:Pzval; name:Pzend_string; value:Pzval); cdecl; + zend_update_property:procedure(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t; value:Pzval); cdecl; + zend_update_property_null:procedure(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t); cdecl; + zend_update_property_bool:procedure(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t; value:zend_long); cdecl; + zend_update_property_long:procedure(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t; value:zend_long); cdecl; + zend_update_property_double:procedure(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t; value:double); cdecl; + zend_update_property_str:procedure(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t; value:Pzend_string); cdecl; + zend_update_property_string:procedure(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t; value:zend_pchar); cdecl; + zend_update_property_stringl:procedure(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t; value:zend_pchar; value_length:size_t); cdecl; + zend_update_static_property:function(scope:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:Pzval):longint; cdecl; + zend_update_static_property_null:function(scope:Pzend_class_entry; name:zend_pchar; name_length:size_t):longint; cdecl; + zend_update_static_property_bool:function(scope:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_long):longint; cdecl; + zend_update_static_property_long:function(scope:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_long):longint; cdecl; + zend_update_static_property_double:function(scope:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:double):longint; cdecl; + zend_update_static_property_string:function(scope:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_pchar):longint; cdecl; + zend_update_static_property_stringl:function(scope:Pzend_class_entry; name:zend_pchar; name_length:size_t; value:zend_pchar; value_length:size_t):longint; cdecl; + zend_read_property:function(scope:Pzend_class_entry; _object:Pzval; name:zend_pchar; name_length:size_t; silent:zend_bool; rv:Pzval):Pzval; cdecl; + zend_read_static_property:function(scope:Pzend_class_entry; name:zend_pchar; name_length:size_t; silent:zend_bool):Pzval; cdecl; + zend_get_type_by_const:function(_type:longint):zend_pchar; cdecl; + _array_init:function(arg:Pzval; size:Cardinal):longint; cdecl; + _object_init:function(arg:Pzval; __zend_filename:zend_pchar; __zend_lineno:uint):longint; cdecl; + _object_init_ex:function(arg:Pzval; ce:Pzend_class_entry; __zend_filename:zend_pchar; __zend_lineno:uint):longint; cdecl; + _object_and_properties_init:function(arg:Pzval; ce:Pzend_class_entry; properties:PHashTable; __zend_filename:zend_pchar; __zend_lineno:uint):longint; cdecl; + object_properties_init:procedure(_object:Pzend_object; class_type:Pzend_class_entry); cdecl; + object_properties_init_ex:procedure(_object:Pzend_object; properties:PHashTable); cdecl; + object_properties_load:procedure(_object:Pzend_object; properties:PHashTable); cdecl; + zend_merge_properties:procedure(obj:Pzval; properties:PHashTable); cdecl; + add_assoc_long_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; n:zend_long):longint; cdecl; + add_assoc_null_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t):longint; cdecl; + add_assoc_bool_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; b:longint):longint; cdecl; + add_assoc_resource_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; r:Pzend_resource):longint; cdecl; + add_assoc_double_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; d:double):longint; cdecl; + add_assoc_str_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; str:Pzend_string):longint; cdecl; + add_assoc_string_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; str:zend_pchar):longint; cdecl; + add_assoc_stringl_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; str:zend_pchar; length:size_t):longint; cdecl; + add_assoc_zval_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; value:Pzval):longint; cdecl; + add_index_long:function(arg:Pzval; idx:zend_ulong; n:zend_long):longint; cdecl; + add_index_null:function(arg:Pzval; idx:zend_ulong):longint; cdecl; + add_index_bool:function(arg:Pzval; idx:zend_ulong; b:longint):longint; cdecl; + add_index_resource:function(arg:Pzval; idx:zend_ulong; r:Pzend_resource):longint; cdecl; + add_index_double:function(arg:Pzval; idx:zend_ulong; d:double):longint; cdecl; + add_index_str:function(arg:Pzval; idx:zend_ulong; str:Pzend_string):longint; cdecl; + add_index_string:function(arg:Pzval; idx:zend_ulong; str:zend_pchar):longint; cdecl; + add_index_stringl:function(arg:Pzval; idx:zend_ulong; str:zend_pchar; length:size_t):longint; cdecl; + add_index_zval:function(arg:Pzval; index:zend_ulong; value:Pzval):longint; cdecl; + add_next_index_long:function(arg:Pzval; n:zend_long):longint; cdecl; + add_next_index_null:function(arg:Pzval):longint; cdecl; + add_next_index_bool:function(arg:Pzval; b:longint):longint; cdecl; + add_next_index_resource:function(arg:Pzval; r:Pzend_resource):longint; cdecl; + add_next_index_double:function(arg:Pzval; d:double):longint; cdecl; + add_next_index_str:function(arg:Pzval; str:Pzend_string):longint; cdecl; + add_next_index_string:function(arg:Pzval; str:zend_pchar):longint; cdecl; + add_next_index_stringl:function(arg:Pzval; str:zend_pchar; length:size_t):longint; cdecl; + add_next_index_zval:function(arg:Pzval; value:Pzval):longint; cdecl; + add_get_assoc_string_ex:function(arg:Pzval; key:zend_pchar; key_len:uint; str:zend_pchar):Pzval; cdecl; + add_get_assoc_stringl_ex:function(arg:Pzval; key:zend_pchar; key_len:uint; str:zend_pchar; length:size_t):Pzval; cdecl; + add_get_index_long:function(arg:Pzval; idx:zend_ulong; l:zend_long):Pzval; cdecl; + add_get_index_double:function(arg:Pzval; idx:zend_ulong; d:double):Pzval; cdecl; + add_get_index_str:function(arg:Pzval; index:zend_ulong; str:Pzend_string):Pzval; cdecl; + add_get_index_string:function(arg:Pzval; idx:zend_ulong; str:zend_pchar):Pzval; cdecl; + add_get_index_stringl:function(arg:Pzval; idx:zend_ulong; str:zend_pchar; length:size_t):Pzval; cdecl; + array_set_zval_key:function(ht:PHashTable; key:Pzval; value:Pzval):longint; cdecl; + add_property_long_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; l:zend_long):longint; cdecl; + add_property_null_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t):longint; cdecl; + add_property_bool_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; b:zend_long):longint; cdecl; + add_property_resource_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; r:Pzend_resource):longint; cdecl; + add_property_double_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; d:double):longint; cdecl; + add_property_str_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; str:Pzend_string):longint; cdecl; + add_property_string_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; str:zend_pchar):longint; cdecl; + add_property_stringl_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; str:zend_pchar; length:size_t):longint; cdecl; + add_property_zval_ex:function(arg:Pzval; key:zend_pchar; key_len:size_t; value:Pzval):longint; cdecl; + call_user_function:function(function_table:PHashTable; _object:Pzval; function_name:Pzval; retval_ptr:Pzval; param_count:Cardinal; params:Pzval):longint; cdecl; + call_user_function_ex:function(function_table:PHashTable; _object:Pzval; function_name:Pzval; retval_ptr:Pzval; param_count:Cardinal; params:Pzval; no_separation:longint; symbol_table:Pzend_array):longint; cdecl; + zend_fcall_info_init:function(callable:Pzval; check_flags:uint; fci:Pzend_fcall_info; fcc:Pzend_fcall_info_cache; callable_name:PP_zend_string; error:PPchar):longint; cdecl; + zend_fcall_info_args_clear:procedure(fci:Pzend_fcall_info; free_mem:longint); cdecl; + zend_fcall_info_args_save:procedure(fci:Pzend_fcall_info; param_count:Plongint; params:PPzval); cdecl; + zend_fcall_info_args_restore:procedure(fci:Pzend_fcall_info; param_count:longint; params:Pzval); cdecl; + zend_fcall_info_args:function(fci:Pzend_fcall_info; args:Pzval):longint; cdecl; + zend_fcall_info_args_ex:function(fci:Pzend_fcall_info; func:Pzend_function; args:Pzval):longint; cdecl; + zend_fcall_info_argp:function(fci:Pzend_fcall_info; argc:longint; argv:Pzval):longint; cdecl; + zend_fcall_info_argv:function(fci:Pzend_fcall_info; argc:longint; argv:pPChar):longint; cdecl; + zend_fcall_info_argn:function(fci:Pzend_fcall_info; argc:longint):longint; cdecl varargs; + zend_fcall_info_call:function(fci:Pzend_fcall_info; fcc:Pzend_fcall_info_cache; retval:Pzval; args:Pzval):longint; cdecl; + zend_call_function:function(fci:Pzend_fcall_info; fci_cache:Pzend_fcall_info_cache):longint; cdecl; + zend_set_hash_symbol:function(symbol:Pzval; name:zend_pchar; name_length:longint; is_ref:zend_bool; num_symbol_tables:longint; args:array of const):longint; cdecl; + zend_delete_global_variable:function(name:Pzend_string):longint; cdecl; + zend_rebuild_symbol_table:function:P_zend_array cdecl; + zend_attach_symbol_table:procedure(execute_data:P_zend_execute_data); cdecl; + zend_detach_symbol_table:procedure(execute_data:P_zend_execute_data); cdecl; + zend_set_local_var:function(name:Pzend_string; value:Pzval; force:longint):longint; cdecl; + zend_set_local_var_str:function(name:zend_pchar; len:size_t; value:Pzval; force:longint):longint; cdecl; + zend_find_alias_name:function(ce:Pzend_class_entry; name:Pzend_string):P_zend_string; cdecl; + zend_resolve_method_name:function(ce:Pzend_class_entry; f:Pzend_function):P_zend_string; cdecl; + zend_get_object_type:function(ce:Pzend_class_entry):zend_pchar; cdecl; + zend_wrong_paramers_count_error:procedure(num_args:longint; min_num_args:longint; max_num_args:longint); cdecl; + zend_wrong_paramer_type_error:procedure(num:longint; expected_type:Ppointer; arg:Pzval); cdecl; + zend_wrong_paramer_class_error:procedure(num:longint; name:zend_pchar; arg:Pzval); cdecl; + zend_wrong_callback_error:procedure(severity:longint; num:longint; error:zend_pchar); cdecl; + zend_parse_arg_class:function(arg:Pzval; pce:PP_zend_class_entry; num:longint; check_null:longint):longint; cdecl; + zend_parse_arg_bool_slow:function(arg:Pzval; dest:Pzend_bool):longint; cdecl; + zend_parse_arg_bool_weak:function(arg:Pzval; dest:Pzend_bool):longint; cdecl; + zend_parse_arg_long_slow:function(arg:Pzval; dest:Pzend_long):longint; cdecl; + zend_parse_arg_long_weak:function(arg:Pzval; dest:Pzend_long):longint; cdecl; + zend_parse_arg_long_cap_slow:function(arg:Pzval; dest:Pzend_long):longint; cdecl; + zend_parse_arg_long_cap_weak:function(arg:Pzval; dest:Pzend_long):longint; cdecl; + zend_parse_arg_double_slow:function(arg:Pzval; dest:Pdouble):longint; cdecl; + zend_parse_arg_double_weak:function(arg:Pzval; dest:Pdouble):longint; cdecl; + zend_parse_arg_str_slow:function(arg:Pzval; dest:PP_zend_string):longint; cdecl; + zend_parse_arg_str_weak:function(arg:Pzval; dest:PP_zend_string):longint; cdecl; + module_destructor:procedure(module:Pzend_module_entry); cdecl; + module_registry_request_startup:function(module:Pzend_module_entry):longint; cdecl; + module_registry_unload_temp:function(module:Pzend_module_entry):longint; cdecl; + + + sapi_startup:procedure( sf:p_sapi_module_struct); cdecl; + sapi_shutdown:procedure; cdecl; + sapi_activate:procedure; cdecl; + sapi_deactivate:procedure; cdecl; + sapi_initialize_empty_request:procedure; cdecl; + sapi_header_op:function(op:sapi_header_op_enum; arg:Ppointer):longint; cdecl; + sapi_add_header_ex:function(header_line:zend_pchar; header_line_len:size_t; duplicate:zend_bool; replace:zend_bool):longint; cdecl; + sapi_send_headers:function:longint; cdecl; + sapi_free_header:procedure(sapi_header:Psapi_header_struct); cdecl; + sapi_handle_post:procedure(arg:Ppointer); cdecl; + sapi_read_post_block:function(buffer:zend_pchar; buflen:size_t):size_t; cdecl; + sapi_register_post_entries:function(post_entry:Psapi_post_entry):longint; cdecl; + sapi_register_post_entry:function(post_entry:Psapi_post_entry):longint; cdecl; + sapi_unregister_post_entry:procedure(post_entry:Psapi_post_entry); cdecl; + sapi_register_default_post_reader:pointer; + sapi_register_treat_data:function(treat_data:pointer):longint; + sapi_register_input_filter:function(input_filter:pointer; input_filter_init:pointer):longint; + sapi_flush:function:longint; cdecl; + sapi_get_stat:function:P_zend_stat_t; cdecl; + sapi_getenv:function(name:zend_pchar; name_len:size_t):zend_pchar; cdecl; + sapi_get_default_content_type:function:zend_pchar; cdecl; + sapi_get_default_content_type_header:procedure(default_header:Psapi_header_struct); cdecl; + sapi_apply_default_charset:function(mimetype:PPchar; len:size_t):size_t; cdecl; + sapi_activate_headers_only:procedure; cdecl; + sapi_get_fd:function(fd:Plongint):longint; cdecl; + sapi_force_http_10:function:longint; cdecl; + sapi_get_target_uid:function(_para1:Puid_t):longint; cdecl; + sapi_get_target_gid:function(_para1:Pgid_t):longint; cdecl; + sapi_get_request_time:function:double; cdecl; + sapi_terminate_process:procedure; cdecl; +_php_stream_alloc:function(ops:Pphp_stream_ops; _abstract:Ppointer; persistent_id:zend_pchar; mode:zend_pchar; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):P_php_stream; cdecl; +_php_stream_tell:function(stream:Pphp_stream):zend_off_t; cdecl; +_php_stream_read:function(stream:Pphp_stream; buf:zend_pchar; count:size_t):size_t; cdecl; +_php_stream_write:function(stream:Pphp_stream; buf:zend_pchar; count:size_t):size_t; cdecl; +_php_stream_fill_read_buffer:procedure(stream:Pphp_stream; size:size_t); cdecl; +_php_stream_printf:function(stream:Pphp_stream; fmt:zend_pchar):size_t; cdecl varargs; +_php_stream_eof:function(stream:Pphp_stream):longint; cdecl; +_php_stream_seek:function(stream:Pphp_stream; offset:zend_off_t; whence:longint):longint; cdecl; +_php_stream_free:function(stream:Pphp_stream; close_options:longint):longint; cdecl; +php_stream_encloses:function(enclosing:Pphp_stream; enclosed:Pphp_stream):P_php_stream; cdecl; +_php_stream_free_enclosed:function(stream_enclosed:Pphp_stream; close_options:longint):longint; cdecl; +php_stream_from_persistent_id:function(persistent_id:zend_pchar; stream:PP_php_stream):longint; cdecl; +php_file_le_stream:function:longint; cdecl; +php_file_le_pstream:function:longint; cdecl; +php_file_le_stream_filter:function:longint; cdecl; +_php_stream_getc:function(stream:Pphp_stream):longint; cdecl; +_php_stream_putc:function(stream:Pphp_stream; c:longint):longint; cdecl; +_php_stream_flush:function(stream:Pphp_stream; closing:longint):longint; cdecl; +_php_stream_get_line:function(stream:Pphp_stream; buf:zend_pchar; maxlen:size_t; returned_len:Psize_t):zend_pchar; cdecl; +_php_stream_get_url_stream_wrappers_hash:function:PHashTable; cdecl; +php_stream_get_url_stream_wrappers_hash_global:function:PHashTable; cdecl; +_php_get_stream_filters_hash:function:PHashTable; cdecl; +php_get_stream_filters_hash_global:function:PHashTable; cdecl; +_php_stream_truncate_set_size:function(stream:Pphp_stream; newsize:size_t):longint; cdecl; +_php_stream_make_seekable:function(origstream:Pphp_stream; newstream:PP_php_stream; flags:longint; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):longint; cdecl; +_php_stream_copy_to_stream:function(src:Pphp_stream; dest:Pphp_stream; maxlen:size_t; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):size_t; cdecl; +_php_stream_copy_to_mem:function(src:Pphp_stream; maxlen:size_t; persistent:longint; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):P_zend_string; cdecl; +_php_stream_copy_to_stream_ex:function(src:Pphp_stream; dest:Pphp_stream; maxlen:size_t; len:Psize_t; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):longint; cdecl; +_php_stream_passthru:function(src:Pphp_stream; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):size_t; cdecl; +_php_stream_cast:function(stream:Pphp_stream; castas:longint; ret:Ppointer; show_err:longint):longint; cdecl; +php_register_url_stream_wrapper:function(protocol:zend_pchar; wrapper:Pphp_stream_wrapper):longint; cdecl; +php_unregister_url_stream_wrapper:function(protocol:zend_pchar):longint; cdecl; +php_register_url_stream_wrapper_volatile:function(protocol:zend_pchar; wrapper:Pphp_stream_wrapper):longint; cdecl; +php_unregister_url_stream_wrapper_volatile:function(protocol:zend_pchar):longint; cdecl; +_php_stream_open_wrapper_ex:function(path:zend_pchar; mode:zend_pchar; options:longint; opened_path:PP_zend_string; context:Pphp_stream_context; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):P_php_stream; cdecl; +php_stream_locate_url_wrapper:function(path:zend_pchar; path_for_open:PPchar; options:longint):P_php_stream_wrapper; cdecl; +php_stream_locate_eol:function(stream:Pphp_stream; buf:Pzend_string):zend_pchar; cdecl; +php_stream_get_record:function(stream:Pphp_stream; maxlen:size_t; delim:zend_pchar; delim_len:size_t):P_zend_string; cdecl; +php_stream_wrapper_log_error:procedure(wrapper:Pphp_stream_wrapper; options:longint; fmt:zend_pchar); cdecl varargs; +_php_stream_puts:function(stream:Pphp_stream; buf:zend_pchar):longint; cdecl; +_php_stream_stat:function(stream:Pphp_stream; ssb:Pphp_stream_statbuf):longint; cdecl; +_php_stream_stat_path:function(path:zend_pchar; flags:longint; ssb:Pphp_stream_statbuf; context:Pphp_stream_context):longint; cdecl; +_php_stream_mkdir:function(path:zend_pchar; mode:longint; options:longint; context:Pphp_stream_context):longint; cdecl; +_php_stream_rmdir:function(path:zend_pchar; options:longint; context:Pphp_stream_context):longint; cdecl; +_php_stream_opendir:function(path:zend_pchar; options:longint; context:Pphp_stream_context; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):P_php_stream; cdecl; +_php_stream_readdir:function(dirstream:Pphp_stream; ent:Pphp_stream_dirent):Pphp_stream_dirent; cdecl; +php_stream_dirent_alphasort:function(a:PP_zend_string; b:PP_zend_string):longint; cdecl; +php_stream_dirent_alphasortr:function(a:PP_zend_string; b:PP_zend_string):longint; cdecl; + _php_stream_scandir:function(dirname:zend_pchar; namelist:PPP_zend_string; flags:longint; context:Pphp_stream_context; compare:pointer):longint; +_php_stream_set_option:function(stream:Pphp_stream; option:longint; value:longint; ptrparam:Ppointer):longint; cdecl; +php_stream_context_free:procedure(context:Pphp_stream_context); cdecl; +php_stream_context_alloc:function:P_php_stream_context; cdecl; +php_stream_context_get_option:function(context:Pphp_stream_context; wrappername:zend_pchar; optionname:zend_pchar):Pzval; cdecl; +php_stream_context_set_option:function(context:Pphp_stream_context; wrappername:zend_pchar; optionname:zend_pchar; optionvalue:Pzval):longint; cdecl; +php_stream_notification_alloc:function:P_php_stream_notifier; cdecl; +php_stream_notification_free:procedure(notifier:P_php_stream_notifier); cdecl; +php_stream_notification_notify:procedure(context:Pphp_stream_context; notifycode:longint; severity:longint; xmsg:zend_pchar; xcode:longint; +bytes_sofar:size_t; bytes_max:size_t; ptr:Ppointer); +php_stream_context_set:function(stream:Pphp_stream; context:Pphp_stream_context):P_php_stream_context; cdecl; +zend_llist_init:procedure(l:Pzend_llist; size:size_t; dtor:llist_dtor_func_t; persistent:byte); cdecl; +zend_llist_add_element:procedure(l:Pzend_llist; element:Ppointer); cdecl; +zend_llist_prepend_element:procedure(l:Pzend_llist; element:Ppointer); cdecl; +zend_llist_del_element:procedure(l:Pzend_llist; element:Ppointer; compare:ERGERG43T4T545YH546); +zend_llist_destroy:procedure(l:Pzend_llist); cdecl; +zend_llist_clean:procedure(l:Pzend_llist); cdecl; +zend_llist_remove_tail:procedure(l:Pzend_llist); cdecl; +zend_llist_copy:procedure(dst:Pzend_llist; src:Pzend_llist); cdecl; +zend_llist_apply:procedure(l:Pzend_llist; func:llist_apply_func_t); cdecl; +zend_llist_apply_with_del:procedure(l:Pzend_llist; func:RGEKG34I9TI3434); cdecl; +zend_llist_apply_with_argument:procedure(l:Pzend_llist; func:llist_apply_with_arg_func_t; arg:Ppointer); cdecl; +zend_llist_apply_with_arguments:procedure(l:Pzend_llist; func:llist_apply_with_args_func_t; num_args:longint); cdecl varargs; +zend_llist_count:function(l:Pzend_llist):size_t; cdecl; +zend_llist_sort:procedure(l:Pzend_llist; comp_func:llist_compare_func_t); cdecl; +zend_llist_get_first_ex:function(l:Pzend_llist; pos:Pzend_llist_position):pointer; cdecl; +zend_llist_get_last_ex:function(l:Pzend_llist; pos:Pzend_llist_position):pointer; cdecl; +zend_llist_get_next_ex:function(l:Pzend_llist; pos:Pzend_llist_position):pointer; cdecl; +zend_llist_get_prev_ex:function(l:Pzend_llist; pos:Pzend_llist_position):pointer; cdecl; +php_stream_filter_register_factory:function(filterpattern:zend_pchar; factory:Pphp_stream_filter_factory):longint; cdecl; +php_stream_filter_unregister_factory:function(filterpattern:zend_pchar):longint; cdecl; +php_stream_filter_register_factory_volatile:function(filterpattern:zend_pchar; factory:Pphp_stream_filter_factory):longint; cdecl; +php_stream_filter_create:function(filtername:zend_pchar; filterparams:Pzval; persistent:longint):P_php_stream_filter; cdecl; +_php_stream_filter_prepend:procedure(chain:Pphp_stream_filter_chain; filter:Pphp_stream_filter); cdecl; +php_stream_filter_prepend_ex:function(chain:Pphp_stream_filter_chain; filter:Pphp_stream_filter):longint; cdecl; +_php_stream_filter_append:procedure(chain:Pphp_stream_filter_chain; filter:Pphp_stream_filter); cdecl; +php_stream_filter_append_ex:function(chain:Pphp_stream_filter_chain; filter:Pphp_stream_filter):longint; cdecl; +_php_stream_filter_flush:function(filter:Pphp_stream_filter; finish:longint):longint; cdecl; +php_stream_filter_remove:function(filter:Pphp_stream_filter; call_dtor:longint):P_php_stream_filter; cdecl; +php_stream_filter_free:procedure(filter:Pphp_stream_filter); cdecl; +_php_stream_filter_alloc:function(fops:Pphp_stream_filter_ops; _abstract:Ppointer; persistent:longint; __php_stream_call_depth:longint; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint):P_php_stream_filter; cdecl; +php_stream_bucket_new:function(stream:Pphp_stream; buf:zend_pchar; buflen:size_t; own_buf:longint; buf_persistent:longint):P_php_stream_bucket; cdecl; +php_stream_bucket_split:function(_in:Pphp_stream_bucket; left:PP_php_stream_bucket; right:PP_php_stream_bucket; length:size_t):longint; cdecl; +php_stream_bucket_delref:procedure(bucket:Pphp_stream_bucket); cdecl; +php_stream_bucket_prepend:procedure(brigade:Pphp_stream_bucket_brigade; bucket:Pphp_stream_bucket); cdecl; +php_stream_bucket_append:procedure(brigade:Pphp_stream_bucket_brigade; bucket:Pphp_stream_bucket); cdecl; +php_stream_bucket_unlink:procedure(bucket:Pphp_stream_bucket); cdecl; +php_stream_bucket_make_writeable:function(bucket:Pphp_stream_bucket):P_php_stream_bucket; cdecl; +zend_init_execute_data:procedure(execute_data:Pzend_execute_data; op_array:Pzend_op_array; return_value:Pzval); cdecl; +zend_create_generator_execute_data:function(call:Pzend_execute_data; op_array:Pzend_op_array; return_value:Pzval):P_zend_execute_data; cdecl; +zend_execute:procedure(op_array:Pzend_op_array; return_value:Pzval); cdecl; +execute_ex:procedure(execute_data:Pzend_execute_data); cdecl; +execute_internal:procedure(execute_data:Pzend_execute_data; return_value:Pzval); cdecl; +zend_lookup_class:function(name:Pzend_string):P_zend_class_entry; cdecl; +zend_lookup_class_ex:function(name:Pzend_string; key:Pzval; use_autoload:longint):P_zend_class_entry; cdecl; +zend_get_called_scope:function(ex:Pzend_execute_data):P_zend_class_entry; cdecl; +zend_get_this_object:function(ex:Pzend_execute_data):P_zend_object; cdecl; +zend_eval_string:function(str:zend_pchar; retval_ptr:Pzval; string_name:zend_pchar):longint; cdecl; +zend_eval_stringl:function(str:zend_pchar; str_len:size_t; retval_ptr:Pzval; string_name:zend_pchar):longint; cdecl; +zend_eval_string_ex:function(str:zend_pchar; retval_ptr:pzval; string_name:zend_pchar; handle_exceptions:longint):longint; cdecl; +zend_eval_stringl_ex:function(str:zend_pchar; str_len:size_t; retval_ptr:Pzval; string_name:zend_pchar; handle_exceptions:longint):longint; cdecl; +zval_update_constant:function(pp:Pzval; inline_change:zend_bool):longint; cdecl; +zval_update_constant_ex:function(pp:Pzval; inline_change:zend_bool; scope:Pzend_class_entry):longint; cdecl; +zend_vm_stack_init:procedure; cdecl; +zend_vm_stack_destroy:procedure; cdecl; +zend_vm_stack_extend:function(size:size_t):pointer; cdecl; +get_active_class_name:function(space:PPchar):zend_pchar; cdecl; +get_active_function_name:function:zend_pchar; cdecl; +zend_get_executed_filename:function:zend_pchar; cdecl; +zend_get_executed_filename_ex:function:P_zend_string; cdecl; +zend_get_executed_lineno:function:uint; cdecl; +zend_is_executing:function:zend_bool; cdecl; +zend_set_timeout:procedure(seconds:zend_long; reset_signals:longint); cdecl; +zend_unset_timeout:procedure; cdecl; +zend_timeout:procedure(dummy:longint); cdecl; +zend_fetch_class:function(class_name:Pzend_string; fetch_type:longint):P_zend_class_entry; cdecl; +zend_fetch_class_by_name:function(class_name:Pzend_string; key:Pzval; fetch_type:longint):P_zend_class_entry; cdecl; +zend_fetch_dimension_by_zval:procedure(result:Pzval; container:Pzval; dim:Pzval); cdecl; +zend_fetch_dimension_by_zval_is:procedure(result:Pzval; container:Pzval; dim:Pzval; dim_type:longint); cdecl; +EX_VAR:function(execute_data_ptr:Pzend_execute_data; _var:uint32_t):Pzval; cdecl; +zend_set_user_opcode_handler:function(opcode:zend_uchar; handler:user_opcode_handler_t):longint; cdecl; +zend_get_user_opcode_handler:function(opcode:zend_uchar):user_opcode_handler_t; cdecl; +zend_get_zval_ptr:function(op_type:longint; node:Pznode_op; execute_data:Pzend_execute_data; should_free:Pzend_free_op; _type:longint):Pzval; cdecl; +zend_clean_and_cache_symbol_table:procedure(symbol_table:Pzend_array); cdecl; +zend_objects_store_init:procedure(objects:Pzend_objects_store; init_size:uint32_t); cdecl; +zend_objects_store_call_destructors:procedure(objects:Pzend_objects_store); cdecl; +zend_objects_store_mark_destructed:procedure(objects:Pzend_objects_store); cdecl; +zend_objects_store_destroy:procedure(objects:Pzend_objects_store); cdecl; +zend_objects_store_put:procedure(_object:Pzend_object); cdecl; +zend_objects_store_del:procedure(_object:Pzend_object); cdecl; +zend_objects_store_free:procedure(_object:Pzend_object); cdecl; +zend_object_store_set_object:procedure(zobject:Pzval; _object:Pzend_object); cdecl; +zend_object_store_ctor_failed:procedure(_object:Pzend_object); cdecl; +zend_objects_store_free_object_storage:procedure(objects:Pzend_objects_store); cdecl; +zend_get_std_object_handlers:function:P_zend_object_handlers; cdecl; + +zend_ptr_stack_init:procedure(stack:Pzend_ptr_stack); cdecl; +zend_ptr_stack_init_ex:procedure(stack:Pzend_ptr_stack; persistent:zend_bool); cdecl; +zend_ptr_stack_n_push:procedure(stack:Pzend_ptr_stack; count:longint; args:array of const); cdecl; +zend_ptr_stack_n_pop:procedure(stack:Pzend_ptr_stack; count:longint; args:array of const); cdecl; +zend_ptr_stack_destroy:procedure(stack:Pzend_ptr_stack); cdecl; +zend_ptr_stack_apply:procedure(stack:Pzend_ptr_stack; func:EWFG439EGRG45); cdecl; +zend_ptr_stack_clean:procedure(stack:Pzend_ptr_stack; func:G5J90E4GK495Y4; free_elements:zend_bool); cdecl; +zend_ptr_stack_num_elements:function(stack:Pzend_ptr_stack):longint; cdecl; +zend_ini_startup:function:longint; cdecl; +zend_ini_shutdown:function:longint; cdecl; +zend_ini_global_shutdown:function:longint; cdecl; +zend_ini_deactivate:function:longint; cdecl; +zend_ini_dtor:procedure(ini_directives:PHashTable); cdecl; +zend_copy_ini_directives:function:longint; cdecl; +zend_ini_sort_entries:procedure; cdecl; +zend_register_ini_entries:function(ini_entry:Pzend_ini_entry_def; module_number:longint):longint; cdecl; +zend_unregister_ini_entries:procedure(module_number:longint); cdecl; +zend_ini_refresh_caches:procedure(stage:longint); cdecl; +zend_alter_ini_entry:function( name:zend_string; new_value:Pzend_string; modify_type:longint; stage:longint):longint; cdecl; +zend_alter_ini_entry_ex:function(name:Pzend_string; new_value:Pzend_string; modify_type:longint; stage:longint; force_change:longint):longint; cdecl; +zend_alter_ini_entry_chars:function(name:Pzend_string; value:Pchar; value_length:size_t; modify_type:longint; stage:longint):longint; cdecl; +zend_alter_ini_entry_chars_ex:function(name:Pzend_string; value:Pchar; value_length:size_t; modify_type:longint; stage:longint; force_change:longint):longint; cdecl; +zend_restore_ini_entry:function(name:Pzend_string; stage:longint):longint; cdecl; +display_ini_entries:procedure(module:Pzend_module_entry); cdecl; +zend_ini_long:function(name:Pchar; name_length:uint; orig:longint):zend_long; cdecl; +zend_ini_double:function(name:Pchar; name_length:uint; orig:longint):double; cdecl; +zend_ini_string:function(name:Pchar; name_length:uint; orig:longint):Pchar; cdecl; +zend_ini_string_ex:function(name:Pchar; name_length:uint; orig:longint; exists:Pzend_bool):Pchar; cdecl; +zend_ini_register_displayer:function(name:Pchar; name_length:uint; displayer:IEJORGJIERGE):longint; cdecl; +zend_parse_ini_file:function(fh:Pzend_file_handle; unbuffered_errors:zend_bool; scanner_mode:longint; ini_parser_cb:zend_ini_parser_cb_t; arg:Ppointer):longint; cdecl; +zend_parse_ini_string:function(str:Pchar; unbuffered_errors:zend_bool; scanner_mode:longint; ini_parser_cb:zend_ini_parser_cb_t; arg:Ppointer):longint; cdecl; + + + +_zend_hash_init:procedure(ht:PHashTable; nSize:uint32_t; pDestructor:dtor_func_t; persistent:zend_bool; __zend_filename:Pchar; __zend_lineno:uint); cdecl; +_zend_hash_init_ex:procedure(ht:PHashTable; nSize:uint32_t; pDestructor:dtor_func_t; persistent:zend_bool; bApplyProtection:zend_bool; __zend_filename:Pchar; __zend_lineno:uint); cdecl; +zend_hash_destroy:procedure(ht:PHashTable); cdecl; +zend_hash_clean:procedure(ht:PHashTable); cdecl; +zend_hash_real_init:procedure(ht:PHashTable; _packed:zend_bool); cdecl; +zend_hash_packed_to_hash:procedure(ht:PHashTable); cdecl; +zend_hash_to_packed:procedure(ht:PHashTable); cdecl; +zend_hash_extend:procedure(ht:PHashTable; nSize:uint32_t; _packed:zend_bool); cdecl; +_zend_hash_add_or_update:function(ht:PHashTable; key:Pzend_string; pData:Pzval; flag:uint32_t; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_update:function(ht:PHashTable; key:Pzend_string; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_update_ind:function(ht:PHashTable; key:Pzend_string; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_add:function(ht:PHashTable; key:Pzend_string; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_add_new:function(ht:PHashTable; key:Pzend_string; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_str_add_or_update:function(ht:PHashTable; key:Pchar; len:size_t; pData:Pzval; flag:uint32_t; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_str_update:function(ht:PHashTable; key:Pchar; len:size_t; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_str_update_ind:function(ht:PHashTable; key:Pchar; len:size_t; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_str_add:function(ht:PHashTable; key:Pchar; len:size_t; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_str_add_new:function(ht:PHashTable; key:Pchar; len:size_t; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_index_add_or_update:function(ht:PHashTable; h:zend_ulong; pData:Pzval; flag:uint32_t):Pzval; cdecl; +_zend_hash_index_add:function(ht:PHashTable; h:zend_ulong; pData:Pzval):Pzval; cdecl; +_zend_hash_index_add_new:function(ht:PHashTable; h:zend_ulong; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_index_update:function(ht:PHashTable; h:zend_ulong; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_next_index_insert:function(ht:PHashTable; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_next_index_insert_new:function(ht:PHashTable; pData:zval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +zend_hash_index_add_empty_element:function(ht:PHashTable; h:zend_ulong):Pzval; cdecl; +zend_hash_add_empty_element:function(ht:PHashTable; key:Pzend_string):Pzval; cdecl; +zend_hash_str_add_empty_element:function(ht:PHashTable; key:Pchar; len:size_t):Pzval; cdecl; +zend_hash_graceful_destroy:procedure(ht:PHashTable); cdecl; +zend_hash_graceful_reverse_destroy:procedure(ht:PHashTable); cdecl; +zend_hash_apply:procedure(ht:PHashTable; apply_func:Tapply_func_t); cdecl; +zend_hash_apply_with_argument:procedure(ht:PHashTable; apply_func:Tapply_func_arg_t; para3:pointer); cdecl; +zend_hash_apply_with_arguments:procedure(ht:PHashTable; apply_func:Tapply_func_args_t; para3:longint; args:array of const); cdecl; +zend_hash_reverse_apply:procedure(ht:PHashTable; apply_func:Tapply_func_t); cdecl; +zend_hash_del:function(ht:PHashTable; key:Pzend_string):longint; cdecl; +zend_hash_del_ind:function(ht:PHashTable; key:Pzend_string):longint; cdecl; +zend_hash_str_del:function(ht:PHashTable; key:Pchar; len:size_t):longint; cdecl; +zend_hash_str_del_ind:function(ht:PHashTable; key:Pchar; len:size_t):longint; cdecl; +zend_hash_index_del:function(ht:PHashTable; h:zend_ulong):longint; cdecl; +zend_hash_del_bucket:procedure(ht:PHashTable; p:PBucket); cdecl; +zend_hash_find:function(ht:PHashTable; key:Pzend_string):Pzval; cdecl; +zend_hash_str_find:function(ht:PHashTable; key:Pchar; len:size_t):Pzval; cdecl; + +zend_hash_index_findZval:function( ht:pzval; h:zend_ulong):Pzval; cdecl; +zend_symtable_findTest:function( ht:pzval; key:pzend_string):Pzval; cdecl; +zend_hash_index_existsZval:function( ht:pzval; h:zend_ulong):zend_bool; cdecl; + + +zend_hash_index_find:function(ht:PHashTable; h:zend_ulong):Pzval; cdecl; + +zend_hash_exists:function(ht:PHashTable; key:Pzend_string):zend_bool; cdecl; +zend_hash_str_exists:function(ht:PHashTable; str:Pchar; len:size_t):zend_bool; cdecl; +zend_hash_index_exists:function(ht:PHashTable; h:zend_ulong):zend_bool; cdecl; +zend_hash_has_more_elements_ex:function(ht,pos : longint) : longint; cdecl; +zend_hash_move_forward_ex:function(ht:PHashTable; pos:PHashPosition):longint; cdecl; +zend_hash_move_backwards_ex:function(ht:PHashTable; pos:PHashPosition):longint; cdecl; +zend_hash_get_current_key_ex:function(ht:PHashTable; str_index:PPzend_string; num_index:P_zend_ulong; pos:PHashPosition):longint; cdecl; +zend_hash_get_current_key_zval_ex:procedure(ht:PHashTable; key:Pzval; pos:PHashPosition); cdecl; +zend_hash_get_current_key_type_ex:function(ht:PHashTable; pos:PHashPosition):longint; cdecl; +zend_hash_get_current_data_ex:function(ht:PHashTable; pos:PHashPosition):Pzval; cdecl; +zend_hash_internal_pointer_reset_ex:procedure(ht:PHashTable; pos:PHashPosition); cdecl; +zend_hash_internal_pointer_end_ex:procedure(ht:PHashTable; pos:PHashPosition); cdecl; +zend_hash_copy:procedure(target:PHashTable; source:PHashTable; pCopyConstructor:copy_ctor_func_t; tmp: pointer; size: uint); cdecl; +_zend_hash_merge:procedure(target:PHashTable; source:PHashTable; pCopyConstructor:copy_ctor_func_t; size:uint; overwrite:zend_bool); cdecl; +zend_hash_merge_ex:procedure(target:PHashTable; source:PHashTable; pCopyConstructor:copy_ctor_func_t; pMergeSource:Tmerge_checker_func_t; pParam:Ppointer); cdecl; +zend_hash_bucket_swap:procedure(p:PBucket; q:PBucket); cdecl; +zend_hash_bucket_renum_swap:procedure(p:PBucket; q:PBucket); cdecl; +zend_hash_bucket_packed_swap:procedure(p:PBucket; q:PBucket); cdecl; +zend_hash_compare:function(ht1:PHashTable; ht2:PHashTable; compar:compare_func_t; ordered:zend_bool):longint; cdecl; +zend_hash_sort_ex:function(ht:PHashTable; sort_func:sort_func_t; compare_func:compare_func_t; renumber:zend_bool; TSRMLS_DC: pointer):longint; cdecl; +zend_hash_minmax:function(ht:PHashTable; compar:compare_func_t; flag:uint32_t):Pzval; cdecl; +zend_hash_rehash:function(ht:PHashTable):longint; cdecl; +zend_array_count:function(ht:PHashTable):uint32_t; cdecl; +zend_array_dup:function(source:PHashTable):PHashTable; cdecl; +zend_array_destroy:procedure(ht:PHashTable); cdecl; +zend_symtable_clean:procedure(ht:PHashTable); cdecl; +_zend_handle_numeric_str_ex:function(key:Pchar; length:size_t; idx:P_zend_ulong):longint; cdecl; +zend_hash_iterator_add:function(ht:PHashTable; pos:HashPosition):uint32_t; cdecl; +zend_hash_iterator_pos:function(idx:uint32_t; ht:PHashTable):HashPosition; cdecl; +zend_hash_iterator_pos_ex:function(idx:uint32_t; _array:Pzval):HashPosition; cdecl; +zend_hash_iterator_del:procedure(idx:uint32_t); cdecl; +zend_hash_iterators_lower_pos:function(ht:PHashTable; start:HashPosition):HashPosition; cdecl; +_zend_hash_iterators_update:procedure(ht:PHashTable; from:HashPosition; _to:HashPosition); cdecl; + +//tsrm_error:function(level:longint; format:zend_pchar; args:array of const):longint; cdecl; +//zend_mm_set_custom_handlers(heap:Pzend_mm_heap; _malloc:PEWKGERGJ945YG45; _free:procedure (_para1:pointer); var _realloc:procedure :procedure(_para1:pointer; _para2:size_t)); cdecl; +//zend_mm_get_custom_handlers(heap:Pzend_mm_heap; _malloc:PPOERGJOERJGIERGHRE; _free:Pprocedure (_para1:pointer); var _realloc:Pprocedure :procedure(_para1:pointer; _para2:size_t)); cdecl; +//zend_mm_set_custom_debug_handlers(heap:Pzend_mm_heap; var _malloc:procedure (_para1:size_t; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint); _free:procedure :procedure(_para1:pointer; __zend_filename:zend_pchar; __zend_lineno:uint; __zend_orig_filename:zend_pchar; __zend_orig_lineno:uint); _realloc:PERG4JG09E84GJ8945H45H); cdecl; +//zend_object_create_proxy:function(_object:Pzval; member:Pzval):P_zend_object; cdecl; +zend_check_internal_arg_type:procedure(zf:P_zend_function; arg_num:uint32_t; arg:Pzval); cdecl; +//zend_check_arg_type:function(zf:Pzend_function; arg_num:uint32_t; arg:Pzval; default_value:Pzval; cache_slot:Ppointer):longint; cdecl; +//zend_check_missing_arg:procedure(execute_data:Pzend_execute_data; arg_num:uint32_t; cache_slot:Ppointer); cdecl; + + +add_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +sub_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +mul_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +pow_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +div_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +mod_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +boolean_xor_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +boolean_not_function:function(result:Pzval; op1:Pzval):longint; cdecl; +bitwise_not_function:function(result:Pzval; op1:Pzval):longint; cdecl; +bitwise_or_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +bitwise_and_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +bitwise_xor_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +shift_left_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +shift_right_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +concat_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +zend_is_identical:function(op1:Pzval; op2:Pzval):longint; cdecl; +is_equal_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +is_identical_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +is_not_identical_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +is_not_equal_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +is_smaller_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +is_smaller_or_equal_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +instanceof_function_ex:function(instance_ce:Pzend_class_entry; ce:Pzend_class_entry; interfaces_only:zend_bool):zend_bool; cdecl; +instanceof_function:function(instance_ce:Pzend_class_entry; ce:Pzend_class_entry):zend_bool; cdecl; +_is_numeric_string_ex:function(str:Pchar; length:size_t; lval:Pzend_long; dval:Pdouble; allow_errors:longint; oflow_info:Plongint):zend_uchar; cdecl; +zend_memnstr_ex:function(haystack:Pchar; needle:Pchar; needle_len:size_t; _end:Pchar):Pchar; cdecl; +zend_memnrstr_ex:function(haystack:Pchar; needle:Pchar; needle_len:size_t; _end:Pchar):Pchar; cdecl; +zend_dval_to_lval_slow:function(d:double):zend_long; cdecl; +is_numeric_str_function:function(str:Pzend_string; lval:Pzend_long; dval:Pdouble):zend_uchar; cdecl; +increment_function:function(op1:Pzval):longint; cdecl; +decrement_function:function(op2:Pzval):longint; cdecl; +convert_scalar_to_number:procedure(op:Pzval); cdecl; +_convert_to_cstring:procedure(op:Pzval; __zend_filename:Pchar; __zend_lineno:uint); cdecl; +_convert_to_string:procedure(op:Pzval; __zend_filename:Pchar; __zend_lineno:uint); cdecl; +convert_to_long:procedure(op:Pzval); cdecl; +convert_to_double:procedure(op:Pzval); cdecl; +convert_to_long_base:procedure(op:Pzval; base:longint); cdecl; +convert_to_null:procedure(op:Pzval); cdecl; +convert_to_boolean:procedure(op:Pzval); cdecl; +convert_to_array:procedure(op:Pzval); cdecl; +convert_to_object:procedure(op:Pzval); cdecl; +multi_convert_to_long_ex:procedure(argc:longint; args:array of const); cdecl; +multi_convert_to_double_ex:procedure(argc:longint; args:array of const); cdecl; +multi_convert_to_string_ex:procedure(argc:longint; args:array of const); cdecl; +_zval_get_long_func:function(op:Pzval):zend_long; cdecl; +_zval_get_double_func:function(op:Pzval):double; cdecl; +_zval_get_string_func:function(op:Pzval):Pzend_string; cdecl; +zend_is_true:function(op:Pzval):longint; cdecl; +zend_object_is_true:function(op:Pzval):longint; cdecl; +compare_function:function(result:Pzval; op1:Pzval; op2:Pzval):longint; cdecl; +numeric_compare_function:function(op1:Pzval; op2:Pzval):longint; cdecl; +string_compare_function_ex:function(op1:Pzval; op2:Pzval; case_insensitive:zend_bool):longint; cdecl; +string_compare_function:function(op1:Pzval; op2:Pzval):longint; cdecl; +string_case_compare_function:function(op1:Pzval; op2:Pzval):longint; cdecl; +string_locale_compare_function:function(op1:Pzval; op2:Pzval):longint; cdecl; +zend_str_tolower:procedure(str:Pchar; length:size_t); cdecl; +zend_str_tolower_copy:function(dest:Pchar; source:Pchar; length:size_t):Pchar; cdecl; +zend_str_tolower_dup:function(source:Pchar; length:size_t):Pchar; cdecl; +zend_str_tolower_dup_ex:function(source:Pchar; length:size_t):Pchar; cdecl; +zend_string_tolower:function(str:Pzend_string):Pzend_string; cdecl; +zend_binary_zval_strcmp:function(s1:Pzval; s2:Pzval):longint; cdecl; +zend_binary_zval_strncmp:function(s1:Pzval; s2:Pzval; s3:Pzval):longint; cdecl; +zend_binary_zval_strcasecmp:function(s1:Pzval; s2:Pzval):longint; cdecl; +zend_binary_zval_strncasecmp:function(s1:Pzval; s2:Pzval; s3:Pzval):longint; cdecl; +zend_binary_strcmp:function(s1:Pchar; len1:size_t; s2:Pchar; len2:size_t):longint; cdecl; +zend_binary_strncmp:function(s1:Pchar; len1:size_t; s2:Pchar; len2:size_t; length:size_t):longint; cdecl; +zend_binary_strcasecmp:function(s1:Pchar; len1:size_t; s2:Pchar; len2:size_t):longint; cdecl; +zend_binary_strncasecmp:function(s1:Pchar; len1:size_t; s2:Pchar; len2:size_t; length:size_t):longint; cdecl; +zend_binary_strcasecmp_l:function(s1:Pchar; len1:size_t; s2:Pchar; len2:size_t):longint; cdecl; +zend_binary_strncasecmp_l:function(s1:Pchar; len1:size_t; s2:Pchar; len2:size_t; length:size_t):longint; cdecl; +zendi_smart_strcmp:function(s1:Pzend_string; s2:Pzend_string):zend_long; cdecl; +zend_compare_symbol_tables:function(ht1:PHashTable; ht2:PHashTable):longint; cdecl; +zend_compare_arrays:function(a1:Pzval; a2:Pzval):longint; cdecl; +zend_compare_objects:function(o1:Pzval; o2:Pzval):longint; cdecl; +zend_atoi:function(str:Pchar; str_len:longint):longint; cdecl; +zend_atol:function(str:Pchar; str_len:longint):zend_long; cdecl; +zend_locale_sprintf_double:procedure(op:Pzval; __zend_filename:Pchar; __zend_lineno:uint); cdecl; +zend_update_current_locale:procedure; cdecl; +zend_long_to_str:function(num:zend_long):Pzend_string; cdecl; + +ZvalGetPChar:function(z:pzval):zend_pchar; cdecl; +ZvalSetPChar:procedure(z:pzval; p:zend_pchar; l, b:integer); cdecl; + +read_property22:function(elem:pzval; name:zend_pchar; flags:Integer):pzval; cdecl; +isset_property:function(_object:pzval; property_name:zend_pchar):Integer; cdecl; + + + +lookup_class_ce:function(ce:pzend_class_entry; property_name:zend_pchar; property_length:SIZE_T):pzend_class_entry; cdecl; +class_exists:function(class_name:zend_pchar):Integer; cdecl; +class_exists2:function(class_name:zend_pchar):Integer; cdecl; +update_property_zval:function(_object:pzval; property_name:zend_pchar; value:pzval):integer; cdecl; +__create_php_object:function(classname:pzend_string; return_value:pzval; __params:pzval; argc:Integer):pzend_class_entry; cdecl; + + + +__call_function:procedure(func:pzval; argv:pzval; argc:integer);cdecl; +safe_emalloc2:function(nmemb:size_t; size:size_t; offset:size_t):Pointer;cdecl; + +ZvalEmalloc:function(nmemb:size_t):pzval;cdecl; + +pZVAL_NEW_REF:procedure(arg1, arg2:pointer);cdecl; + +NewPzval:function(z:pzval):pzval;cdecl; + +CreateCll:function(result:pzval; class_name:zend_pchar; Self:integer):pzval;cdecl; + +PHPInitSetValue:procedure(name, new_value:zend_pchar; modify_type, stage:integer);cdecl; + +implementation + + +end. diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index fb42abc..7df32d9 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -38,6 +38,7 @@ interface uses Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, PHPCommon, WinApi.WinSock, + {$IFDEF PHP7} hzend_types, {$ENDIF} ZendTypes, PHPTypes, PHPAPI, ZENDAPI, DelphiFunctions, phpFunctions, strUtils, varUtils, {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} @@ -863,10 +864,15 @@ procedure delphi_error_cb(_type : integer; const error_filename : zend_pchar; else error_type_str := 'Unknown error'; end; - - php_log_err(zend_pchar( + {$IFDEF P_CUT} + ShowMessage(zend_pchar( {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} - ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); + ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno]))); + {$ELSE} + php_log_err(zend_pchar( + {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} + ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); + {$ENDIF} end; end; if PHPLoaded then @@ -1197,7 +1203,7 @@ function TpsvCustomPHP.Execute(AFileName: zend_ustr): zend_ustr; procedure TpsvCustomPHP.PrepareResult; var - ht : PHashTable; + ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; data: ^ppzval; cnt : integer; variable : pzval; @@ -1338,7 +1344,7 @@ procedure TpsvCustomPHP.ShutdownRequest; procedure TpsvCustomPHP.PrepareVariables; var - ht : PHashTable; + ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; data: ^ppzval; cnt : integer; {$IFDEF PHP5} @@ -1366,7 +1372,11 @@ procedure TpsvCustomPHP.PrepareVariables; if zend_hash_find(ht, zend_pchar(FVariables[cnt].Name), strlen(zend_pchar(FVariables[cnt].Name)) + 1, data) = SUCCESS then begin + {$IFDEF PHP7} + if (data^^^.u1.v._type = IS_STRING) then + {$ELSE} if (data^^^._type = IS_STRING) then + {$ENDIF} begin efree(data^^^.value.str.val); ZVAL_STRING(data^^, zend_pchar(FVariables[cnt].Value), true); From 2c9ba90f2a4570ebbaa690be5f6b10bcc754562d Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Tue, 23 Jul 2019 17:34:59 +0300 Subject: [PATCH 27/54] First steps to php7 support --- Source/DelphiFunctions.pas | 2 +- Source/PHP.INC | 6 +- Source/PHPAPI.pas | 3 +- Source/PHPFunctions.pas | 3 +- Source/PHPTypes.pas | 2 +- Source/ZENDAPI.pas | 129 ++++++++++++++++++++++++++++--------- Source/hzend_types.pas | 75 ++++++++++++++++++--- Source/php4delphi.pas | 3 +- 8 files changed, 171 insertions(+), 52 deletions(-) diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index 03283df..e1fb504 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -692,7 +692,7 @@ procedure RegisterInternalClasses(p : pointer); begin {$IFDEF PHP7} - object_functions + ! {$ELSE} object_functions[0].fname := 'delphi_classname'; object_functions[0].handler := @delphi_object_classname; diff --git a/Source/PHP.INC b/Source/PHP.INC index 12e4bf3..6347b1e 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -62,9 +62,9 @@ backward compatibility between PHP versions. {$DEFINE ZEND_WIN32} {$DEFINE PHP_COMPILER_ID} {$ENDIF} -{..$DEFINE soulengine_build} -{..$DEFINE PHP7} -{..$DEFINE P_CUT} +{$DEFINE soulengine_build} +{.$DEFINE PHP7} +{.$DEFINE P_CUT} {$IFDEF PHP7} {$DEFINE COMPILER_VC14} {$DEFINE PHP560} diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index 1a05ab5..7d3a22e 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -29,8 +29,7 @@ interface Windows {$ENDIF}, - ZendTypes, - {$IFDEF PHP7} hzend_types,{$ENDIF} + {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} PHPTypes, zendAPI, diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index bf35afa..a913537 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -23,8 +23,7 @@ interface {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} {$IFDEF VERSION6} Variants, {$ENDIF} - {$IFDEF PHP7} hzend_types, {$ENDIF} - ZendTypes, PHPTypes, ZendAPI, PHPAPI ; + {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} PHPTypes, ZendAPI, PHPAPI ; type TParamType = (tpString, tpInteger, tpFloat, tpBoolean, tpArray, tpUnknown); diff --git a/Source/PHPTypes.pas b/Source/PHPTypes.pas index 6b80fd4..3d00f20 100644 --- a/Source/PHPTypes.pas +++ b/Source/PHPTypes.pas @@ -16,7 +16,7 @@ interface uses - {$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7}hzend_types,{$ENDIF} ZENDTypes; + {$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7} hzend_types {$ELSE} ZendTypes {$ENDIF}; {$IFDEF PHP4} const diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 3702676..3e61ec3 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -21,8 +21,7 @@ interface uses {$IFNDEF FPC} Windows{$ELSE} LCLType,LCLIntf,dynlibs,libc{$ENDIF}, SysUtils, - {$IFDEF PHP7} hzend_types, {$ENDIF} - ZendTypes, Variants, + {$IFDEF PHP7} hzend_types, {$ElSE} ZendTypes, {$ENDIF} Variants, PHPTypes; type TArrayVariant = array of variant; @@ -218,8 +217,9 @@ function zend_hash_add(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; a var zend_hash_graceful_destroy : procedure(ht: PHashTable); cdecl; + {$IFNDEF PHP7} zend_hash_graceful_reverse_destroy : zend_hash_graceful_reverse_destroy_t; - + {$ENDIF} zend_hash_apply : procedure(ht: PHashTable; apply_func: pointer; TSRMLS_DC: Pointer); cdecl; zend_hash_apply_with_argument : procedure(ht: PHashTable; @@ -332,8 +332,17 @@ procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE} zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): Integer; cdecl; - zend_register_auto_global : function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; - + zend_register_auto_global : + {$IFDEF PHP700} + function(name:Pzend_string; jit:zend_bool; auto_global_callback:Pointer):longint; cdecl; + {$ELSE} + {$IFDEF PHP5} + function(name: zend_pchar; name_len: uint; jit:boolean; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; + zend_activate_auto_globals: procedure(TSRMLS_C: Pointer); cdecl; + {$ELSE} + function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; + {$ENDIF} + {$ENDIF} procedure REGISTER_MAIN_LONG_CONSTANT(name: zend_pchar; lval: longint; flags: integer; TSRMLS_DC: Pointer); procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: zend_pchar; dval: double; flags: integer; TSRMLS_DC: Pointer); procedure REGISTER_MAIN_STRING_CONSTANT(name: zend_pchar; str: zend_pchar; flags: integer; TSRMLS_DC: Pointer); @@ -551,17 +560,32 @@ procedure convert_to_string(op: pzval); {$ELSE} zend_indent : procedure; cdecl; {$ENDIF} - ZendGetParameters : function: integer; cdecl; - zend_get_params_ex : function(param_count : Integer; Args : {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) :integer; cdecl varargs; + ZendGetParameters : + {$IFDEF PHP7} + function(ht:longint; param_count:longint):longint; cdecl varargs; + {$ELSE} + function: integer; cdecl; + {$ENDIF} + zend_get_params_ex : + {$IFDEF PHP7} + function(param_count:longint):longint; cdecl varargs; + {$ELSE} + function(param_count : Integer; Args : ppzval) :integer; cdecl varargs; + {$ENDIF} + {$IFDEF PHP7} + ZvalGetArgs: function(Count: Integer; Args: ppzval): Integer;cdecl varargs; + _zend_get_parameters_array_ex:function(param_count:longint; argument_array:Pzval):longint; cdecl; + {$ELSE} + _zend_get_parameters_array_ex : function(param_count: integer; argument_array: + pppzval; TSRMLS_CC: pointer): integer; cdecl; + {$ENDIF} function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; - +{$IFNDEF PHP7} function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; +{$ENDIF} -var - _zend_get_parameters_array_ex : function(param_count: integer; argument_array: - pppzval; TSRMLS_CC: pointer): integer; cdecl; procedure dispose_pzval_array(Params: pzval_array); @@ -869,10 +893,10 @@ function Z_STRVAL(z : Pzval) : zend_ustr; function Z_STRUVAL(z : PZval): UTF8String; function Z_STRWVAL(z : pzval) : String; function Z_STRLEN(z : Pzval) : longint; -function Z_ARRVAL(z : Pzval ) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; -function Z_OBJ_HANDLE(z :Pzval) : zend_object_handle; -function Z_OBJ_HT(z : Pzval) : {$IFDEF PHP7}hzend_types.P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF}; -function Z_OBJPROP(z : Pzval) : {$IFDEF PHP7}hzend_types.PHashTable{$ELSE}PHashTable{$ENDIF}; +function Z_ARRVAL(z : Pzval ) : PHashTable; +function Z_OBJ_HANDLE(z :Pzval) : {$IFDEF PHP7} P_zend_object_handlers {$ELSE} zend_object_handle{$ENDIF}; +function Z_OBJ_HT(z : Pzval) : {$IFDEF PHP7}P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF}; +function Z_OBJPROP(z : Pzval) : PHashTable; function Z_VARREC(z: pzval): TVarRec; procedure zend_addref_p(z: pzval); cdecl; @@ -1306,7 +1330,7 @@ function ZValArrayKeyDel(v: pzval; key: zend_ustr): Boolean; overload; {$IFDEF PHP7} begin pzs^.len := strlen(zend_pchar(key)); - pzs^.val := zend_pchar(key); + pzs^.val := estrdup(zend_pchar(key)); Result := zend_hash_del_key_or_index(v.value.arr, pzs) = SUCCESS end; {$ELSE} @@ -1326,7 +1350,7 @@ function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; {$IFDEF PHP7} begin pzs^.len := strlen(zend_pchar(inttostr(idx))); - pzs^.val := zend_pchar(inttostr(idx)); + pzs^.val := estrdup(zend_pchar(inttostr(idx))); Result := zend_hash_del_key_or_index(v.value.arr, pzs) = SUCCESS end; {$ELSE} @@ -2458,6 +2482,9 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; zend_register_constant := GetProcAddress(PHPLib, 'zend_register_constant'); zend_register_auto_global := GetProcAddress(PHPLib, 'zend_register_auto_global'); + {$IFDEF PHP5} + zend_activate_auto_globals := GetProcAddress(PHPLib, 'zend_activate_auto_globals'); + {$ENDIF} // -- tsrm_shutdown tsrm_shutdown := GetProcAddress(PHPLib, 'tsrm_shutdown'); @@ -2725,6 +2752,8 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$IFDEF PHP7} // -- zend_parse_parameters_throw zend_parse_parameters_throw := GetProcAddress(PHPLib, 'zend_parse_parameters_throw'); + ZvalGetArgs := GetProcAddress(PHPLib, 'zend_get_parameters_ex'); + _zend_get_parameters_array_ex := GetProcAddress(PHPLib, '_zend_get_parameters_array_ex'); {$ELSE} // -- zend_indent zend_indent := GetProcAddress(PHPLib, 'zend_indent'); @@ -3026,34 +3055,64 @@ function zend_get_parameters_ex(number: integer; var Params: pzval_array): integ var i : integer; begin - SetLength(Params, number); + if number = 0 then begin Result := SUCCESS; Exit; end; + {$IFDEF PHP7} + Params.value.arr.nNumOfElements := number; + for i := 0 to number - 1 do + zend_hash_index_add_empty_element(Params.value.arr, i); + Result := ZvalGetArgs(number, @Params); + {$ELSE} + SetLength(Params, number); for i := 0 to number - 1 do New(Params[i]); - Result := zend_get_parameters(number, number, Params); + {$ENDIF} end; function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; var i : integer; - p: pppzval; + + p: + {$IFDEF PHP7} + pzval + {$ELSE} + pppzval + {$ENDIF}; begin - SetLength(Params, number); if number = 0 then begin Result := SUCCESS; Exit; end; + {$IFDEF PHP7} + Params.value.arr.nNumOfElements := number; + for i := 0 to number - 1 do + zend_hash_index_add_empty_element(Params.value.arr, i); + + p := emalloc(number * sizeOf(zval)); + Result := _zend_get_parameters_array_ex(number, p); + + for i := 0 to number - 1 do + begin + _zend_hash_update_ind(Params.value.arr, i, p, '', 0); + if i <> number then + inc(integer(p), sizeof(zval)); + end; + + efree(p); + _zend_get_parameters_array_ex(number, p); + {$ELSE} + SetLength(Params, number); for i := 0 to number - 1 do New(Params[i]); - {$IFNDEF PHP700} + p := emalloc(number * sizeOf(ppzval)); - {$ENDIF} Result := _zend_get_parameters_array_ex(number, p, TSRMLS_DC); for i := 0 to number - 1 do @@ -3064,8 +3123,9 @@ function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS end; efree(p); + {$ENDIF} end; - +{$IFNDEF PHP7} function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; assembler; register; asm push esi @@ -3092,15 +3152,20 @@ function zend_get_parameters(ht: integer; param_count: integer; Params: array of loop @toploop2 pop esi end; - +{$ENDIF} procedure dispose_pzval_array(Params: pzval_array); var i : integer; begin + {$IFDEF PHP7} + if Params.value.arr.nNumOfElements>0 then + for i := 0 to Params.value.arr.nNumOfElements-1 do + Freemem(zend_hash_index_findZval(Params,i)); + {$ELSE} if Length(Params)>0 then - for i := 0 to High(Params) do FreeMem(Params[i]); + {$ENDIF} Params := nil; end; @@ -3302,6 +3367,8 @@ procedure CheckZendErrors; if @zend_html_puts = nil then raise EPHP4DelphiException.Create('zend_html_puts'); {$IFDEF PHP7} if @zend_parse_parameters_throw = nil then EPHP4DelphiException.Create('zend_parse_parameters_throw'); + if @ZvalGetArgs = nil then EPHP4DelphiException.Create('ZvalGetArgs'); + if @_zend_get_parameters_array_ex = nil then EPHP4DelphiException.Create('_zend_get_parameters_array_ex'); {$ELSE} if @zend_indent = nil then raise EPHP4DelphiException.Create('zend_indent'); {$ENDIF} @@ -3418,7 +3485,7 @@ function zend_unregister_functions(functions : {$IFDEF PHP7}P_zend_function_entr break; {$IFDEF PHP7} pzs^.len := strlen(ptr.fname); - pzs^.val := ptr.fname; + pzs^.val := estrdup(ptr.fname); zend_hash_del_key_or_index(function_table, pzs); {$ELSE} zend_hash_del_key_or_index(function_table, ptr.fname, strlen(ptr.fname) +1, 0, HASH_DEL_KEY); @@ -3614,7 +3681,7 @@ function Z_BVAL(z : pzval) : boolean; end; if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_BOOL then - Result := zend_bool(z.value.lval) + Result := boolean(zend_bool(z.value.lval)) else case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of IS_DOUBLE: if Trunc(z.value.dval) = 0 then Result := false else Result := true; @@ -3766,9 +3833,9 @@ function Z_ARRVAL(z : pzval ) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF Result := {$IFDEF PHP7} z.value.arr {$ELSE}z.value.ht{$ENDIF}; end; -function Z_OBJ_HANDLE(z :pzval) : zend_object_handle; +function Z_OBJ_HANDLE(z :pzval) : {$IFDEF PHP7} P_zend_object_handlers {$ELSE} zend_object_handle{$ENDIF}; begin - Result := z.value.obj.handle; + Result := {$IFDEF PHP7}z.value.obj.handlers{$ELSE}z.value.obj.handle{$ENDIF}; end; function Z_OBJ_HT(z : pzval) : {$IFDEF PHP7}hzend_types.P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF}; @@ -3824,7 +3891,7 @@ function zend_hash_add_or_update(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{ begin {$IFDEF PHP7} pz^.len := strlen(arKey); - pz^.val := arKey; + pz^.val := estrdup(arKey); if Assigned(_zend_hash_add_or_update) then Result := _zend_hash_add_or_update(ht, pz, pData, flag, '', 0).u2.fe_iter_idx {$ELSE} diff --git a/Source/hzend_types.pas b/Source/hzend_types.pas index b24c349..e079681 100644 --- a/Source/hzend_types.pas +++ b/Source/hzend_types.pas @@ -132,7 +132,28 @@ interface SAPI_DEFAULT_CHARSET = PHP_DEFAULT_CHARSET; SAPI_PHP_VERSION_HEADER = 'X-Powered-By: PHP/" PHP_VERSION'; - + //zend_constants.h +const + CONST_CS = (1 shl 0) { Case Sensitive } + ; + CONST_PERSISTENT = (1 shl 1) { Persistent } + ; +const + ZEND_INTERNAL_FUNCTION = 1; + ZEND_USER_FUNCTION = 2; + ZEND_OVERLOADED_FUNCTION = 3; + ZEND_EVAL_CODE = 4; + ZEND_INTERNAL_CLASS = 1; + ZEND_USER_CLASS = 2; + ZEND_EVAL = (1 shl 0); + ZEND_INCLUDE = (1 shl 1); + ZEND_INCLUDE_ONCE = (1 shl 2); + ZEND_REQUIRE = (1 shl 3); + ZEND_REQUIRE_ONCE = (1 shl 4); + ZEND_ISSET = (1 shl 0); + ZEND_ISEMPTY = (1 shl 1); + ZEND_CT = (1 shl 0); + ZEND_RT = (1 shl 1); type pppointer = ^ppointer; @@ -378,7 +399,7 @@ interface PBucket = ^Bucket; Pzend_refcounted_h = ^zend_refcounted_h; Pzend_auto_global = ^zend_auto_global; - Pzend_internal_function = ^zend_internal_function; + Pzend_internal_function = ^tzend_internal_function; P_zend_internal_function = ^_zend_internal_function; P_zend_call_kind = ^_zend_call_kind; P_zend_auto_global = ^_zend_auto_global; @@ -592,8 +613,40 @@ _zend_fcall_info_cache = record end; end; zval = _zval_struct; - - + PZendConstant = ^TZendConstant; + zend_constant = record + value: zval; + flags: Integer; + name: zend_pchar; + name_len: uint; + module_number: Integer; + end; + TZendConstant = zend_constant; + Pzend_syntax_highlighter_ini = ^Tzend_syntax_highlighter_ini; + zend_syntax_highlighter_ini = + record + highlight_html : zend_pchar; + highlight_comment : zend_pchar; + highlight_default : zend_pchar; + highlight_string : zend_pchar; + highlight_keyword : zend_pchar; + end; + PStat = ^TStat; + TStat = record + st_dev: Word; + st_ino: Word; + st_mode: Word; + st_nlink: SmallInt; + st_uid: SmallInt; + st_gid: SmallInt; + st_rdev: Word; + st_size: Longint; + st_atime: Longint; + st_mtime: Longint; + st_ctime: Longint; + end; + Stat = TStat; + Tzend_syntax_highlighter_ini = zend_syntax_highlighter_ini; compare_func_t = function (_para1:pointer; _para2:pointer):longint;cdecl; swap_func_t = procedure (_para1:pointer; _para2:pointer);cdecl; @@ -706,7 +759,7 @@ _zend_array = record end; HashTable = _zend_array ; zend_array = _zend_array; - + pzval_array = pzval; _zend_ast = record kind : zend_ast_kind; attr : zend_ast_attr; @@ -949,6 +1002,7 @@ _zend_stream = record end; zend_stream = _zend_stream; + PZendFileHandle = ^_zend_file_handle; _zend_file_handle = record handle : record case longint of @@ -991,7 +1045,7 @@ _zend_utility_values = record zend_utility_values = _zend_utility_values; zend_write_func_t = function (str:zend_pchar; str_length:size_t):longint;cdecl; - + zend_write_t = zend_write_func_t; zend_error_handling_t = (EH_NORMAL = 0,EH_SUPPRESS,EH_THROW); @@ -1216,7 +1270,7 @@ _zend_internal_function = record module : P_zend_module_entry; reserved : array[0..3] of pointer; end; - zend_internal_function = _zend_internal_function; + tzend_internal_function = _zend_internal_function; @@ -1236,7 +1290,7 @@ _zend_function = record arg_info : Pzend_arg_info; end ); 2 : ( op_array : zend_op_array ); - 3 : ( internal_function : zend_internal_function ); + 3 : ( internal_function : tzend_internal_function ); end; zend_function = _zend_function; @@ -1884,6 +1938,7 @@ _zend_arena = record prev : P_zend_arena; end; zend_arena = _zend_arena; + Pzend_compiler_globals = ^_zend_compiler_globals; _zend_compiler_globals = record loop_var_stack : zend_stack; active_class_entry : P_zend_class_entry; @@ -1933,7 +1988,7 @@ _zend_objects_store = record end; zend_objects_store = _zend_objects_store; - + Pzend_executor_globals = ^_zend_executor_globals; _zend_executor_globals = record uninitialized_zval : zval; error_zval : zval; @@ -2826,7 +2881,7 @@ Tsmart_str = record zend_hash_extend:procedure(ht:PHashTable; nSize:uint32_t; _packed:zend_bool); cdecl; _zend_hash_add_or_update:function(ht:PHashTable; key:Pzend_string; pData:Pzval; flag:uint32_t; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; _zend_hash_update:function(ht:PHashTable; key:Pzend_string; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; -_zend_hash_update_ind:function(ht:PHashTable; key:Pzend_string; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; +_zend_hash_update_ind:function(ht:PHashTable; key:Cardinal; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; _zend_hash_add:function(ht:PHashTable; key:Pzend_string; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; _zend_hash_add_new:function(ht:PHashTable; key:Pzend_string; pData:Pzval; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; _zend_hash_str_add_or_update:function(ht:PHashTable; key:Pchar; len:size_t; pData:Pzval; flag:uint32_t; __zend_filename:Pchar; __zend_lineno:uint):Pzval; cdecl; diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 7df32d9..248b55f 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -38,8 +38,7 @@ interface uses Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, PHPCommon, WinApi.WinSock, - {$IFDEF PHP7} hzend_types, {$ENDIF} - ZendTypes, PHPTypes, PHPAPI, ZENDAPI, + {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} PHPTypes, PHPAPI, ZENDAPI, DelphiFunctions, phpFunctions, strUtils, varUtils, {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} {$IFDEF soulengine_build} VCL.Dialogs, {$ENDIF} From 4c7cc09c82c7dd27d0ef3f9affa9814182daef43 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Fri, 26 Jul 2019 19:37:25 +0300 Subject: [PATCH 28/54] Update ZENDAPI.pas --- Source/ZENDAPI.pas | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 3e61ec3..7b6f3b6 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -251,8 +251,9 @@ function zend_hash_add(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; a zend_hash_find : function(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; arKey: zend_pchar; nKeyLength: uint; pData: Pointer): Integer; cdecl; - zend_hash_quick_find : function(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; arKey: zend_pchar; - nKeyLength: uint; h: ulong; pData: Pointer): Integer; cdecl; + zend_hash_quick_find : + function(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; arKey: zend_pchar; + nKeyLength: uint; h: ulong; out pData: ppzval): Integer; cdecl; zend_hash_index_find : function(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; h: ulong; pData: Pointer): Integer; cdecl; @@ -570,7 +571,7 @@ procedure convert_to_string(op: pzval); {$IFDEF PHP7} function(param_count:longint):longint; cdecl varargs; {$ELSE} - function(param_count : Integer; Args : ppzval) :integer; cdecl varargs; + function(param_count : Integer; Args : ppzval): integer; cdecl varargs; {$ENDIF} {$IFDEF PHP7} ZvalGetArgs: function(Count: Integer; Args: ppzval): Integer;cdecl varargs; @@ -1152,7 +1153,7 @@ procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); {$ELSE} z^._type {$ENDIF} := _type; - z.value.lval := v; + z^.value.lval := v; End; procedure ZvalVAL(z:pzval); @@ -2946,7 +2947,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; ZendGetParameters := GetProcAddress(PHPLib, 'zend_get_parameters'); // - zend_get_parameters_ex (native call) - zend_get_params_ex := GetProcAddress(PHPLib, 'zend_get_params_ex'); + zend_get_params_ex := GetProcAddress(PHPLib, 'zend_get_parameters_ex'); {$IFDEF PHP5} zend_destroy_file_handle := GetProcAddress(PHPLib, 'zend_destroy_file_handle'); {$ENDIF} From 618d3b60fdf817552c196b721269f29dc513538e Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Sat, 27 Jul 2019 02:25:45 +0300 Subject: [PATCH 29/54] Added custom embedded extensions support --- Source/PHPAPI.pas | 8 ++++---- Source/ZENDAPI.pas | 33 ++++++++++++++++++++++++++++++++- Source/ZendTypes.pas | 1 + Source/php4delphi.pas | 41 +++++++++++++++++++++++++++++++++++++---- 4 files changed, 74 insertions(+), 9 deletions(-) diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index 7d3a22e..f53ccc7 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -218,8 +218,8 @@ procedure variant2zval(value : variant; var z : pzval); php_raw_url_encode: function (s : zend_pchar; len : Integer; new_length : PInteger) : zend_pchar; cdecl; -{$IFDEF PHP510} -php_register_extensions: function (ptr : pointer; count: integer; TSRMLS_DC: pointer) : integer; cdecl; +{$IFDEF PHP5} +php_register_extensions: function (ptr : PPzend_module_entry; count: integer; TSRMLS_DC: pointer) : integer; cdecl; {$ELSE} php_startup_extensions: function (ptr: pointer; count : integer) : integer; cdecl; {$ENDIF} @@ -802,7 +802,7 @@ function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; php_raw_url_encode := GetProcAddress(PHPLib, 'php_raw_url_encode'); - {$IFDEF PHP510} + {$IFDEF PHP5} php_register_extensions := GetProcAddress(PHPLib, 'php_register_extensions'); {$ELSE} php_startup_extensions := GetProcAddress(PHPLib, 'php_startup_extensions'); @@ -866,7 +866,7 @@ procedure CheckPHPErrors; if @php_url_encode = nil then raise EPHP4DelphiException.Create('php_url_encode'); if @php_raw_url_encode = nil then raise EPHP4DelphiException.Create('php_raw_url_encode'); - {$IFDEF PHP510} + {$IFDEF PHP5} if @php_register_extensions = nil then raise EPHP4DelphiException.Create('php_register_extensions'); {$ELSE} if @php_startup_extensions = nil then raise EPHP4DelphiException.Create('php_startup_extensions'); diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 7b6f3b6..e7c4b51 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -729,6 +729,12 @@ procedure ZEND_PUTS(str: zend_pchar); var zend_register_internal_class : function(class_entry: pzend_class_entry; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; zend_register_internal_class_ex : function(class_entry: pzend_class_entry; parent_ce: pzend_class_entry; parent_name: zend_pchar; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; + zend_startup_module : function(module_entry: Pzend_module_entry):integer; cdecl; + zend_startup_module_ex : function(module_entry: Pzend_module_entry; TSRMLS_DC: pointer):integer; cdecl; + zend_register_module_ex : function(module_entry: Pzend_module_entry; TSRMLS_DC: pointer): Pzend_module_entry;cdecl; + zend_register_internal_module : function(module_entry: Pzend_module_entry; TSRMLS_DC: pointer): Pzend_module_entry;cdecl; + zend_startup_modules : function(TSRMLS_DC:pointer):integer; + zend_collect_module_handlers : function(TSRMLS_DC:pointer):integer; function ZvalInt(z:zval):Integer; function ZvalDouble(z:zval):Double; function ZvalBool(z:zval):Boolean; @@ -2922,12 +2928,30 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; // -- _object_and_properties_init _object_and_properties_init := GetProcAddress(PHPLib, '_object_and_properties_init'); - // -- zend_register_internal_class + // -- zend_register_internal_class zend_register_internal_class := GetProcAddress(PHPLib, 'zend_register_internal_class'); // -- zend_register_internal_class_ex zend_register_internal_class_ex := GetProcAddress(PHPLib, 'zend_register_internal_class_ex'); + // -- zend_startup_module + zend_startup_module := GetProcAddress(PHPLib, 'zend_startup_module'); + + // -- zend_startup_module_ex + zend_startup_module_ex := GetProcAddress(PHPLib, 'zend_startup_module_ex'); + + // -- zend_register_module_ex + zend_register_module_ex := GetProcAddress(PHPLib, 'zend_register_module_ex'); + + // -- zend_register_internal_module + zend_register_internal_module := GetProcAddress(PHPLib, 'zend_register_internal_module'); + + // -- zend_startup_modules + zend_startup_modules := GetProcAddress(PHPLib, 'zend_startup_modules'); + + // -- zend_collect_module_handlers + zend_collect_module_handlers := GetProcAddress(PHPLib, 'zend_collect_module_handlers'); + // -- get_zend_version get_zend_version := GetProcAddress(PHPLib, 'get_zend_version'); @@ -3431,6 +3455,13 @@ procedure CheckZendErrors; if @_object_and_properties_init = nil then raise EPHP4DelphiException.Create('_object_and_properties_init'); if @zend_register_internal_class = nil then raise EPHP4DelphiException.Create('zend_register_internal_class'); if @zend_register_internal_class_ex = nil then raise EPHP4DelphiException.Create('zend_register_internal_class_ex'); + if @zend_startup_module = nil then raise EPHP4DelphiException.Create('zend_startup_module'); + if @zend_startup_module_ex = nil then raise EPHP4DelphiException.Create('zend_startup_module_ex'); + if @zend_register_module_ex = nil then raise EPHP4DelphiException.Create('zend_register_module_ex'); + if @zend_register_internal_module = nil then raise EPHP4DelphiException.Create('zend_register_internal_module'); + if @zend_startup_modules = nil then raise EPHP4DelphiException.Create('zend_startup_modules'); + if @zend_collect_module_handlers = nil then raise EPHP4DelphiException.Create('zend_collect_module_handlers'); + if @get_zend_version = nil then raise EPHP4DelphiException.Create('get_zend_version'); if @zend_make_printable_zval = nil then raise EPHP4DelphiException.Create('zend_make_printable_zval'); if @zend_print_zval = nil then raise EPHP4DelphiException.Create('zend_print_zval'); diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index 627b682..b48329a 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -1204,6 +1204,7 @@ _zend_function_entry = record end; {$ENDIF} Pzend_module_entry = ^Tzend_module_entry; + PPzend_module_entry = ^Pzend_module_entry; p_zend_module_entry = ^_zend_module_entry; _zend_module_entry = record size : word; diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 248b55f..8979854 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -194,11 +194,12 @@ TCustomPHPLibrary = class(TPHPComponent) property Locked : boolean read FLocked write FLocked; end; { TPHPEngine } - + TPHPEngineInitEvent = procedure(Sender:TObject;TSRMLS_DC:Pointer) of object; TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) private FINIPath : AnsiString; FOnEngineStartup : TNotifyEvent; + FAddMods : TArray; FOnEngineShutdown : TNotifyEvent; FEngineActive : boolean; FHandleErrors : boolean; @@ -245,6 +246,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) constructor Create(AOwner : TComponent); override; destructor Destroy; override; procedure AddFunction(FN: zend_ustr; Func: Pointer); + procedure AddModule(Module_entry: Pzend_module_entry); procedure StartupEngine; virtual; procedure ShutdownEngine; virtual; procedure LockEngine; virtual; @@ -1285,7 +1287,6 @@ procedure TpsvCustomPHP.StartupRequest; FOnReadPost(Self, FPostStream); zend_alter_ini_entry('max_execution_time', 19, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_RUNTIME); - php_request_startup(TSRMLS_D); if Assigned(FOnRequestStartup) then FOnRequestStartup(Self); @@ -1340,7 +1341,6 @@ procedure TpsvCustomPHP.ShutdownRequest; end; - procedure TpsvCustomPHP.PrepareVariables; var ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; @@ -1904,6 +1904,7 @@ procedure TPHPEngine.RefreshLibrary; procedure TPHPEngine.StartupEngine; var i : integer; + x: Pzend_module_entry; begin if PHPEngine <> Self then begin @@ -1943,8 +1944,14 @@ procedure TPHPEngine.StartupEngine; php_module_startup(@delphi_sapi_module, @FLibraryModule, 1); - TSRMLS_D := ts_resource_ex(0, nil); + if Length(FAddMods) > 0 then + for x in FAddMods do + begin + zend_register_module_ex(x, TSRMLS_D); + zend_startup_module_ex(x, TSRMLS_D); + end; + PrepareIniEntry; RegisterConstants; @@ -2059,8 +2066,18 @@ procedure TPHPEngine.UnlockLibraries; end; procedure TPHPEngine.RemoveRequest; +var + x: Pzend_module_entry; + xp: function(_type : integer; module_number : integer; TSRMLS_DC : pointer):integer;cdecl; begin InterlockedDecrement(FRequestCount); + if Length(FAddMods) > 0 then + for x in FAddMods do + begin + xp := x^.request_shutdown_func; + if(Assigned(xp)) then + xp(x^._type, x^.module_number, TSRMLS_D); + end; end; procedure TPHPEngine.AddFunction(FN: zend_ustr; Func: Pointer); @@ -2069,9 +2086,25 @@ procedure TPHPEngine.AddFunction(FN: zend_ustr; Func: Pointer); MyFuncs.AddObject(FN, TObject(Func)); end; +procedure TPHPEngine.AddModule(Module_entry: Pzend_module_entry); +begin + SetLength(FAddMods, Length(FAddMods)+1); + FAddMods[High(FAddMods)] := Module_entry; +end; + procedure TPHPEngine.AddRequest; +var + x: Pzend_module_entry; + xp: function(_type : integer; module_number : integer; TSRMLS_DC : pointer):integer;cdecl; begin InterlockedIncrement(FRequestCount); + if Length(FAddMods) > 0 then + for x in FAddMods do + begin + xp := x^.request_startup_func; + if(Assigned(xp)) then + xp(x^._type, x^.module_number, TSRMLS_D); + end; end; initialization From b85018e7031c60864475a7f9fc5f40f7df5a0413 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Sun, 4 Aug 2019 19:50:41 +0300 Subject: [PATCH 30/54] Update ZENDAPI.pas --- Source/ZENDAPI.pas | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index e7c4b51..9e2aeca 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -876,7 +876,7 @@ procedure CheckZendErrors; zend_ini_deactivate : function(TSRMLS_D : pointer) : integer; cdecl; function GetGlobalResource(resource_name: AnsiString) : pointer; - +function GetGlobalResourceDC(resource_name: AnsiString;TSRMLS_DC:pointer) : pointer; function GetCompilerGlobals : Pzend_compiler_globals; function GetExecutorGlobals : pzend_executor_globals; function GetAllocGlobals : pointer; @@ -1595,10 +1595,13 @@ function ZendToVariant(const Value: pppzval): Variant; overload; S: String; begin case {$IFDEF PHP7} Value^^^.u1.v._type {$ELSE}Value^^^._type{$ENDIF} of + 0: Result := Null; 1: Result := Value^^^.value.lval; 2: Result := Value^^^.value.dval; - 6: begin S := Value^^^.value.str.val; Result := S; end; - 4,5: Result := Null; + 3: Result := boolean(Value^^^.value.lval); + 8: begin S := Value^^^.value.str.val; Result := S; end; + 6: begin S := Value^^^.value.str.val; Result := S; end + else Result := Null; end; end; @@ -3631,6 +3634,31 @@ function GetGlobalResource(resource_name: AnsiString) : pointer; end; end; +function GetGlobalResourceDC(resource_name: AnsiString;TSRMLS_DC:pointer) : pointer; +var + global_id : pointer; + global_value : integer; + global_ptr : pointer; +begin + Result := nil; + try + global_id := GetProcAddress(PHPLib, zend_pchar(resource_name)); + if Assigned(global_id) then + begin + global_value := integer(global_id^); + asm + mov ecx, global_value + mov edx, dword ptr TSRMLS_DC + mov eax, dword ptr [edx] + mov ecx, dword ptr [eax+ecx*4-4] + mov global_ptr, ecx + end; + Result := global_ptr; + end; + except + Result := nil; + end; +end; function GetCompilerGlobals : Pzend_compiler_globals; begin From fcd7e70f83ae5fbc5c83f10817ca5a9f4683e6da Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Sun, 4 Aug 2019 23:53:01 +0300 Subject: [PATCH 31/54] zval routines --- Source/DelphiFunctions.pas | 4 +- Source/PHPAPI.pas | 77 ---------- Source/PHPFunctions.pas | 20 +-- Source/ZENDAPI.pas | 293 +++++++++++++++++++++++++------------ Source/php4delphi.pas | 6 +- 5 files changed, 217 insertions(+), 183 deletions(-) diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index e1fb504..78a0a2a 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -198,7 +198,7 @@ procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; {$ENDIF} begin - ZVAL_DOUBLE(return_value, Date); + ZVALVAL(return_value, Date); end; //proto string delphi_extract_file_dir(string source) @@ -658,7 +658,7 @@ procedure delphi_is_uc(ht : integer; return_value : pzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); {$ENDIF} begin - {$IFDEF PHP_UNICE}ZVAL_TRUE{$ELSE}ZVAL_FALSE{$ENDIF}(return_value); + ZVALVAL(return_value, {$IFDEF PHP_UNICE}TRUE{$ELSE}FALSE{$ENDIF}); end; {$IFDEF PHP510} diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index f53ccc7..1f0cf58 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -199,11 +199,6 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; php_ini_double: function(name : zend_pchar; name_length : uint; orig : Integer) : Double; cdecl; php_ini_string: function(name : zend_pchar; name_length : uint; orig : Integer) : zend_pchar; cdecl; - -function zval2variant(value : zval) : variant; -procedure variant2zval(value : variant; var z : pzval); - - var php_url_free: procedure (theurl : pphp_url); cdecl; @@ -426,19 +421,6 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; end; end; -function zval2variant(value : zval) : variant; -begin - case {$IFDEF PHP7}Value.u1.v._type{$ELSE}Value._type{$ENDIF} of - IS_NULL : Result := NULL; - IS_LONG : Result := Value.value.lval; - IS_DOUBLE : Result := Value.value.dval; - IS_STRING : Result := zend_ustr(Value.Value.str.val); - IS_BOOL : Result := Boolean(Value.Value.lval); - else - Result := NULL; - end; -end; - function GetStringOf(const V: TVarData): string; begin case V.VType of @@ -485,65 +467,6 @@ function GetStringOf(const V: TVarData): string; end; end; - -procedure variant2zval(value : variant;var z : pzval); -var - W : WideString; - S: String; -begin - if VarIsEmpty(value) then - begin - ZVAL_NULL(z); - Exit; - end; - // MessageBoxA(0, zend_pchar(zend_ustr( TVarData(Value).VType.ToString)), '', 0 ) ; - case TVarData(Value).VType of - varString : //Peter Enz - begin - if Assigned ( TVarData(Value).VString ) then - begin - ZVAL_STRING(z, TVarData(Value).VString , true); - end - else - begin - ZVAL_STRING(z, '', true); - end; - end; - - varUString : //Peter Enz - begin - S := string(TVarData(Value).VUString); - - ZVAL_STRING(z, zend_pchar(zend_ustr(S)), true); - end; - - varOleStr : //Peter Enz - begin - if Assigned ( TVarData(Value).VOleStr ) then - begin - W := WideString(Pointer(TVarData(Value).VOleStr)); - ZVAL_STRINGW(z, PWideChar(W), true); - end - else - begin - ZVAL_STRING(z, '', true); - end; - end; - varSmallInt : ZVAL_LONG(z, Integer(TVarData(Value).VSmallint)); - varInteger : ZVAL_LONG(z, TVarData(Value).VInteger); - varBoolean : ZVAL_BOOL(z, TVarData(Value).VBoolean); - varSingle : ZVAL_DOUBLE(z, TVarData(Value).VSingle); - varDouble : ZVAL_DOUBLE(z, TVarData(Value).VDouble); - varError : ZVAL_LONG(z, Integer(TVarData(Value).VError)); - varByte : ZVAL_LONG(z, Integer(TVarData(Value).VByte)); - varDate : ZVAL_DOUBLE(z, TVarData(Value).VDate); - //varArray : ZVAL_ARRAY(z, Value); - else - ZVAL_NULL(Z); - end; -end; - - function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; var core_globals_value : integer; diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index a913537..48b47de 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -657,7 +657,7 @@ function TZendVariable.GetAsVariant: variant; Exit; end; - result := zval2variant(FValue^); + result := ZendToVariant(FValue); end; function TZendVariable.GetDataType: integer; @@ -709,7 +709,7 @@ procedure TZendVariable.SetAsBoolean(const Value: boolean); begin Exit; end; - ZVAL_BOOL(FValue, Value); + ZVALVAL(FValue, Value); end; procedure TZendVariable.SetAsDate(const Value: TDateTime); @@ -718,7 +718,7 @@ procedure TZendVariable.SetAsDate(const Value: TDateTime); begin Exit; end; - ZVAL_DOUBLE(FValue, Value); + ZVALVAL(FValue, Value); end; procedure TZendVariable.SetAsDateTime(const Value: TDateTime); @@ -727,7 +727,7 @@ procedure TZendVariable.SetAsDateTime(const Value: TDateTime); begin Exit; end; - ZVAL_DOUBLE(FValue, Value); + ZVALVAL(FValue, Value); end; procedure TZendVariable.SetAsFloat(const Value: double); @@ -736,7 +736,7 @@ procedure TZendVariable.SetAsFloat(const Value: double); begin Exit; end; - ZVAL_DOUBLE(FValue, Value); + ZVALVAL(FValue, Value); end; procedure TZendVariable.SetAsInteger(const Value: integer); @@ -745,7 +745,7 @@ procedure TZendVariable.SetAsInteger(const Value: integer); begin Exit; end; - ZVAL_LONG(FValue, Value); + ZVALVAL(FValue, Value); end; procedure TZendVariable.SetAsString(const Value: zend_ustr); @@ -754,7 +754,7 @@ procedure TZendVariable.SetAsString(const Value: zend_ustr); begin Exit; end; - ZVAL_STRINGL(FValue, zend_pchar(Value), Length(Value), true); + ZVALVAL(FValue, zend_pchar(Value), Length(Value)); end; procedure TZendVariable.SetAsTime(const Value: TDateTime); @@ -763,7 +763,7 @@ procedure TZendVariable.SetAsTime(const Value: TDateTime); begin Exit; end; - ZVAL_DOUBLE(FValue, Value); + ZVALVAL(FValue, Value); end; procedure TZendVariable.SetAsVariant(const Value: variant); @@ -772,7 +772,7 @@ procedure TZendVariable.SetAsVariant(const Value: variant); begin Exit; end; - variant2zval(Value, FValue); + VariantToZend(Value, FValue); end; @@ -782,7 +782,7 @@ procedure TZendVariable.UnAssign; begin Exit; end; - ZVAL_NULL(FValue); + ZVALVAL(FValue); end; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 9e2aeca..634f004 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -747,6 +747,8 @@ procedure ZEND_PUTS(str: zend_pchar); procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG) overload; procedure ZvalVAL(z:pzval) overload; procedure ZvalVAL(z:pzval; v:Double) overload; + procedure ZvalVAL(z:pzval; v:SmallInt) overload; + procedure ZvalVAL(z:pzval; v:Extended) overload; procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); overload; procedure ZvalString(z:pzval) overload; procedure ZvalString(z:pzval; s:zend_pchar; len:Integer = 0) overload; @@ -776,13 +778,7 @@ function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) function GetArgPZval(Args: TVarRec; const _type: Integer = IS_LONG; Make: Boolean = false): pzval; procedure ZVAL_RESOURCE(value: pzval; l: longint); -procedure ZVAL_BOOL(z: pzval; b: boolean); -procedure ZVAL_NULL(z: pzval); -procedure ZVAL_LONG(z: pzval; l: longint); -procedure ZVAL_DOUBLE(z: pzval; d: double); procedure ZVAL_EMPTY_STRING(z: pzval); -procedure ZVAL_TRUE(z: pzval); -procedure ZVAL_FALSE(z: pzval); function add_next_index_variant(arg: pzval; value: variant): integer; procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; @@ -803,10 +799,13 @@ procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; function ToStrA(V: Variant): zend_ustr; function ToStr(V: Variant): String; function toWChar(s: zend_pchar): PWideChar; +function ZendToVariant(const Value: pzval): Variant; {$IFNDEF PHP7} -function ZendToVariant(const Value: pppzval): Variant; overload; +overload; function ZendToVariant(const Value: ppzval): Variant; overload; +function ZendToVariant(const Value: pppzval): Variant; overload; {$ENDIF} +procedure VariantToZend(const Value: Variant; z: pzval); procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); @@ -1022,16 +1021,6 @@ procedure ZVAL_RESOURCE(value: pzval; l: longint); value^.value.lval := l; end; -procedure ZVAL_BOOL(z: pzval; b: boolean); -begin - {$IFDEF PHP7} - z^.u1.v._type - {$ELSE} - z^._type - {$ENDIF} := IS_BOOL; - z^.value.lval := integer(b); -end; - procedure ZVAL_NULL(z: pzval); begin {$IFDEF PHP7} @@ -1041,25 +1030,6 @@ procedure ZVAL_NULL(z: pzval); {$ENDIF} := IS_NULL; end; -procedure ZVAL_LONG(z: pzval; l: longint); -begin - {$IFDEF PHP7} - z^.u1.v._type - {$ELSE} - z^._type - {$ENDIF} := IS_LONG; - z^.value.lval := l; -end; - -procedure ZVAL_DOUBLE(z: pzval; d: double); -begin - {$IFDEF PHP7} - z^.u1.v._type - {$ELSE} - z^._type - {$ENDIF} := IS_DOUBLE; - z^.value.dval := d; -end; procedure ZvalString(z:pzval); begin z^.value.str.len := 0; @@ -1180,6 +1150,27 @@ procedure ZvalVAL(z:pzval; v:Double); {$ENDIF} := IS_LONG; z.value.dval := v; End; + +procedure ZvalVAL(z:pzval; v:SmallInt); +begin + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_LONG; + z^.value.lval := v; +end; + +procedure ZvalVAL(z:pzval; v:Extended); +Begin + {$IFDEF PHP7} + z^.u1.v._type + {$ELSE} + z^._type + {$ENDIF} := IS_LONG; + z.value.dval := v; +End; + procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); var lens: Integer; @@ -1554,17 +1545,6 @@ procedure ZVAL_EMPTY_STRING(z: pzval); {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; end; -procedure ZVAL_TRUE(z: pzval); -begin - {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_BOOL; - z^.value.lval := 1; -end; - -procedure ZVAL_FALSE(z: pzval); -begin - {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_BOOL; - z^.value.lval := 0; -end; function ToStrA(V: Variant): zend_ustr; begin Result := V; @@ -1589,33 +1569,164 @@ function toWChar(s: zend_pchar): PWideChar; ss := ss2; Result := PWideChar(ss); end; +function HashToVarArray(const Value:{$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}): Variant; + Var + Len,I: Integer; + tmp : pppzval; +begin + len := zend_hash_num_elements(Value); + Result := VarArrayCreate([0, len - 1], varVariant); + for i:=0 to len-1 do + begin + new(tmp); -function ZendToVariant(const Value: pppzval): Variant; overload; + zend_hash_index_find(Value,i,tmp); + + VarArrayPut(Result, ZendToVariant(tmp), [i]); + freemem(tmp); + end; +end; +procedure VarArrayToHash(var HT: pzval;Value: Variant); + Var + I,Len: Integer; + z: pzval; +begin + _array_init(ht,nil,1); + len := TVarData(Value).VArray^.Bounds[0].ElementCount; + for i:= 0 to len - 1 do + begin + z := MAKE_STD_ZVAL; + VariantToZend(VarArrayGet(Value, [i]),z); + add_index_zval(HT, i, z); + end; +end; + +function ZendToVariant(const Value: pzval): Variant; overload; Var S: String; begin - case {$IFDEF PHP7} Value^^^.u1.v._type {$ELSE}Value^^^._type{$ENDIF} of + case {$IFDEF PHP7} Value^.u1.v._type {$ELSE}Value^._type{$ENDIF} of 0: Result := Null; - 1: Result := Value^^^.value.lval; - 2: Result := Value^^^.value.dval; - 3: Result := boolean(Value^^^.value.lval); - 8: begin S := Value^^^.value.str.val; Result := S; end; - 6: begin S := Value^^^.value.str.val; Result := S; end + 1: Result := Value^.value.lval; + 2: Result := Value^.value.dval; + 3: Result := boolean(Value^.value.lval); + 4: Result := HashToVarArray(Value^.value.ht); + //5: Result := object //HERE; + 7: Result := Value^.value.lval; + 6: begin S := Value^.value.str.val; Result := S; end; + 8: begin S := Value^.value.str.val; Result := S; end; + 9: Result := HashToVarArray(Value^.value.ht) else Result := Null; end; end; +procedure VariantToZend(const Value:Variant;z:pzval); +var + W : WideString; + S: String; +begin + if VarIsEmpty(value) then + begin + ZVALVAL(z); + Exit; + end; + case TVarData(Value).VType of + varString : //Peter Enz + begin + if Assigned ( TVarData(Value).VString ) then + begin + ZVAL_STRING(z, TVarData(Value).VString , true); + end + else + begin + ZVAL_STRING(z, '', true); + end; + end; + + varUString : //Peter Enz + begin + S := string(TVarData(Value).VUString); + + ZVAL_STRING(z, zend_pchar(zend_ustr(S)), true); + end; + + varOleStr : //Peter Enz + begin + if Assigned ( TVarData(Value).VOleStr ) then + begin + W := WideString(Pointer(TVarData(Value).VOleStr)); + ZVAL_STRINGW(z, PWideChar(W), true); + end + else + begin + ZVAL_STRING(z, '', true); + end; + end; + + varWord : ZVALVAL(z, TVarData(Value).VWord); + //HERE; + // varVariant : + // varUnknown : + //<=== VarIs{TYPE}() + + //varDispatch : integer(TVarData(Value).VDispatch + //<== ... + // Dispatch (, )... + // . + //varAny : integer(TVarData(Value).VAny + //<== *() + // + + //varRecord : integer(TVarData(Value).VRecord) + //<==... RTTI + //varObject : integer(TVarData(Value).VObject) + //<==... + varStrArg : //Peter Enz + begin + if Assigned ( TVarData(Value).VString ) then + begin + ZVAL_STRING(z, TVarData(Value).VString , true); + end + else + begin + ZVAL_STRING(z, '', true); + end; + end; + + varUStrArg : //Peter Enz + begin + S := string(TVarData(Value).VUString); + + ZVAL_STRING(z, zend_pchar(zend_ustr(S)), true); + end; + varInt64 : ZVALVAL(z, TVarData(Value).VInt64); + varUInt64 : ZVALVAL(z, TVarData(Value).VUInt64); + varShortInt : ZVALVAL(z, Integer(TVarData(Value).VShortInt)); + varSmallInt : ZVALVAL(z, Integer(TVarData(Value).VSmallint)); + varInteger : ZVALVAL(z, TVarData(Value).VInteger); + varBoolean : ZVALVAL(z, TVarData(Value).VBoolean); + varSingle : ZVALVAL(z, TVarData(Value).VSingle); + varDouble : ZVALVAL(z, TVarData(Value).VDouble); + varCurrency : ZVALVAL(z, TVarData(Value).VCurrency); + //!> + varError : ZVALVAL(z, Integer(TVarData(Value).VError)); + + varByte : ZVALVAL(z, Integer(TVarData(Value).VByte)); + varDate : ZVALVAL(z, TVarData(Value).VDate); + varArray : VarArrayToHash(z, Value); + else + ZVALVAL(Z); + end; +end; + function ZendToVariant(const Value: ppzval): Variant; overload; - Var - S: String; begin -Result := Null; - case {$IFDEF PHP7} Value^^.u1.v._type {$ELSE}Value^^._type{$ENDIF} of - 1: Result := Value^^.value.lval; - 2: Result := Value^^.value.dval; - 6: begin S := Value^^.value.str.val; Result := S; end; - 4,5: Result := Null; - end; +Result := ZendToVariant(Value^); +end; + +function ZendToVariant(const Value: pppzval): Variant; overload; +begin +Result := ZendToVariant(Value^^); end; procedure HashToArray(HT: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; var AR: TArrayVariant); overload; @@ -1725,14 +1836,14 @@ function add_next_index_variant(arg: pzval; value: variant): integer; ZVAL_STRING(iz, '', true); end; end; - varSmallInt : ZVAL_LONG(iz, TVarData(Value).VSmallint); - varInteger : ZVAL_LONG(iz, TVarData(Value).VInteger); - varBoolean : ZVAL_BOOL(iz, TVarData(Value).VBoolean); - varSingle : ZVAL_DOUBLE(iz, TVarData(Value).VSingle); - varDouble : ZVAL_DOUBLE(iz, TVarData(Value).VDouble); - varError : ZVAL_LONG(iz, TVarData(Value).VError); - varByte : ZVAL_LONG(iz, TVarData(Value).VByte); - varDate : ZVAL_DOUBLE(iz, TVarData(Value).VDate); + varSmallInt : ZVALVAL(iz, TVarData(Value).VSmallint); + varInteger : ZVALVAL(iz, TVarData(Value).VInteger); + varBoolean : ZVALVAL(iz, TVarData(Value).VBoolean); + varSingle : ZVALVAL(iz, TVarData(Value).VSingle); + varDouble : ZVALVAL(iz, TVarData(Value).VDouble); + varError : ZVALVAL(iz, TVarData(Value).VError); + varByte : ZVALVAL(iz, TVarData(Value).VByte); + varDate : ZVALVAL(iz, TVarData(Value).VDate); else ZVAL_NULL(iz); end; @@ -1747,7 +1858,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; begin if _array_init(z, nil, 0) = FAILURE then // begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -1774,7 +1885,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; begin if _array_init(z, nil, 0) = FAILURE then // begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -1801,7 +1912,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; begin if _array_init(z, nil, 0) = FAILURE then // begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -1828,7 +1939,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of zend_ustr); overload; begin if _array_init(z, nil, 0) = FAILURE then // begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -1855,7 +1966,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; begin if _array_init(z, nil, 0) = FAILURE then // begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -1881,7 +1992,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; begin if _array_init(z, nil, 0) = FAILURE then // begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -1909,13 +2020,13 @@ procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; begin if _array_init(z, nil, 0) = FAILURE then // begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; if arr.PVarArray.DimCount = 0 then begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -1977,7 +2088,7 @@ procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of ansichar; keyvals: Array of begin if _array_init(z, nil, 0) = FAILURE then begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -1998,7 +2109,7 @@ procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of ansichar; keyvals: Array of end else begin - ZVAL_FALSE(z); + ZVALVAL(z,False); end; end; procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of PWideChar); @@ -2007,7 +2118,7 @@ procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of begin if _array_init(z, nil, 0) = FAILURE then begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -2031,7 +2142,7 @@ procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of end else begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -2042,7 +2153,7 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overloa begin if _array_init(z, nil, 0) = FAILURE then // begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; //z^.refcount := Length(keynames); // @@ -2071,7 +2182,7 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overloa end else begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -2082,7 +2193,7 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of begin if _array_init(z, nil, 0) = FAILURE then begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -2107,7 +2218,7 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of end else begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -2118,7 +2229,7 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; begin if _array_init(z, nil, 0) = FAILURE then begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -2142,7 +2253,7 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; end else begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -2153,7 +2264,7 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array o begin if _array_init(z, nil, 0) = FAILURE then begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; @@ -2177,7 +2288,7 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array o end else begin - ZVAL_FALSE(z); + ZVALVAL(z,False); Exit; end; diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 8979854..4fe98e7 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -957,7 +957,7 @@ procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; {$IFNDEF PHP510} return_value_ptr := nil; {$ENDIF} - ZVAL_NULL(return_value); + ZVALVAL(return_value); gl := GetSAPIGlobals; if gl = nil then Exit; @@ -969,7 +969,7 @@ procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; if lib <> nil then Lib.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); except - ZVAL_NULL(return_value); + ZVALVAL(return_value); end; end; end; @@ -1570,7 +1570,7 @@ procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; FZendVar.AsZendVariable := return_value; AFunction.OnExecute(Self, FParameters, ReturnValue, FZendVar, TSRMLS_DC); if FZendVar.ISNull then {perform variant conversion} - variant2zval(ReturnValue, return_value); + VariantToZend(ReturnValue, return_value); finally FZendVar.Free; end; From e74fff97458ef94beed579cf8fed0acce63ed2d1 Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 5 Aug 2019 00:23:52 +0300 Subject: [PATCH 32/54] Update ZENDAPI.pas --- Source/ZENDAPI.pas | 57 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 634f004..397f38e 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -725,6 +725,9 @@ procedure dispose_pzval_array(Params: pzval_array); procedure ZEND_PUTS(str: zend_pchar); +type + TObjectAConvertMethod = procedure(v:variant;z:pzval); + TObjectBConvertMethod = function(a: pzval):Variant; var zend_register_internal_class : function(class_entry: pzend_class_entry; TSRMLS_DC: pointer): Pzend_class_entry; cdecl; @@ -799,13 +802,14 @@ procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; function ToStrA(V: Variant): zend_ustr; function ToStr(V: Variant): String; function toWChar(s: zend_pchar): PWideChar; -function ZendToVariant(const Value: pzval): Variant; +function ZendToVariant(const Value: pzval;cobj: TObjectBConvertMethod=nil): Variant; {$IFNDEF PHP7} overload; -function ZendToVariant(const Value: ppzval): Variant; overload; -function ZendToVariant(const Value: pppzval): Variant; overload; +function ZendToVariant(const Value: ppzval;cobj: TObjectBConvertMethod=nil): Variant; overload; +function ZendToVariant(const Value: pppzval;cobj: TObjectBConvertMethod=nil): Variant; overload; {$ENDIF} -procedure VariantToZend(const Value: Variant; z: pzval); +procedure VariantToZend(const Value: Variant; z: pzval; +cobj: TObjectAConvertMethod=nil); procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); @@ -1601,7 +1605,8 @@ procedure VarArrayToHash(var HT: pzval;Value: Variant); end; end; -function ZendToVariant(const Value: pzval): Variant; overload; +function ZendToVariant(const Value: pzval; +cobj: TObjectBConvertMethod=nil): Variant; overload; Var S: String; begin @@ -1611,7 +1616,11 @@ function ZendToVariant(const Value: pzval): Variant; overload; 2: Result := Value^.value.dval; 3: Result := boolean(Value^.value.lval); 4: Result := HashToVarArray(Value^.value.ht); - //5: Result := object //HERE; + 5: + if Assigned(cobj) then + Result := cobj(Value) + else + Result := Null; 7: Result := Value^.value.lval; 6: begin S := Value^.value.str.val; Result := S; end; 8: begin S := Value^.value.str.val; Result := S; end; @@ -1620,7 +1629,8 @@ function ZendToVariant(const Value: pzval): Variant; overload; end; end; -procedure VariantToZend(const Value:Variant;z:pzval); +procedure VariantToZend(const Value:Variant;z:pzval; +cobj: TObjectAConvertMethod=nil); var W : WideString; S: String; @@ -1673,14 +1683,41 @@ procedure VariantToZend(const Value:Variant;z:pzval); //<== ... // Dispatch (, )... // . + varDispatch : + begin + if Assigned(cobj) then + cobj(Value, z) + else + ZVALVAL(z); + end; //varAny : integer(TVarData(Value).VAny //<== *() // - + varAny : + begin + if Assigned(cobj) then + cobj(Value, z) + else + ZVALVAL(z); + end; //varRecord : integer(TVarData(Value).VRecord) //<==... RTTI + varRecord : + begin + if Assigned(cobj) then + cobj(Value, z) + else + ZVALVAL(z); + end; //varObject : integer(TVarData(Value).VObject) //<==... + varObject : + begin + if Assigned(cobj) then + cobj(Value, z) + else + ZVALVAL(z, integer(TObject(TVarData(Value).VPointer^))); + end; varStrArg : //Peter Enz begin if Assigned ( TVarData(Value).VString ) then @@ -1719,12 +1756,12 @@ procedure VariantToZend(const Value:Variant;z:pzval); end; end; -function ZendToVariant(const Value: ppzval): Variant; overload; +function ZendToVariant(const Value: ppzval;cobj: TObjectBConvertMethod=nil): Variant; overload; begin Result := ZendToVariant(Value^); end; -function ZendToVariant(const Value: pppzval): Variant; overload; +function ZendToVariant(const Value: pppzval;cobj: TObjectBConvertMethod=nil): Variant; overload; begin Result := ZendToVariant(Value^^); end; From 0514dbb02ff15ace4268ee1e5d7f8829306f27cc Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 5 Aug 2019 10:42:13 +0300 Subject: [PATCH 33/54] Update ZENDAPI.pas --- Source/ZENDAPI.pas | 151 ++++++++++----------------------------------- 1 file changed, 34 insertions(+), 117 deletions(-) diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 397f38e..15af527 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -782,7 +782,11 @@ function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval) Make: Boolean = false): pzval; procedure ZVAL_RESOURCE(value: pzval; l: longint); procedure ZVAL_EMPTY_STRING(z: pzval); + function add_next_index_variant(arg: pzval; value: variant): integer; +function add_index_variant(arg: pzval; index:integer; value: variant): integer; +function add_assoc_variant(arg: pzval; key: zend_pchar; key_len: uint; value: variant): integer; + procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; @@ -1593,18 +1597,14 @@ function HashToVarArray(const Value:{$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$E procedure VarArrayToHash(var HT: pzval;Value: Variant); Var I,Len: Integer; - z: pzval; begin _array_init(ht,nil,1); len := TVarData(Value).VArray^.Bounds[0].ElementCount; for i:= 0 to len - 1 do begin - z := MAKE_STD_ZVAL; - VariantToZend(VarArrayGet(Value, [i]),z); - add_index_zval(HT, i, z); + add_index_variant(HT, i, VarArrayGet(Value, [i])); end; end; - function ZendToVariant(const Value: pzval; cobj: TObjectBConvertMethod=nil): Variant; overload; Var @@ -1793,45 +1793,24 @@ procedure ArrayToHash(AR: Array of Variant; var HT: pzval); overload; len := Length(AR); for i:=0 to len-1 do begin - case VarType(AR[i]) of - varInteger, varSmallint, varLongWord, 17: add_index_long(ht,i,AR[i]); - varDouble,varSingle: add_index_double(ht,i,AR[i]); - varBoolean: add_index_bool(ht,i,AR[I]); - varEmpty: add_index_null(ht,i); - varString: add_index_string(ht,i,zend_pchar(ToStr(AR[I])),1); - 258: add_index_string(ht,i,zend_pchar(zend_ustr(ToStr(AR[I]))),1); - end; + add_index_variant(ht,i,AR[i]); end; end; procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; Var I,Len: Integer; - v: Variant; - key: zend_pchar; - s: zend_pchar; begin _array_init(ht,nil,1); len := Length(AR); for i:=0 to len-1 do begin - v := AR[I]; - key := zend_pchar(ToStrA(keys[i])); - s := zend_pchar(ToStrA(v)); - case VarType(AR[i]) of - varInteger, varSmallint, varLongWord, 17: add_assoc_long_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[i]); - varDouble,varSingle: add_assoc_double_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[i]); - varBoolean: add_assoc_bool_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[I]); - varEmpty: add_assoc_null_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1); - varString,258: add_assoc_string_ex(ht,key,strlen(key)+1,s,1); - end; + add_assoc_variant(ht, ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1,AR[i]); end; end; function add_next_index_variant(arg: pzval; value: variant): integer; var iz: pzval; - W: WideString; - S: String; begin iz := MAKE_STD_ZVAL; if VarIsEmpty(value) then @@ -1840,54 +1819,37 @@ function add_next_index_variant(arg: pzval; value: variant): integer; Result := add_next_index_zval(arg, iz); Exit; end; - // MessageBoxA(0, zend_pchar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ; - case TVarData(Value).VType of - varString : //Peter Enz - begin - if Assigned ( TVarData(Value).VString ) then - begin - ZVAL_STRING(iz, TVarData(Value).VString , true); - end - else - begin - ZVAL_STRING(iz, '', true); - end; - end; - - varUString : //Peter Enz - begin - S := string(TVarData(Value).VUString); - - ZVAL_STRING(iz, zend_pchar(zend_ustr(S)), true); - end; + VariantToZend(Value,iz); + Result := add_next_index_zval(arg, iz); +end; - varOleStr : //Peter Enz - begin - if Assigned ( TVarData(Value).VOleStr ) then - begin - W := WideString(Pointer(TVarData(Value).VOleStr)); - ZVAL_STRINGW(iz, PWideChar(W), true); - end - else - begin - ZVAL_STRING(iz, '', true); - end; - end; - varSmallInt : ZVALVAL(iz, TVarData(Value).VSmallint); - varInteger : ZVALVAL(iz, TVarData(Value).VInteger); - varBoolean : ZVALVAL(iz, TVarData(Value).VBoolean); - varSingle : ZVALVAL(iz, TVarData(Value).VSingle); - varDouble : ZVALVAL(iz, TVarData(Value).VDouble); - varError : ZVALVAL(iz, TVarData(Value).VError); - varByte : ZVALVAL(iz, TVarData(Value).VByte); - varDate : ZVALVAL(iz, TVarData(Value).VDate); - else - ZVAL_NULL(iz); +function add_index_variant(arg: pzval; index:integer; value: variant): integer; +var iz: pzval; +begin + iz := MAKE_STD_ZVAL; + if VarIsEmpty(value) then + begin + ZVAL_NULL(iz); + Result := add_index_zval(arg, index, iz); + Exit; end; - - Result := add_next_index_zval(arg, iz); + VariantToZend(Value,iz); + Result := add_index_zval(arg, index, iz); end; +function add_assoc_variant(arg: pzval; key: zend_pchar; key_len: uint; value: variant): integer; +var iz: pzval; +begin + iz := MAKE_STD_ZVAL; + if VarIsEmpty(value) then + begin + ZVAL_NULL(iz); + Result := add_assoc_zval_ex(arg, key, key_len, iz); + Exit; + end; + VariantToZend(Value,iz); + Result := add_assoc_zval_ex(arg, key, key_len, iz); +end; procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; var @@ -2069,51 +2031,6 @@ procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; for i := 0 to arr.DimCount-1 do begin - {V := TVarData( arr[i] ); - case V.VType of - varEmpty, varNull: - add_next_index_null(z); - varSmallInt: - add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VSmallInt))), 1); - varInteger: - add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VInteger))), 1); - varSingle: - add_next_index_string(z, zend_pchar(zend_ustr(V.VSingle.ToString())), 1); - varDouble: - add_next_index_double(z, V.VDouble); - varCurrency: - add_next_index_string(z, zend_pchar(zend_ustr(CurrToStr(V.VCurrency))), 1); - varDate: - add_next_index_string(z, zend_pchar(zend_ustr(DateTimeToStr(V.VDate))), 1); - varOleStr: - add_next_index_string(z, zend_pchar(zend_ustr(V.VOleStr)), 1); - varBoolean: - add_next_index_bool(z, V.VBoolean.ToInteger()); - varByte: - add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VByte))), 1); - varWord: - add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VWord))), 1); - varShortInt: - add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VShortInt))), 1); - varLongWord: - add_next_index_long(z, V.VLongWord); - varInt64: - add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VInt64))), 1); - varString: - add_next_index_string(z, zend_pchar(zend_ustr(V.VString)), 1); - {$IFDEF SUPPORTS_UNICODE_STRING}{ - varUString: - add_next_index_string(z, zend_pchar(zend_ustr(V.VUString)), 1); - {$ENDIF SUPPORTS_UNICODE_STRING} - {varArray, - varDispatch, - varError, - varUnknown, - varAny, - varByRef:}{ - varObject: - add_next_index_long(z, Integer( - end; } add_next_index_variant(z, arr[i]); end; Exit; From 83db7ac22559d4b46526f01d1f82c6f1a6d0888c Mon Sep 17 00:00:00 2001 From: Andrew Zenin Date: Mon, 5 Aug 2019 13:54:34 +0300 Subject: [PATCH 34/54] Fixed critical bug --- Source/PHPFunctions.pas | 16 ++++------------ Source/ZENDAPI.pas | 2 +- Source/php4delphi.pas | 31 +++++++++++++++++++------------ 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index 48b47de..8875c7f 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -663,10 +663,7 @@ function TZendVariable.GetAsVariant: variant; function TZendVariable.GetDataType: integer; begin if not Assigned(FValue) then - begin - Result := IS_NULL; - Exit; - end; + Exit(IS_NULL); Result := {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF}; end; @@ -674,20 +671,15 @@ function TZendVariable.GetDataType: integer; function TZendVariable.GetIsNull: boolean; begin if not Assigned(FValue) then - begin - Result := true; - Exit; - end; + Exit(True); + Result := {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} = IS_NULL; end; function TZendVariable.GetTypeName: string; begin if not Assigned(FValue) then - begin - Result := 'null'; - Exit; - end; + Exit('null'); case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of IS_NULL: result := 'null'; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 15af527..accf608 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -1635,7 +1635,7 @@ procedure VariantToZend(const Value:Variant;z:pzval; W : WideString; S: String; begin - if VarIsEmpty(value) then + if VarIsEmpty(value) or VarIsNull(Value) then begin ZVALVAL(z); Exit; diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 4fe98e7..35a7d96 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -1503,7 +1503,16 @@ function TPHPEngine.GetConstantCount: integer; begin Result := FConstants.Count; end; - +{ +procedure log(i:String); +var f:TextFile; +begin + AssignFile(f, 'log.txt'); + Append(f); + Write(f, #10 + #13 + i); + CloseFile(f); +end; +} procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; return_value_ptr: ppzval; this_ptr: pzval; return_value_used: integer; TSRMLS_DC: pointer); @@ -1519,7 +1528,6 @@ procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; ReturnValue : variant; begin FParameters := TFunctionParams.Create(nil, TFunctionParam); - try if ht > 0 then begin @@ -1564,23 +1572,22 @@ procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; FParameters[j].ZendValue := (Params[j]^); end; end; { if ht > 0} - + //log(FActiveFunctionName); FZendVar := TZendVariable.Create; - try FZendVar.AsZendVariable := return_value; AFunction.OnExecute(Self, FParameters, ReturnValue, FZendVar, TSRMLS_DC); - if FZendVar.ISNull then {perform variant conversion} - VariantToZend(ReturnValue, return_value); - finally - FZendVar.Free; - end; + if Assigned(FZendVar) then + begin + if FZendVar.ISNull then {perform variant conversion} + VariantToZend(ReturnValue, return_value); + FZendVar.Free; + end + else + VariantToZend(ReturnValue, return_value); end; {if assigned AFunction.OnExecute} end; - - finally FParameters.Free; dispose_pzval_array(Params); - end; end; procedure TPHPEngine.PrepareIniEntry; From 8c1d55525016c8d23424695dd164906be029742c Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Wed, 12 Feb 2020 00:44:22 +0200 Subject: [PATCH 35/54] Update Unified ZVAL functions and some routines Removed PHP4 from support list as it's gone a long time ago already Fixed some AVs and uncorrect functions Added pointer checking Removed legacy code --- .gitignore | 7 +- Source/Clear.bat | 9 +- Source/DelphiFunctions.pas | 655 +---------- Source/Demos/psvPHP/console/phpcon.dpr | 49 +- Source/Demos/psvPHP/console/phpcon.dproj | 559 ++++++++++ Source/PHP.INC | 24 +- Source/PHPAPI.pas | 442 +++----- Source/PHPCommon.pas | 12 +- Source/PHPFunctions.pas | 4 +- Source/PHPTypes.pas | 7 +- Source/ZENDAPI.pas | 1272 +++++++++------------- Source/ZendTypes.pas | 110 +- Source/php4AppUnit.pas | 46 +- Source/php4delphi.pas | 215 ++-- Source/phpClass.pas | 255 +---- Source/phpModules.pas | 10 +- 16 files changed, 1399 insertions(+), 2277 deletions(-) create mode 100644 Source/Demos/psvPHP/console/phpcon.dproj diff --git a/.gitignore b/.gitignore index 06ae224..294f54a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,9 @@ __history/ __recovery/ -*.dcu \ No newline at end of file +*.dcu +*.local +*.exe +*.identcache +*.stat +*.res diff --git a/Source/Clear.bat b/Source/Clear.bat index 235952d..a1358fa 100644 --- a/Source/Clear.bat +++ b/Source/Clear.bat @@ -1 +1,8 @@ -del *.dcu +del /f php4delphi.dcu +del /f phpFunctions.dcu +del /f DelphiFunctions.dcu +del /f PHPCommon.dcu +del /f PHPAPI.dcu +del /f ZENDAPI.dcu +del /f PHPTypes.dcu +del /f ZendTypes.dcu diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index 78a0a2a..3be090d 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -6,6 +6,7 @@ { Serhiy Perevoznyk } { serge_perevoznyk@hotmail.com } { http://users.telenet.be/ws36637 } +{ http://users.chello.be/ws36637 } {*******************************************************} {$I PHP.INC} @@ -16,9 +17,9 @@ interface uses SysUtils, Classes, - Controls, - {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} ZendAPI, PHPTypes, PHPAPI, Dialogs, typinfo, - Forms, stdctrls; + VCL.Controls, + {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} ZendAPI, PHPTypes, PHPAPI, VCL.Dialogs, typinfo, + VCL.Forms, VCL.stdctrls; {$ifdef fpc} {$mode delphi} @@ -28,134 +29,27 @@ interface author_class_entry : Tzend_class_entry; delphi_object_entry : TZend_class_entry; - - object_functions : {$IFDEF PHP7}HashTable{$ELSE}array[0..2] of zend_function_entry{$ENDIF}; - author_functions : {$IFDEF PHP7}HashTable{$ELSE}array[0..2] of zend_function_entry{$ENDIF}; - DelphiObject : pzend_class_entry; ce : pzend_class_entry; - {$IFDEF PHP7} - DelphiObjectHandlers : _zend_object_handlers; - {$ELSE} - {$IFDEF PHP5} - DelphiObjectHandlers : zend_object_handlers; - {$ENDIF} - {$ENDIF} + DelphiObjectHandlers : _zend_object_handlers; procedure RegisterInternalClasses(p : pointer); - -//proto string delphi_get_system_directory(void) -{$IFDEF PHP510} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - //proto string delphi_str_date(void) -{$IFDEF PHP510} procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} //proto float delphi_date(void) -{$IFDEF PHP510} procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_extract_file_dir(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_extract_file_drive(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_extract_file_name(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto string delphi_extract_file_ext(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -//proto void delphi_show_message(string message) -{$IFDEF PHP510} -procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} //proto string delphi_input_box(string caption, string prompt, string default) -{$IFDEF PHP510} procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -{$IFDEF PHP510} -procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -{$IFDEF PHP5} procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -{$IFDEF PHP5} -procedure delphi_is_uc(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_is_uc(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -{$IFDEF PHP510} -procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} const SimpleProps = [tkInteger, tkChar, tkEnumeration, tkFloat, @@ -163,114 +57,22 @@ procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr implementation - - -//proto string delphi_get_system_directory(void) -{$IFDEF PHP510} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_system_directory(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - //proto string delphi_str_date(void) -{$IFDEF PHP510} procedure delphi_str_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_str_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} begin ZVAL_STRING(return_value, zend_pchar(DateToStr(Date)), true); end; //proto float delphi_date(void) -{$IFDEF PHP510} procedure delphi_date(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_date(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} begin ZVALVAL(return_value, Date); end; - -//proto string delphi_extract_file_dir(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_dir(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto string delphi_extract_file_drive(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_drive(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto string delphi_extract_file_name(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_name(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto string delphi_extract_file_ext(string source) -{$IFDEF PHP510} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_extract_file_ext(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -//proto void delphi_show_message(string message) -{$IFDEF PHP510} -procedure delphi_show_message(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_show_message(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -begin - -end; - - //proto string delphi_input_box(string caption, string prompt, string default) -{$IFDEF PHP510} procedure delphi_input_box(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} var p: pzval_array; begin if ht <> 3 then @@ -279,343 +81,15 @@ procedure delphi_input_box(ht : integer; return_value : pzval; this_ptr : pzval; exit; end; zend_get_parameters_my(ht, p, TSRMLS_DC); + {$IFNDEF PHP7} ZVAL_STRINGW(return_value, PWideChar(InputBox( Z_STRVAL(p[0]^), Z_STRVAL(p[1]^), Z_STRVAL(p[2]^) )), true); + {$ENDIF} dispose_pzval_array(p); end; -//proto void delphi_send_message(void) -{$IFDEF PHP510} -procedure delphi_send_email(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_send_email(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - //ShellExecute(0, 'open', 'mailto:serge_perevoznyk@hotmail.com', nil, nil, SW_SHOWNORMAL); -end; - -//proto void delphi_visit_homepage(void) -{$IFDEF PHP510} -procedure delphi_visit_homepage(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_visit_homepage(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - //ShellExecute(0, 'open', 'http://users.chello.be/ws36637', nil, nil, SW_SHOW); -end; - - //Delphi objects support - -{$IFDEF PHP510} -procedure delphi_object_classname(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_object_classname(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin - -end; - -{$IFDEF PHP510} -procedure delphi_object_classnameis(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_object_classnameis(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -begin -end; - - - -{$IFDEF PHP4} -function delphi_set_property_handler(property_reference : Pzend_property_reference; value : pzval) : integer; cdecl; -var - this_ptr : pzval; - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - propname : zend_ustr; -// --> hupu, 2006.06.01 -// pt : TTypeKind; -{$IFDEF VERSION7} - Scripter : TPHPScriptableObject; -{$ELSE} - pt : TypInfo.TTypeKind; -{$ENDIF} -// <-- hupu, 2006.06.01 -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - -// --> hupu, 2006.06.01 -{$IFDEF VERSION7} - Scripter := TPHPScriptableObject(Obj); - if SameText('Parent', propname) then - begin - TWinControl(Scripter.InstanceObj).Parent := - TWinControl(value^.value.lval); - end - else - Scripter.SetPropertyByID(Scripter.NameToDispID(propname), - [zval2variant(value^)] ); -{$ELSE} -// <-- hupu, 2006.06.01 - - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - SetPropValue(OBJ, propname, zval2variant(value^)) - else - if pt = tkClass then - begin - Obj := GetObjectProp(Obj, propname); - while element <> nil do - begin - element := element^.prev; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - begin - SetPropValue(OBJ, propname, zval2variant(value^)); - break; - end - else - if pt = tkClass then - Obj := GetObjectProp(Obj, propname); - end; - end; - -// --> hupu, 2006.06.01 -{$ENDIF} -// <-- hupu, 2006.06.01 - Result := SUCCESS; -end; - - - -procedure delphi_get_property_handler(val : pzval; property_reference : PZend_property_reference); cdecl; -var - this_ptr : pzval; - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - propname : zend_ustr; -// --> hupu, 2006.06.01 -// pt : TTypeKind; -{$IFDEF VERSION7} - Scripter : TPHPScriptableObject; -{$ELSE} - pt : TypInfo.TTypeKind; -{$ENDIF} -// <-- hupu, 2006.06.01 -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - -// --> hupu, 2006.06.01 -{$IFDEF VERSION7} -Scripter := TPHPScriptableObject(Obj); -if SameText('Parent', propname) then -begin -TWinControl(Scripter.InstanceObj).Parent := -TWinControl(val^.value.lval); -end -else - -Scripter.SetPropertyByID(Scripter.NameToDispID(propname), -[zval2variant(val^)] ); -{$ELSE} -// <-- hupu, 2006.06.01 - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - variant2zval(GetPropValue(OBJ, propname), val) - else - if pt = tkClass then - begin - Obj := GetObjectProp(Obj, propname); - while element <> nil do - begin - element := element^.prev; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - pt := PropType(Obj, propname); - if ( pt in SimpleProps) then - begin - variant2zval(GetPropValue(OBJ, propname), val); - break; - end - else - if pt = tkClass then - Obj := GetObjectProp(Obj, propname); - end; - end; -// --> hupu, 2006.06.01 -{$ENDIF} -// <-- hupu, 2006.06.01 -end; - - -{$IFDEF PHP4} -procedure _delphi_get_property_wrapper; assembler; -asm - push ebp - mov ebp,esp - sub esp,50h - push ebx - push esi - push edi - lea edi,[ebp-50h] - mov ecx,14h - mov eax,0CCCCCCCCh - rep stosd - mov eax,dword ptr [ebp+0Ch] - push eax - lea ecx,[ebp-10h] - push ecx - call delphi_get_property_handler - add esp,8 - mov edx,dword ptr [ebp+8] - mov eax,dword ptr [ebp-10h] - mov dword ptr [edx],eax - mov ecx,dword ptr [ebp-0Ch] - mov dword ptr [edx+4],ecx - mov eax,dword ptr [ebp-8] - mov dword ptr [edx+8],eax - mov ecx,dword ptr [ebp-4] - mov dword ptr [edx+0Ch],ecx - mov eax,dword ptr [ebp+8] - - pop edi - pop esi - pop ebx - add esp,50h - cmp ebp,esp - mov esp,ebp - pop ebp - ret -end; -{$ENDIF} - -procedure delphi_call_function(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; -var - OBJ : TObject; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - MethodName : zend_ustr; - Params : pzval_array; - M, D : integer; -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - MethodName := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data); - Obj := TObject(data^^^.value.lval); - freemem(data); - if ( Obj.InheritsFrom(TCustomEdit) ) then - begin - if SameText(MethodName, 'Clear') then - TCustomEdit(Obj).Clear; - if SameText(MethodName, 'ClearSelection') then - TCustomEdit(Obj).ClearSelection; - if SameText(MethodName, 'CopyToClipboard') then - TCustomEdit(Obj).CopyToClipboard; - if SameText(MethodName, 'ControlCount') then - ZVAL_LONG(return_value, TCustomEdit(Obj).ControlCount); - if SameText(MethodName, 'ScaleBy') then - begin - if ht > 0 then - begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - end; - M := Params[0]^.value.lval; - D := Params[1]^.value.lval; - TCustomEdit(Obj).ScaleBy(M, D); - dispose_pzval_array(Params); - end; - end; -end; -{$ENDIF} - - - -{$IFDEF PHP5} - -// Read object property value (getter) -function delphi_get_property_handler(_object : pzval; member : pzval; _type : integer; TSRMLS_DC : pointer) : pzval; cdecl; -begin - -end; - -// Write object property value (setter) -procedure delphi_set_property_handler(_object : pzval; member : pzval; value : pzval; TSRMLS_DC : pointer); cdecl; -begin - -end; - -{$IFDEF PHP510} -function delphi_call_method(method : zend_pchar; ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; -{$ELSE} -function delphi_call_method(method : zend_pchar; ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer) : integer; cdecl; -{$ENDIF} -begin - -end; - -function delphi_get_method(_object : pzval; method_name : zend_pchar; method_len : integer; TSRMLS_DC : pointer) : {$IFDEF PHP7}P_zend_function{$ELSE}PzendFunction{$ENDIF}; cdecl; - -begin - -end; - - -{$ENDIF} - -{$IFDEF PHP5} procedure delphi_get_author(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} var properties : array[0..3] of zend_pchar; begin @@ -623,68 +97,13 @@ procedure delphi_get_author(ht : integer; return_value : pzval; this_ptr : pzval properties[1] := 'last'; properties[2] := 'height'; properties[3] := 'email'; - {$IFDEF PHP4} - _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); - {$ELSE} object_init(return_value, ce, TSRMLS_DC ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1); - {$ELSE} add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Perevoznyk', 1, TSRMLS_DC); - {$ENDIF} - - {$IFDEF PHP5} add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); - {$ELSE} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); - {$ENDIF} - - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1); - {$ELSE} add_property_string_ex(return_value, properties[3], strlen(properties[3]) + 1, 'serge_perevoznyk@hotmail.com', 1, TSRMLS_DC); - {$ENDIF} end; -{$IFDEF PHP5} -procedure delphi_is_uc(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure delphi_is_uc(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); -{$ENDIF} -begin - ZVALVAL(return_value, {$IFDEF PHP_UNICE}TRUE{$ELSE}FALSE{$ENDIF}); -end; - -{$IFDEF PHP510} -procedure register_delphi_object(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_object(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -begin - -end; - -{$IFDEF PHP510} -procedure register_delphi_component(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure register_delphi_component(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} - -begin - - -end; @@ -694,66 +113,12 @@ procedure RegisterInternalClasses(p : pointer); {$IFDEF PHP7} ! {$ELSE} - object_functions[0].fname := 'delphi_classname'; - object_functions[0].handler := @delphi_object_classname; - - object_functions[1].fname := 'delphi_classnameis'; - object_functions[1].handler := @delphi_object_classnameis; - - object_functions[2].fname := nil; - object_functions[2].handler := nil; - - INIT_CLASS_ENTRY(delphi_object_entry, 'delphi_class' , @object_functions); - {$ENDIF} - {$IFDEF PHP4} - Delphi_Object_Entry.handle_property_get := @_delphi_get_property_wrapper; - Delphi_Object_Entry.handle_property_set := @delphi_set_property_handler; - Delphi_Object_Entry.handle_function_call := @delphi_call_function; - {$ELSE} - Move(zend_get_std_object_handlers()^, DelphiObjectHandlers, sizeof({$IFDEF PHP7}_zend_object_handlers{$ELSE}zend_object_handlers{$ENDIF})); - DelphiObjectHandlers.read_property := @delphi_get_property_handler; - DelphiObjecthandlers.write_property := @delphi_set_property_handler; - DelphiObjectHandlers.call_method := @delphi_call_method; - DelphiObjectHandlers.get_method := @delphi_get_method; - {$ENDIF} + Move(zend_get_std_object_handlers()^, DelphiObjectHandlers, sizeof(_zend_object_handlers)); DelphiObject := zend_register_internal_class(@delphi_object_entry, p); - author_functions[0].fname := 'send_email'; - author_functions[0].handler := @delphi_send_email; - - author_functions[1].fname := 'visit_homepage'; - author_functions[1].handler := @delphi_visit_homepage; - - author_functions[2].fname := nil; - author_functions[2].handler := nil; - INIT_CLASS_ENTRY(author_class_entry, 'php4delphi_author', @author_functions); + INIT_CLASS_ENTRY(author_class_entry, 'php4delphi_author', nil); ce := zend_register_internal_class(@author_class_entry, p); - -end; - -{$IFDEF VERSION7} - -{ -Delphi scripting support -The Original Code is: JvOle2Auto.PAS, released on 2002-07-04. -The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev -Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev -Copyright (c) 2001,2002 SGB Software -All Rights Reserved. -} - - -function WashVariant(const Value: Variant): OleVariant; -begin - if TVarData(Value).VType = (varString or varByRef) then - Result := PString(TVarData(VAlue).VString)^ + '' - else - Result := Value; + {$ENDIF} end; - - - -{$ENDIF} - end. diff --git a/Source/Demos/psvPHP/console/phpcon.dpr b/Source/Demos/psvPHP/console/phpcon.dpr index 1aa6530..5ac140b 100644 --- a/Source/Demos/psvPHP/console/phpcon.dpr +++ b/Source/Demos/psvPHP/console/phpcon.dpr @@ -1,4 +1,4 @@ -{$APPTYPE CONSOLE} +{$APPTYPE CONSOLE} {*******************************************************} { PHP4Delphi } @@ -13,22 +13,55 @@ program phpcon; -uses SysUtils, php4delphi; - +uses + SysUtils, + VCL.Dialogs, + php4delphi, + zendAPI, + ZENDTypes; var php : TpsvPHP; Engine : TPHPEngine; + +procedure gui_message(ht: integer; return_value: pzval; + return_value_ptr: pzval; this_ptr: pzval; return_value_used: integer; + TSRMLS_DC: pointer); cdecl; +var + Text: pzval; +begin + if zend_parse_method_parameters(1, TSRMLS_DC, this_ptr, 'z', @Text) = 0 then + begin + ShowMessage(Z_STRVAL(Text)); + end; +end; + procedure grc(ht: integer; return_value: pzval; + return_value_ptr: pzval; this_ptr: pzval; return_value_used: integer; + TSRMLS_DC: pointer); cdecl; +var + p: pzval; begin - if ParamCount <> 1 then + if zend_parse_method_parameters(1, TSRMLS_DC, this_ptr, 'z', @p) = 0 then begin - writeln(Format('Usage: %s ', [ParamStr(0)])); - Halt(1); + p^.value.lval := 0; end; +end; +begin Engine := TPHPEngine.Create(nil); + Engine.AddFunction('gui_message', @gui_message); + Engine.AddFunction('g_r_c', @grc); + Engine.HandleErrors := True; Engine.StartupEngine; php := TpsvPHP.Create(nil); - php.FileName := ParamStr(1); - write(php.Execute); + if ParamCount = 1 then + begin + php.FileName := ParamStr(1); + write(php.Execute); + end + else + begin + writeLn(Format('Usage: %s ', [ParamStr(0)])); + writeLn(php.RunCode('')); + end; php.Free; Engine.ShutdownEngine; Engine.Free; diff --git a/Source/Demos/psvPHP/console/phpcon.dproj b/Source/Demos/psvPHP/console/phpcon.dproj new file mode 100644 index 0000000..fdd2dd5 --- /dev/null +++ b/Source/Demos/psvPHP/console/phpcon.dproj @@ -0,0 +1,559 @@ + + + {BDB76098-EDD6-4A5A-AF30-D7A6B0BCF914} + phpcon.dpr + True + Debug + 3 + Console + None + 18.2 + Win64 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + ..\..\..\;$(DCC_UnitSearchPath) + C:\elsewere + false + 1058 + false + 00400000 + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + phpcon + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + false + $(BDS)\bin\delphi_PROJECTICNS.icns + + + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar + true + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + true + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + true + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + true + true + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + true + true + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true + true + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + true + + + C:\elsewere\x32 + (None) + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + 1033 + C:\elsewere\x64 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + (None) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + 0 + false + 0 + RELEASE;$(DCC_Define) + + + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + true + DEBUG;$(DCC_Define) + false + + + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + + + + + phpcon.dpr + + + File C:\Program Files (x86)\FastReports\LibD24\dclfrx24.bpl not found + File C:\Program Files (x86)\FastReports\LibD24\dclfrxDB24.bpl not found + File C:\Program Files (x86)\FastReports\LibD24\dclfrxe24.bpl not found + File C:\Program Files (x86)\FastReports\LibD24\dclfrxtee24.bpl not found + Embarcadero C++Builder Office 2000 Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + BCEditor Components + + + + False + True + True + + + + + true + + + + + true + + + + + true + + + + + true + + + + + phpcon.exe + true + + + + + 0 + .dll;.bpl + + + 1 + .dylib + + + + + Contents\Resources + 1 + + + + + classes + 1 + + + + + Contents\MacOS + 0 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + library\lib\mips + 1 + + + + + 1 + + + 1 + + + 0 + + + 1 + + + 1 + + + library\lib\armeabi-v7a + 1 + + + 1 + + + + + 0 + + + 1 + .framework + + + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + 1 + + + + + + library\lib\armeabi + 1 + + + + + 0 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-large + 1 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + res\drawable-hdpi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + + + Assets + 1 + + + Assets + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\values + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + res\drawable + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 0 + .bpl + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\drawable-ldpi + 1 + + + + + + + + + + + + + + 12 + + + + + diff --git a/Source/PHP.INC b/Source/PHP.INC index 6347b1e..2662f6d 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -12,8 +12,7 @@ { $Id: PHP.INC,v 7.4 10/2009 delphi32 Exp $ } {IMPORTANT: -If you are using PHP version 4.2.x...4.3.0 please change $DEFINE PHP433 to $DEFINE PHP430 -If you are using PHP version 5.0 please change $DEFINE PHP433 to $DEFINE PHP5 or remove it +If you are using PHP version 5.0 please add $DEFINE PHP5 If you are using PHP version 5.0.4 please add $DEFINE PHP504 If you are using PHP version 5.1.0 or higher please add $DEFINE PHP510 If you are using PHP version 5.1.1 or higher please add $DEFINE PHP511 @@ -36,15 +35,6 @@ Sorry for such complicated configuration, but PHP team does not keep backward compatibility between PHP versions. } - -{.$DEFINE PHP4} -{.$DEFINE PHP430} -{.$DEFINE PHP433} -{.$DEFINE PHP435} -{.$DEFINE PHP446} - -{If you are using PHP 4 please comment $DEFINE PHP5} - {PHP5 must be defined if you are using PHP5} {$DEFINE PHP5} @@ -62,9 +52,9 @@ backward compatibility between PHP versions. {$DEFINE ZEND_WIN32} {$DEFINE PHP_COMPILER_ID} {$ENDIF} -{$DEFINE soulengine_build} +{s$DEFINE soulengine_build} {.$DEFINE PHP7} -{.$DEFINE P_CUT} +{.$DEFINE CUTTED_PHP7dll} {$IFDEF PHP7} {$DEFINE COMPILER_VC14} {$DEFINE PHP560} @@ -86,20 +76,12 @@ backward compatibility between PHP versions. //problems {$IFDEF PHP_COMPILER_ID} - {.$DEFINE COMPILER_VC6} {$DEFINE COMPILER_VC9} {$IFNDEF PHP7} {$IFDEF PHP550} {$DEFINE COMPILER_VC11} {$ENDIF} {$ENDIF} {$ENDIF} -{$IFDEF PHP5} - {$UNDEF PHP4} - {$UNDEF PHP430} - {$UNDEF PHP433} - {$UNDEF PHP435} - {$UNDEF PHP446} -{$ENDIF} {$WARN UNIT_DEPRECATED OFF} {.$DEFINE QUIET_LOAD} //Do not show error while loading php4ts.dll or php5ts.dll (depends from php version) diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index 1f0cf58..d1a6baf 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -22,7 +22,7 @@ interface uses {Windows} SysUtils, - + VCL.Dialogs, {$IFDEF FPC} dynlibs {$ELSE} @@ -66,7 +66,7 @@ interface sapi_add_header_ex: function(header_line : zend_pchar; header_line_len : uint; duplicated : zend_bool; replace : zend_bool; TSRMLS_DC : pointer) : integer; cdecl; - php_execute_script : function (primary_file: pointer; TSRMLS_D : pointer) : Integer; cdecl; + php_execute_script : function (primary_file: PZendFileHandle; TSRMLS_D : pointer) : {$IFDEF CPUX64} Int64 {$ELSE} Integer{$ENDIF}; cdecl; php_handle_aborted_connection: procedure; cdecl; @@ -120,8 +120,10 @@ interface php_get_output_start_filename: function (TSRMLS_D : pointer) : zend_pchar; cdecl; php_get_output_start_lineno: function (TSRMLS_D : pointer) : integer; cdecl; php_ob_handler_used: function (handler_name : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; + {$IF not Defined(PHP540) and not Defined(PHP550) and not Defined(PHP560)} php_ob_init_conflict: function (handler_new : zend_pchar; handler_set : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; {$ENDIF} + {$ENDIF} //php_output.h @@ -175,7 +177,7 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; -{$IFNDEF P_CUT} +{$IFNDEF CUTTED_PHP7dll} php_log_err: procedure (err_msg : zend_pchar; TSRMLS_DC : pointer); cdecl; {$ENDIF} php_html_puts: procedure (str : zend_pchar; str_len : integer; TSRMLS_DC : pointer); cdecl; @@ -213,12 +215,7 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; php_raw_url_encode: function (s : zend_pchar; len : Integer; new_length : PInteger) : zend_pchar; cdecl; -{$IFDEF PHP5} php_register_extensions: function (ptr : PPzend_module_entry; count: integer; TSRMLS_DC: pointer) : integer; cdecl; -{$ELSE} -php_startup_extensions: function (ptr: pointer; count : integer) : integer; cdecl; -{$ENDIF} - php_error_docref0: procedure (const docref : zend_pchar; TSRMLS_DC : pointer; _type : integer; const Msg : zend_pchar); cdecl; php_error_docref: procedure (const docref : zend_pchar; TSRMLS_DC : pointer; _type : integer; const Msg : zend_pchar); cdecl; @@ -235,7 +232,7 @@ function GetEnvVariables : pzval; function GetFilesVariables : pzval; function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; -function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals; +//function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals; procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : zend_pchar; AHandler : pointer); @@ -246,15 +243,12 @@ procedure UnloadPHP; function PHPLoaded : boolean; -{$IFNDEF QUIET_LOAD} -procedure CheckPHPErrors; -{$ENDIF} - function FloatToValue(Value: Extended): zend_ustr; function ValueToFloat(Value : zend_ustr) : extended; var +//Info.h php_print_info: procedure (flag : Integer; TSRMLS_DC : pointer); cdecl; @@ -275,12 +269,14 @@ function ValueToFloat(Value : zend_ustr) : extended; php_info_print_table_row : procedure (n2 : integer; c1, c2 : zend_pchar); cdecl; php_info_print_table_end: procedure (); cdecl; - +{$IF Defined(PHP540) or Defined(PHP550) or Defined(PHP560)} +php_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; +{$ELSE} php_body_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; php_header_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; +{$ENDIF} - -php_header: function() : integer; cdecl; +php_header: function(TSRMLS_D: pointer) : integer; cdecl; php_setcookie: function (name : zend_pchar; name_len : integer; value : zend_pchar; value_len: integer; expires : longint; path : zend_pchar; path_len : integer; domain : zend_pchar; domain_len : integer; secure : integer; TSRMLS_DC : pointer) : integer; cdecl; @@ -310,49 +306,21 @@ function PHPLoaded : boolean; procedure UnloadPHP; var H : THandle; + vt: Integer; begin - H := InterlockedExchange(integer(PHPLib), 0); + vt := integer(PHPLib); + H := InterlockedExchange(vt, 0); if H > 0 then begin FreeLibrary(H); end; end; -{$IFDEF PHP4} -function GetSymbolsTable : PHashTable; -var - executor_globals : pointer; - executor_globals_value : integer; - executor_hash : PHashTable; - tsrmls_dc : pointer; -begin - if not PHPLoaded then - begin - Result := nil; - Exit; - end; - - executor_globals := GetProcAddress(PHPLib, 'executor_globals_id'); - executor_globals_value := integer(executor_globals^); - tsrmls_dc := tsrmls_fetch; - asm - mov ecx, executor_globals_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - add ecx, 0DCh - mov executor_hash, ecx - end; - Result := executor_hash; -end; -{$ELSE} function GetSymbolsTable : PHashTable; begin Result := @GetExecutorGlobals.symbol_table; end; -{$ENDIF} - function GetTrackHash(Name : zend_ustr) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; var data : ^ppzval; @@ -360,11 +328,7 @@ function GetTrackHash(Name : zend_ustr) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTa ret : integer; begin Result := nil; - {$IFDEF PHP4} arr := GetSymbolsTable; - {$ELSE} - arr := @GetExecutorGlobals.symbol_table; - {$ENDIF} if Assigned(Arr) then begin new(data); @@ -378,47 +342,19 @@ function GetTrackHash(Name : zend_ustr) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTa function GetSAPIGlobals : Psapi_globals_struct; -var - sapi_globals_value : integer; - sapi_globals : Psapi_globals_struct; - tsrmls_dc : pointer; begin Result := nil; if Assigned(sapi_globals_id) then - begin - tsrmls_dc := tsrmls_fetch; - sapi_globals_value := integer(sapi_globals_id^); - asm - mov ecx, sapi_globals_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov sapi_globals, ecx - end; - Result := sapi_globals; - end; + Result := __asm_fetchval(integer(sapi_globals_id^), tsrmls_fetch); end; function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; var sapi_global_id : pointer; - sapi_globals_value : integer; - sapi_globals : Psapi_globals_struct; - begin Result := nil; sapi_global_id := GetProcAddress(PHPLib, 'sapi_globals_id'); if Assigned(sapi_global_id) then - begin - sapi_globals_value := integer(sapi_global_id^); - asm - mov ecx, sapi_globals_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov sapi_globals, ecx - end; - Result := sapi_globals; - end; + Result := __asm_fetchval(integer(sapi_globals_id^), TSRMLS_DC); end; function GetStringOf(const V: TVarData): string; @@ -468,52 +404,21 @@ function GetStringOf(const V: TVarData): string; end; function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; -var - core_globals_value : integer; - core_globals : Pphp_core_globals; begin Result := nil; if Assigned(core_globals_id) then - begin - core_globals_value := integer(core_globals_id^); - asm - mov ecx, core_globals_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov core_globals, ecx - end; - Result := core_globals; - end; + Result := Pphp_Core_Globals(__asm_fetchval(integer(core_globals_id^), TSRMLS_DC)); end; - -function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals; -begin - result := GetPHPGlobals(TSRMLS_DC); -end; - - - - procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : zend_pchar; AHandler : pointer); begin AFunction.fname := AName; AFunction.handler := AHandler; - {$IFDEF PHP4} - AFunction.func_arg_types := nil; - {$ELSE} AFunction.arg_info := nil; - {$ENDIF} end; - -{procedure phperror(Error : zend_pchar); -begin - zend_error(E_PARSE, Error); -end; } {$IFDEF PHP540} //HERE @@ -544,322 +449,229 @@ function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; php_default_post_reader := GetProcAddress(PHPLib, 'php_default_post_reader'); - sapi_add_header_ex := GetProcAddress(PHPLib, 'sapi_add_header_ex'); + LFunc(@sapi_add_header_ex, 'sapi_add_header_ex'); - php_request_startup := GetProcAddress(PHPLib, 'php_request_startup'); + LFunc(@php_request_startup, 'php_request_startup'); - php_request_shutdown := GetProcAddress(PHPLib, 'php_request_shutdown'); + LFunc(@php_request_shutdown, 'php_request_shutdown'); - php_module_startup := GetProcAddress(PHPLib, 'php_module_startup'); + LFunc(@php_module_startup, 'php_module_startup'); - php_module_shutdown := GetProcAddress(PHPLib, 'php_module_shutdown'); + LFunc(@php_module_shutdown, 'php_module_shutdown'); - php_module_shutdown_wrapper := GetProcAddress(PHPLib, 'php_module_shutdown_wrapper'); + LFunc(@php_module_shutdown_wrapper, 'php_module_shutdown_wrapper'); - sapi_startup := GetProcAddress(PHPLib, 'sapi_startup'); + LFunc(@sapi_startup, 'sapi_startup'); - sapi_shutdown := GetProcAddress(PHPLib, 'sapi_shutdown'); + LFunc(@sapi_shutdown, 'sapi_shutdown'); - sapi_activate := GetProcAddress(PHPLib, 'sapi_activate'); + LFunc(@sapi_activate, 'sapi_activate'); - sapi_deactivate := GetProcAddress(PHPLib, 'sapi_deactivate'); + LFunc(@sapi_deactivate, 'sapi_deactivate'); - php_execute_script := GetProcAddress(PHPLib, 'php_execute_script'); + LFunc(@php_execute_script, 'php_execute_script'); - php_handle_aborted_connection := GetProcAddress(PHPLib, 'php_handle_aborted_connection'); + LFunc(@php_handle_aborted_connection, 'php_handle_aborted_connection'); - php_register_variable := GetProcAddress(PHPLib, 'php_register_variable'); + LFunc(@php_register_variable, 'php_register_variable'); - php_register_variable_safe := GetProcAddress(PHPLib, 'php_register_variable_safe'); + LFunc(@php_register_variable_safe, 'php_register_variable_safe'); - php_register_variable_ex := GetProcAddress(PHPLib, 'php_register_variable_ex'); + LFunc(@php_register_variable_ex, 'php_register_variable_ex'); - php_output_startup := GetProcAddress(PHPLib, 'php_output_startup'); + LFunc(@php_output_startup, 'php_output_startup'); - php_output_activate := GetProcAddress(PHPLib, 'php_output_activate'); + LFunc(@php_output_activate, 'php_output_activate'); - php_output_set_status := GetProcAddress(PHPLib, 'php_output_set_status'); + LFunc(@php_output_set_status, 'php_output_set_status'); - php_output_register_constants := GetProcAddress(PHPLib, 'php_output_register_constants'); + LFunc(@php_output_register_constants, 'php_output_register_constants'); {$IFDEF PHP540} - php_start_ob_buffer := GetProcAddress(PHPLib, 'php_output_start_user'); + LFunc(@php_start_ob_buffer, 'php_output_start_user'); - php_start_ob_buffer_named := GetProcAddress(PHPLib, 'php_output_start_internal'); + LFunc(@php_start_ob_buffer_named, 'php_output_start_internal'); - php_end_ob_buffer := GetProcAddress(PHPLib, 'php_output_end'); + LFunc(@php_end_ob_buffer, 'php_output_end'); - php_end_ob_buffers := GetProcAddress(PHPLib, 'php_output_end_all'); + LFunc(@php_end_ob_buffers, 'php_output_end_all'); - php_ob_get_buffer := GetProcAddress(PHPLib, 'php_output_get_contents'); + LFunc(@php_ob_get_buffer, 'php_output_get_contents'); - php_ob_get_length := GetProcAddress(PHPLib, 'php_output_get_length'); + LFunc(@php_ob_get_length, 'php_output_get_length'); - php_output_set_implicit_flush :=GetProcAddress(PHPLib, 'php_output_set_implicit_flush'); + LFunc(@php_output_set_implicit_flush, 'php_output_set_implicit_flush'); - php_get_output_start_filename := GetProcAddress(PHPLib, 'php_output_get_start_filename'); + LFunc(@php_get_output_start_filename, 'php_output_get_start_filename'); - php_get_output_start_lineno := GetProcAddress(PHPLib, 'php_output_get_start_lineno'); + LFunc(@php_get_output_start_lineno, 'php_output_get_start_lineno'); - php_output_handler_started := GetProcAddress(PHPLib, 'php_output_handler_started'); + LFunc(@php_output_handler_started, 'php_output_handler_started'); {$ELSE} - php_start_ob_buffer := GetProcAddress(PHPLib, 'php_start_ob_buffer'); + LFunc(@php_start_ob_buffer, 'php_start_ob_buffer'); - php_start_ob_buffer_named := GetProcAddress(PHPLib, 'php_start_ob_buffer_named'); + php_start_ob_buffer_named, 'php_start_ob_buffer_named'); - php_end_ob_buffer := GetProcAddress(PHPLib, 'php_end_ob_buffer'); + php_end_ob_buffer, 'php_end_ob_buffer'); - php_end_ob_buffers := GetProcAddress(PHPLib, 'php_end_ob_buffers'); + php_end_ob_buffers, 'php_end_ob_buffers'); - php_ob_get_buffer := GetProcAddress(PHPLib, 'php_ob_get_buffer'); + php_ob_get_buffer, 'php_ob_get_buffer'); - php_ob_get_length := GetProcAddress(PHPLib, 'php_ob_get_length'); + php_ob_get_length, 'php_ob_get_length'); - php_start_implicit_flush := GetProcAddress(PHPLib, 'php_start_implicit_flush'); + php_start_implicit_flush, 'php_start_implicit_flush'); - php_end_implicit_flush := GetProcAddress(PHPLib, 'php_end_implicit_flush'); + php_end_implicit_flush, 'php_end_implicit_flush'); - php_get_output_start_filename := GetProcAddress(PHPLib, 'php_get_output_start_filename'); + php_get_output_start_filename, 'php_get_output_start_filename'); - php_get_output_start_lineno := GetProcAddress(PHPLib, 'php_get_output_start_lineno'); + php_get_output_start_lineno, 'php_get_output_start_lineno'); - php_ob_handler_used := GetProcAddress(PHPLib, 'php_ob_handler_used'); + php_ob_handler_used, 'php_ob_handler_used'); {$ENDIF} + {$IF not Defined(PHP540) and not Defined(PHP550) and not Defined(PHP560)} + php_ob_init_conflict, 'php_ob_init_conflict'); + {$ENDIF} + LFunc(@php_strtoupper, 'php_strtoupper'); - php_ob_init_conflict := GetProcAddress(PHPLib, 'php_ob_init_conflict'); - - php_strtoupper := GetProcAddress(PHPLib, 'php_strtoupper'); - - php_strtolower := GetProcAddress(PHPLib, 'php_strtolower'); + LFunc(@php_strtolower,'php_strtolower'); - php_strtr := GetProcAddress(PHPLib, 'php_strtr'); + LFunc(@php_strtr, 'php_strtr'); - php_stripcslashes := GetProcAddress(PHPLib, 'php_stripcslashes'); + LFunc(@php_stripcslashes, 'php_stripcslashes'); - php_basename := GetProcAddress(PHPLib, 'php_basename'); + LFunc(@php_basename, 'php_basename'); - php_dirname := GetProcAddress(PHPLib, 'php_dirname'); + LFunc(@php_dirname, 'php_dirname'); - php_stristr := GetProcAddress(PHPLib, 'php_stristr'); + LFunc(@php_stristr, 'php_stristr'); - php_str_to_str := GetProcAddress(PHPLib, 'php_str_to_str'); + LFunc(@php_str_to_str, 'php_str_to_str'); - php_strip_tags := GetProcAddress(PHPLib, 'php_strip_tags'); + LFunc(@php_strip_tags, 'php_strip_tags'); - php_implode := GetProcAddress(PHPLib, 'php_implode'); + LFunc(@php_implode, 'php_implode'); - php_explode := GetProcAddress(PHPLib, 'php_explode'); + LFunc(@php_explode, 'php_explode'); - php_info_html_esc := GetProcAddress(PHPLib, 'php_info_html_esc'); + LFunc(@php_info_html_esc, 'php_info_html_esc'); - php_print_info_htmlhead := GetProcAddress(PHPLib, 'php_print_info_htmlhead'); + LFunc(@php_print_info_htmlhead, 'php_print_info_htmlhead'); - php_print_info := GetProcAddress(PHPLib, 'php_print_info'); + LFunc(@php_print_info, 'php_print_info'); - php_info_print_table_colspan_header := GetProcAddress(PHPLib, 'php_info_print_table_colspan_header'); + LFunc(@php_info_print_table_colspan_header, 'php_info_print_table_colspan_header'); - php_info_print_box_start := GetProcAddress(PHPLib, 'php_info_print_box_start'); + LFunc(@php_info_print_box_start, 'php_info_print_box_start'); - php_info_print_box_end := GetProcAddress(PHPLib, 'php_info_print_box_end'); + LFunc(@php_info_print_box_end, 'php_info_print_box_end'); - php_info_print_hr := GetProcAddress(PHPLib, 'php_info_print_hr'); + LFunc(@php_info_print_hr, 'php_info_print_hr'); - php_info_print_table_start := GetProcAddress(PHPLib, 'php_info_print_table_start'); + LFunc(@php_info_print_table_start, 'php_info_print_table_start'); - php_info_print_table_row1 := GetProcAddress(PHPLib, 'php_info_print_table_row'); + LFunc(@php_info_print_table_row1, 'php_info_print_table_row'); - php_info_print_table_row2 := GetProcAddress(PHPLib, 'php_info_print_table_row'); + LFunc(@php_info_print_table_row2, 'php_info_print_table_row'); - php_info_print_table_row3 := GetProcAddress(PHPLib, 'php_info_print_table_row'); + LFunc(@php_info_print_table_row3, 'php_info_print_table_row'); - php_info_print_table_row4 := GetProcAddress(PHPLib, 'php_info_print_table_row'); + LFunc(@php_info_print_table_row4, 'php_info_print_table_row'); - php_info_print_table_row := GetProcAddress(PHPLib, 'php_info_print_table_row'); + LFunc(@php_info_print_table_row, 'php_info_print_table_row'); - php_info_print_table_end := GetProcAddress(PHPLib, 'php_info_print_table_end'); - - php_body_write := GetProcAddress(PHPLib, 'php_body_write'); - - php_header_write := GetProcAddress(PHPLib, 'php_header_write'); - {$IFNDEF P_CUT} - php_log_err := GetProcAddress(PHPLib, 'php_log_err'); + LFunc(@php_info_print_table_end, 'php_info_print_table_end'); + {$IF Defined(PHP540) or Defined(PHP550) or Defined(PHP560)} + LFunc(@php_write, 'php_write' ); + {$ELSE} + LFunc(@php_body_write, 'php_body_write' ); + LFunc(@php_header_write, 'php_header_write'); {$ENDIF} - php_html_puts := GetProcAddress(PHPLib, 'php_html_puts'); - - _php_error_log := GetProcAddress(PHPLib, '_php_error_log'); - - php_print_credits := GetProcAddress(PHPLib, 'php_print_credits'); + {$IFNDEF CUTTED_PHP7dll} + LFunc(@php_log_err, 'php_log_err'); + {$ENDIF} + LFunc(@php_html_puts, 'php_html_puts'); - php_info_print_css := GetProcAddress(PHPLib, 'php_info_print_css'); + LFunc(@_php_error_log, '_php_error_log'); - php_set_sock_blocking := GetProcAddress(PHPLib, 'php_set_sock_blocking'); + LFunc(@php_print_credits, 'php_print_credits'); - php_copy_file := GetProcAddress(PHPLib, 'php_copy_file'); + LFunc(@php_info_print_css, 'php_info_print_css'); - {$IFDEF PHP4} - php_flock := GetProcAddress(PHPLib, 'php_flock'); - php_lookup_hostname := GetProcAddress(PHPLib, 'php_lookup_hostname'); - {$ENDIF} + LFunc(@php_set_sock_blocking, 'php_set_sock_blocking'); + LFunc(@php_copy_file, 'php_copy_file'); - php_header := GetProcAddress(PHPLib, 'php_header'); + LFunc(@php_header, 'php_header'); - php_setcookie := GetProcAddress(PHPLib, 'php_setcookie'); + LFunc(@php_setcookie, 'php_setcookie'); - php_escape_html_entities := GetProcAddress(PHPLib, 'php_escape_html_entities'); + LFunc(@php_escape_html_entities, 'php_escape_html_entities'); - php_ini_long := GetProcAddress(PHPLib, 'zend_ini_long'); + LFunc(@php_ini_long, 'zend_ini_long'); - php_ini_double := GetProcAddress(PHPLib, 'zend_ini_double'); + LFunc(@php_ini_double, 'zend_ini_double'); - php_ini_string := GetProcAddress(PHPLib, 'zend_ini_string'); + LFunc(@php_ini_string, 'zend_ini_string'); - php_url_free := GetProcAddress(PHPLib, 'php_url_free'); + LFunc(@php_url_free, 'php_url_free'); - php_url_parse := GetProcAddress(PHPLib, 'php_url_parse'); + LFunc(@php_url_parse, 'php_url_parse'); - php_url_decode := GetProcAddress(PHPLib, 'php_url_decode'); + LFunc(@php_url_decode, 'php_url_decode'); - php_raw_url_decode := GetProcAddress(PHPLib, 'php_raw_url_decode'); + LFunc(@php_raw_url_decode, 'php_raw_url_decode'); - php_url_encode := GetProcAddress(PHPLib, 'php_url_encode'); + LFunc(@php_url_encode, 'php_url_encode'); - php_raw_url_encode := GetProcAddress(PHPLib, 'php_raw_url_encode'); + LFunc(@php_raw_url_encode, 'php_raw_url_encode'); {$IFDEF PHP5} - php_register_extensions := GetProcAddress(PHPLib, 'php_register_extensions'); + LFunc(@php_register_extensions, 'php_register_extensions'); {$ELSE} - php_startup_extensions := GetProcAddress(PHPLib, 'php_startup_extensions'); + LFunc(@php_startup_extensions, 'php_startup_extensions'); {$ENDIF} - php_error_docref0 := GetProcAddress(PHPLib, 'php_error_docref0'); - - php_error_docref := GetProcAddress(PHPLib, 'php_error_docref0'); - - php_error_docref1 := GetProcAddress(PHPLib, 'php_error_docref1'); + LFunc(@php_error_docref0, 'php_error_docref0'); - php_error_docref2 := GetProcAddress(PHPLib, 'php_error_docref2'); + LFunc(@php_error_docref, 'php_error_docref0'); + LFunc(@php_error_docref1, 'php_error_docref1'); - - {$IFNDEF QUIET_LOAD} - CheckPHPErrors; - {$ENDIF} + LFunc(@php_error_docref2, 'php_error_docref2'); Result := true; end; - - -{$IFNDEF QUIET_LOAD} -procedure CheckPHPErrors; -begin - if @sapi_add_header_ex = nil then raise EPHP4DelphiException.Create('sapi_add_header_ex'); - if @php_request_startup = nil then raise EPHP4DelphiException.Create('php_request_startup'); - if @php_request_shutdown = nil then raise EPHP4DelphiException.Create('php_request_shutdown'); - if @php_module_startup = nil then raise EPHP4DelphiException.Create('php_module_startup'); - if @php_module_shutdown = nil then raise EPHP4DelphiException.Create('php_module_shutdown'); - if @php_module_shutdown_wrapper = nil then raise EPHP4DelphiException.Create('php_module_shutdown_wrapper'); - if @sapi_startup = nil then raise EPHP4DelphiException.Create('sapi_startup'); - if @sapi_shutdown = nil then raise EPHP4DelphiException.Create('sapi_shutdown'); - if @sapi_activate = nil then raise EPHP4DelphiException.Create('sapi_activate'); - if @sapi_deactivate = nil then raise EPHP4DelphiException.Create('sapi_deactivate'); - if @php_execute_script = nil then raise EPHP4DelphiException.Create('php_execute_script'); - if @php_handle_aborted_connection = nil then raise EPHP4DelphiException.Create('php_handle_aborted_connection'); - if @php_register_variable = nil then raise EPHP4DelphiException.Create('php_register_variable'); - if @php_register_variable_safe = nil then raise EPHP4DelphiException.Create('php_register_variable_safe'); - if @php_register_variable_ex = nil then raise EPHP4DelphiException.Create('php_register_variable_ex'); - if @php_strip_tags = nil then raise EPHP4DelphiException.Create('php_strip_tags'); - {$IFNDEF P_CUT} - if @php_log_err = nil then raise EPHP4DelphiException.Create('php_log_err'); - {$ENDIF} - if @php_html_puts = nil then raise EPHP4DelphiException.Create('php_html_puts'); - if @_php_error_log = nil then raise EPHP4DelphiException.Create('_php_error_log'); - if @php_print_credits = nil then raise EPHP4DelphiException.Create('php_print_credits'); - if @php_info_print_css = nil then raise EPHP4DelphiException.Create('php_info_print_css'); - if @php_set_sock_blocking = nil then raise EPHP4DelphiException.Create('php_set_sock_blocking'); - if @php_copy_file = nil then raise EPHP4DelphiException.Create('php_copy_file'); - - if @php_ini_long = nil then raise EPHP4DelphiException.Create('php_ini_long'); - if @php_ini_double = nil then raise EPHP4DelphiException.Create('php_ini_double'); - if @php_ini_string = nil then raise EPHP4DelphiException.Create('php_ini_string'); - if @php_url_free = nil then raise EPHP4DelphiException.Create('php_url_free'); - if @php_url_parse = nil then raise EPHP4DelphiException.Create('php_url_parse'); - if @php_url_decode = nil then raise EPHP4DelphiException.Create('php_url_decode'); - if @php_raw_url_decode = nil then raise EPHP4DelphiException.Create('php_raw_url_decode'); - if @php_url_encode = nil then raise EPHP4DelphiException.Create('php_url_encode'); - if @php_raw_url_encode = nil then raise EPHP4DelphiException.Create('php_raw_url_encode'); - - {$IFDEF PHP5} - if @php_register_extensions = nil then raise EPHP4DelphiException.Create('php_register_extensions'); - {$ELSE} - if @php_startup_extensions = nil then raise EPHP4DelphiException.Create('php_startup_extensions'); - {$ENDIF} - - if @php_error_docref0 = nil then raise EPHP4DelphiException.Create('php_error_docref0'); - if @php_error_docref = nil then raise EPHP4DelphiException.Create('php_error_docref'); - if @php_error_docref1 = nil then raise EPHP4DelphiException.Create('php_error_docref1'); - if @php_error_docref2 = nil then raise EPHP4DelphiException.Create('php_error_docref2'); -end; -{$ENDIF} - function GetPostVariables: pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[0]; + Result := GetPHPGlobals(ts_resource_ex(0, nil))^.http_globals[0]; end; function GetGetVariables : pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[1]; + Result := GetPHPGlobals(ts_resource_ex(0, nil))^.http_globals[1]; end; function GetServerVariables : pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[3]; + Result := GetPHPGlobals(ts_resource_ex(0, nil))^.http_globals[3]; end; function GetEnvVariables : pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[4]; + Result := GetPHPGlobals(ts_resource_ex(0, nil))^.http_globals[4]; end; function GetFilesVariables : pzval; -var - TSRMLS_D : pointer; - CoreGlobals : Pphp_Core_Globals; begin - TSRMLS_D := ts_resource_ex(0, nil); - CoreGlobals := PG(TSRMLS_D); - Result := CoreGlobals^.http_globals[5]; + Result := GetPHPGlobals(ts_resource_ex(0, nil))^.http_globals[5]; end; function FloatToValue(Value: Extended): zend_ustr; var - {$IFDEF VERSION12} - c: WideChar; - {$ELSE} - c: AnsiChar; - {$ENDIF} + c: CharPtr; begin c := FormatSettings.DecimalSeparator; try @@ -872,11 +684,7 @@ function FloatToValue(Value: Extended): zend_ustr; function ValueToFloat(Value : zend_ustr) : extended; var - {$IFDEF VERSION12} - c: WideChar; - {$ELSE} - c : AnsiChar; - {$ENDIF} + c: CharPtr; begin c := FormatSettings.DecimalSeparator; try diff --git a/Source/PHPCommon.pas b/Source/PHPCommon.pas index d594f7c..04369c1 100644 --- a/Source/PHPCommon.pas +++ b/Source/PHPCommon.pas @@ -272,11 +272,7 @@ function TPHPVariable.GetAsFloat: double; function TPHPVariable.GetAsInteger: integer; var - {$IFDEF VERSION12} - c : WideChar; - {$ELSE} - c : AnsiChar; - {$ENDIF} + c: CharPtr; begin c := FormatSettings.DecimalSeparator; try @@ -310,11 +306,7 @@ procedure TPHPVariable.SetAsFloat(const Value: double); procedure TPHPVariable.SetAsInteger(const Value: integer); var - {$IFDEF VERSION12} - c : WideChar; - {$ELSE} - c : AnsiChar; - {$ENDIF} + c: CharPtr; begin c := FormatSettings.DecimalSeparator; try diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index 8875c7f..80ceda8 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -168,7 +168,9 @@ function ZendTypeToString(_type : integer) : string; IS_BOOL : Result := 'IS_BOOL'; IS_RESOURCE : Result := 'IS_RESOURCE'; IS_CONSTANT : Result := 'IS_CONSTANT'; + {$IFNDEF PHP7} IS_CONSTANT_ARRAY : Result := 'IS_CONSTANT_ARRAY'; + {$ENDIF} end; end; @@ -389,7 +391,7 @@ procedure TFunctionParams.SetItem(Index: Integer; Value: TFunctionParam); procedure TFunctionParams.SetItemName(Item: TCollectionItem); var - I, J: Integer; + J: Integer; CurItem: TFunctionParam; begin J := 1; diff --git a/Source/PHPTypes.pas b/Source/PHPTypes.pas index 3d00f20..9fa22fe 100644 --- a/Source/PHPTypes.pas +++ b/Source/PHPTypes.pas @@ -18,13 +18,8 @@ interface uses {$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7} hzend_types {$ELSE} ZendTypes {$ENDIF}; -{$IFDEF PHP4} const - phpVersion = 4; -{$ELSE} -const - phpVersion = 5; -{$ENDIF} + phpVersion = {$IFDEF PHP7}7{$ELSE}5{$ENDIF}; const TRequestName : array [0..3] of zend_ustr = diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index accf608..7417590 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -20,6 +20,7 @@ interface uses +VCL.Dialogs, {$IFNDEF FPC} Windows{$ELSE} LCLType,LCLIntf,dynlibs,libc{$ENDIF}, SysUtils, {$IFDEF PHP7} hzend_types, {$ElSE} ZendTypes, {$ENDIF} Variants, PHPTypes; @@ -79,7 +80,15 @@ align_test = record {$IFNDEF PHP_UNICE} function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; {$ENDIF} +function Lfunc(var Func: Pointer; addr: LPCWSTR): Bool; function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; +function __asm_fetchval +{$IFDEF CPUX64} +(val_id: int64; tsrmls_dc_p: pointer) +{$ELSE} +(val_id: integer; tsrmls_dc_p: pointer) +{$ENDIF} +: pointer; procedure UnloadZEND; function ZENDLoaded: boolean; @@ -138,14 +147,7 @@ function STR_EMPTY_ALLOC : zend_pchar; zend_disable_function : function(function_name : zend_pchar; function_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; zend_disable_class : function(class_name : zend_pchar; class_name_length : uint; TSRMLS_DC : pointer) : integer; cdecl; - -{$IFDEF PHP4} - zend_hash_add_or_update : function(ht: PHashTable; arKey: zend_pchar; - nKeyLength: uint; pData: Pointer; nDataSize: uint; pDest: Pointer; - flag: Integer): Integer; cdecl; -{$ELSE} {$IFNDEF PHP7} -var _zend_hash_add_or_update : function (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDes : pointer; flag : integer; __zend_filename: zend_pchar; __zend_lineno: uint) : integer; cdecl; @@ -154,33 +156,10 @@ function STR_EMPTY_ALLOC : zend_pchar; nKeyLength : uint; pData : {$IFDEF PHP7}pzval{$ELSE}pointer{$ENDIF}; nDataSize : uint; pDes : pointer; flag : integer) : integer; cdecl; -{$ENDIF} function zend_hash_add(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey : zend_pchar; nKeyLength : uint; pData : pointer; nDataSize : uint; pDest : pointer) : integer; cdecl; var - {$IFDEF PHP4} - zend_hash_init : function(ht: PHashTable; nSize: uint; - pHashFunction: pointer; pDestructor: pointer; - persistent: Integer): Integer; cdecl; - - zend_hash_init_ex : function(ht: PHashTable; nSize: uint; - pHashFunction: pointer; pDestructor: pointer; - persistent: Integer; bApplyProtection: boolean): Integer; cdecl; - - - zend_hash_quick_add_or_update : function(ht: PHashTable; arKey: zend_pchar; - nKeyLength: uint; h: ulong; pData: Pointer; nDataSize: uint; - pDest: Pointer; flag: Integer): Integer; cdecl; - - zend_hash_index_update_or_next_insert : function(ht: PHashTable; h: ulong; - pData: Pointer; nDataSize: uint; pDest: Pointer; flag: Integer): Integer; cdecl; - - zend_hash_merge : procedure(target: PHashTable; source: PHashTable; - pCopyConstructor: pointer; tmp: Pointer; size: uint; overwrite: Integer); cdecl; - - {$ELSE} - _zend_hash_init : function (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent: zend_bool; __zend_filename: zend_pchar; __zend_lineno: uint) : integer; cdecl; @@ -193,8 +172,6 @@ function zend_hash_add(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; a function zend_hash_init_ex (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; nSize : uint; pHashFunction : pointer; pDestructor : pointer; persistent : zend_bool; bApplyProtection : zend_bool): integer; cdecl; - -{$ENDIF} {$IFDEF PHP7} function zend_hash_num_elements(ht: Pzend_array): integer; function add_char_to_string (_result: Pzval; op1: Pzval; op2: Pzval): Integer; @@ -313,25 +290,31 @@ function zend_hash_add(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; a function zend_hash_get_current_data(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; pData: Pointer): Integer; cdecl; procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}); cdecl; - +// zend_constants.h var zend_get_constant : function(name: zend_pchar; name_len: uint; var result: zval; - TSRMLS_DC: Pointer): Integer; cdecl; + TSRMLS_DC: Pointer): IntPtr; cdecl; + + zend_register_null_constant : procedure(name: zend_pchar; name_len: uint; + flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; + + zend_register_bool_constant : procedure(name: zend_pchar; name_len: uint; + bval: zend_bool; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; zend_register_long_constant : procedure(name: zend_pchar; name_len: uint; - lval: Longint; flags: Integer; module_number: Integer; TSRMLS_DC: Pointer); cdecl; + lval: Longint; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; - zend_register_double_constant : procedure(name: zend_pchar; name_len: uint; dval: Double; flags: Integer; module_number: Integer; - TSRMLS_DC: Pointer); cdecl; + zend_register_double_constant : procedure(name: zend_pchar; name_len: uint; + dval: Double; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; - zend_register_string_constant : procedure(name: zend_pchar; name_len: uint; strval: zend_pchar; flags: Integer; module_number: Integer; - TSRMLS_DC: Pointer); cdecl; + zend_register_string_constant : procedure(name: zend_pchar; name_len: uint; + strval: zend_pchar; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; zend_register_stringl_constant : procedure(name: zend_pchar; name_len: uint; - strval: zend_pchar; strlen: uint; flags: Integer; module_number: Integer; + strval: zend_pchar; strlen: uint; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; - zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): Integer; cdecl; + zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): IntPtr; cdecl; zend_register_auto_global : {$IFDEF PHP700} @@ -358,26 +341,21 @@ procedure REGISTER_MAIN_STRINGL_CONSTANT(name: zend_pchar; str: zend_pchar; len: // deallocates all occurrences of a given id ts_free_id : procedure(id: ts_rsrc_id); cdecl; - tsrm_shutdown : procedure(); cdecl; + tsrm_shutdown : procedure; cdecl; ts_resource_ex : function(id: integer; p: pointer): pointer; cdecl; ts_free_thread : procedure; cdecl; zend_error : procedure(ErrType: integer; ErrText: zend_pchar); cdecl; zend_error_cb : procedure; cdecl; - zend_eval_string : function(str: zend_pchar; val: pointer; strname: zend_pchar; tsrm: pointer): integer; cdecl; + zend_eval_string : function(str: zend_pchar; ret_val: pointer; strname: zend_pchar; tsrm: pointer): integer; cdecl; + zend_eval_string_ex : function(str:PAnsiChar; retval_ptr:pzval; string_name:PAnsiChar; handle_exceptions:longint):longint; cdecl; zend_make_compiled_string_description : function(a: zend_pchar; tsrm: pointer): zend_pchar; cdecl; - - {$IFDEF PHP4} - _zval_copy_ctor : function(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint): integer; cdecl; - _zval_dtor : procedure(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; - {$ELSE} _zval_copy_ctor_func : procedure(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; _zval_dtor_func : procedure(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; _zval_ptr_dtor: procedure(val: ppzval; __zend_filename: zend_pchar); cdecl; procedure _zval_copy_ctor (val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; procedure _zval_dtor(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; - {$ENDIF} var zend_print_variable : function(val: pzval): integer; cdecl; @@ -386,11 +364,6 @@ procedure REGISTER_MAIN_STRINGL_CONSTANT(name: zend_pchar; str: zend_pchar; len: zend_get_compiled_filename : function(TSRMLS_DC: Pointer): zend_pchar; cdecl; zend_get_compiled_lineno : function(TSRMLS_DC: Pointer): integer; cdecl; - -{$IFDEF PHP4} -function zval_copy_ctor(val : pzval) : integer; -{$ENDIF} - function ts_resource(id : integer) : pointer; function tsrmls_fetch : pointer; @@ -556,17 +529,17 @@ procedure convert_to_string(op: pzval); zend_html_putc : procedure(c: zend_uchar); cdecl; zend_html_puts : procedure(s: zend_pchar; len: uint; TSRMLS_DC: Pointer); cdecl; + + zend_parse_method_parameters:function(num_args:longint; TSRMLS_DC:Pointer; this_ptr:Pzval; type_spec:PAnsiChar):longint; cdecl varargs; + + zend_parse_method_parameters_ex:function(flags:longint; num_args:longint; TSRMLS_DC:Pointer; this_ptr:Pzval; type_spec:PAnsiChar):longint; cdecl varargs; + {$IFDEF PHP7} zend_parse_parameters_throw : function(num_args:longint; type_spec:PAnsiChar):longint; cdecl varargs; {$ELSE} zend_indent : procedure; cdecl; {$ENDIF} - ZendGetParameters : - {$IFDEF PHP7} - function(ht:longint; param_count:longint):longint; cdecl varargs; - {$ELSE} - function: integer; cdecl; - {$ENDIF} + Zend_Get_Parameters : function(ht:longint; param_count:longint):longint; cdecl varargs; zend_get_params_ex : {$IFDEF PHP7} function(param_count:longint):longint; cdecl varargs; @@ -577,15 +550,11 @@ procedure convert_to_string(op: pzval); ZvalGetArgs: function(Count: Integer; Args: ppzval): Integer;cdecl varargs; _zend_get_parameters_array_ex:function(param_count:longint; argument_array:Pzval):longint; cdecl; {$ELSE} + _zend_get_parameters_array: function(ht: integer; param_count:longint; argument_array: ppzval; TSRMLS_DC: pointer): integer; cdecl; _zend_get_parameters_array_ex : function(param_count: integer; argument_array: pppzval; TSRMLS_CC: pointer): integer; cdecl; {$ENDIF} -function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; -{$IFNDEF PHP7} -function zend_get_parameters(ht: integer; param_count: integer; Params: array of -ppzval): integer; -{$ENDIF} procedure dispose_pzval_array(Params: pzval_array); @@ -614,21 +583,8 @@ procedure dispose_pzval_array(Params: pzval_array); zend_wrong_param_count : procedure(TSRMLS_D: pointer); cdecl; _zend_hash_quick_add_or_update:function(ht: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; arKey: zend_pchar; nKeyLength: uint; h: uint; out pData: pzval; nDataSize: uint; pDest: PPointer; flag: Integer) : Integer; cdecl; - {$IFDEF PHP4} - add_property_long_ex : function(arg: pzval; key: zend_pchar; key_len: uint; l: longint): integer; cdecl; - {$ELSE} add_property_long_ex : function(arg: pzval; key: zend_pchar; key_len: uint; l: longint; TSRMLS_DC : pointer): integer; cdecl; - {$ENDIF} - {$IFDEF PHP4} - add_property_null_ex : function(arg: pzval; key: zend_pchar; key_len: uint): integer; cdecl; - add_property_bool_ex : function(arg: pzval; key: zend_pchar; key_len: uint; b: integer): integer; cdecl; - add_property_resource_ex : function(arg: pzval; key: zend_pchar; key_len: uint; r: integer): integer; cdecl; - add_property_double_ex : function(arg: pzval; key: zend_pchar; key_len: uint; d: double): integer; cdecl; - add_property_string_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; duplicate: integer): integer; cdecl; - add_property_stringl_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; len: uint; duplicate: integer): integer; cdecl; - add_property_zval_ex : function(arg: pzval; key: zend_pchar; key_len: uint; value: pzval): integer; cdecl; - {$ELSE} add_property_null_ex : function(arg: pzval; key: zend_pchar; key_len: uint; TSRMLS_DC: Pointer): integer; cdecl; add_property_bool_ex : function(arg: pzval; key: zend_pchar; key_len: uint; b: integer; TSRMLS_DC: Pointer): integer; cdecl; add_property_resource_ex : function(arg: pzval; key: zend_pchar; key_len: uint; r: integer; TSRMLS_DC: Pointer): integer; cdecl; @@ -636,9 +592,8 @@ procedure dispose_pzval_array(Params: pzval_array); add_property_string_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; add_property_stringl_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; len: uint; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; add_property_zval_ex : function(arg: pzval; key: zend_pchar; key_len: uint; value: pzval; TSRMLS_DC: Pointer): integer; cdecl; - {$ENDIF} - {$IFDEF P_CUT} + {$IFDEF CUTTED_PHP7dll} call_user_function : procedure(func:pzval; argv:pzval; argc:integer);cdecl; {$ELSE} call_user_function : function(function_table: PHashTable; object_pp: pzval; @@ -651,17 +606,6 @@ procedure dispose_pzval_array(Params: pzval_array); no_separation: zend_uint; symbol_table: PHashTable; TSRMLS_DC: Pointer): integer; cdecl; {$ENDIF} - { -call_user_function_ex(HashTable *function_table, - zval **object_pp, - zval *function_name, - zval **retval_ptr_ptr, - zend_uint param_count, - zval **params[], - int no_separation, - HashTable *symbol_table - TSRMLS_DC); -} add_assoc_long_ex : function(arg: pzval; key: zend_pchar; key_len: uint; n: longint): integer; cdecl; @@ -701,17 +645,9 @@ procedure dispose_pzval_array(Params: pzval_array); _array_init : function(arg: pzval; __zend_filename: zend_pchar; __zend_lineno: uint): integer; cdecl; - {$IFDEF PHP4} - _object_init : function(arg: pzval; __zend_filename: zend_pchar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; - {$ELSE} _object_init : function(arg: pzval;TSRMLS_DC: pointer): integer; cdecl; - {$ENDIF} - {$IFDEF PHP4} - _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_filename: zend_pchar; __zend_lineno: uint; TSRMLS_DC: pointer) : integer; cdecl; - {$ELSE} _object_init_ex : function (arg: pzval; ce: pzend_class_entry; __zend_lineno : integer; TSRMLS_DC : pointer) : integer; cdecl; - {$ENDIF} _object_and_properties_init : function(arg: pzval; ce: pointer; properties: phashtable; __zend_filename: zend_pchar; __zend_lineno: uint; TSRMLS_DC: pointer): integer; cdecl; @@ -823,7 +759,11 @@ procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: zend_pchar; functions: {$IFDEF PHP7}HashTable{$ELSE}pointer{$ENDIF}); - +procedure zend_copy_constant(c: zend_constant); +{$IF defined(PHP540) or defined(PHP550) or defined(PHP560)} +procedure zend_copy_constants(target: PHashTable; source: PHashTable); cdecl; +procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; +{$ENDIF} var get_zend_version : function(): zend_pchar; cdecl; @@ -833,33 +773,26 @@ procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: z zend_output_debug_string : procedure(trigger_break: boolean; Msg: zend_pchar); cdecl; {$IFDEF PHP5} + {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} zend_copy_constants: procedure(target: PHashTable; source: PHashTable); cdecl; + {$ENDIF} zend_objects_new : function (_object : pointer; class_type : pointer; TSRMLS_DC : pointer) : {$IFDEF PHP7}zend_object{$ELSE}_zend_object_value{$ENDIF}; cdecl; zend_objects_clone_obj: function(_object: pzval; TSRMLS_DC : pointer): {$IFDEF PHP7}zend_object{$ELSE}_zend_object_value{$ENDIF}; cdecl; zend_objects_store_add_ref: procedure (_object : pzval; TSRMLS_DC : pointer); cdecl; zend_objects_store_del_ref: procedure (_object : pzval; TSRMLS_DC : pointer); cdecl; function_add_ref: procedure (func: {$IFDEF PHP7}Pzend_function{$ELSE}PZendFunction{$ENDIF}); cdecl; - + {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} zend_class_add_ref: procedure(aclass: Ppzend_class_entry); cdecl; - + {$ENDIF} {$ENDIF} - +{$IFNDEF COMPILER_VC9} const MSCRT = 'msvcrt.dll'; //Microsoft C++ functions - -{$IFDEF PHP4} -function pipe(phandles : pointer; psize : uint; textmode : integer) : integer; cdecl; external MSCRT name '_pipe'; -procedure close(AHandle : THandle); cdecl; external MSCRT name '_close'; -function _write(AHandle : integer; ABuffer : pointer; count : uint) : integer; cdecl; external MSCRT name '_write'; -function setjmp(buf : jump_buf) : integer; cdecl; external MSCRT name '_setjmp3'; -{$ENDIF} - -{$IFNDEF COMPILER_VC9} function strdup(strSource : zend_pchar) : zend_pchar; cdecl; external MSCRT name '_strdup'; {$ELSE} function DupStr(strSource : zend_pchar) : zend_pchar; cdecl; @@ -872,9 +805,6 @@ procedure ALLOC_ZVAL(out Result: pzval); overload; procedure INIT_PZVAL(p: pzval); function MAKE_STD_ZVAL: pzval; overload; procedure MAKE_STD_ZVAL(out Result: pzval); overload; -{$IFNDEF QUIET_LOAD} -procedure CheckZendErrors; -{$ENDIF} var PHPLib : THandle = 0; @@ -899,18 +829,22 @@ function zend_unregister_functions(functions : {$IFDEF PHP7}P_zend_function_entr zend_is_true : function(z : pzval) : integer; cdecl; function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : integer; cdecl; assembler; - function Z_LVAL(z : Pzval) : longint; function Z_BVAL(z : Pzval) : boolean; function Z_DVAL(z : Pzval) : double; function Z_STRVAL(z : Pzval) : zend_ustr; function Z_STRUVAL(z : PZval): UTF8String; function Z_STRWVAL(z : pzval) : String; +function Z_CHAR(z: PZval) : zend_uchar; +function Z_WCHAR(z: PZval) : WideChar; +function Z_ACHAR(z: PZVAL): AnsiChar; +function Z_UCHAR(z: PZVAL): UTF8Char; + function Z_STRLEN(z : Pzval) : longint; function Z_ARRVAL(z : Pzval ) : PHashTable; function Z_OBJ_HANDLE(z :Pzval) : {$IFDEF PHP7} P_zend_object_handlers {$ELSE} zend_object_handle{$ENDIF}; function Z_OBJ_HT(z : Pzval) : {$IFDEF PHP7}P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF}; -function Z_OBJPROP(z : Pzval) : PHashTable; +function Z_OBJPROP(z : Pzval;TSRMLS_DC:pointer=nil) : PHashTable; function Z_VARREC(z: pzval): TVarRec; procedure zend_addref_p(z: pzval); cdecl; @@ -1580,7 +1514,7 @@ function toWChar(s: zend_pchar): PWideChar; function HashToVarArray(const Value:{$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}): Variant; Var Len,I: Integer; - tmp : pppzval; + {$IFDEF PHP7}tmp : pzval;{$ELSE}tmp : pppzval;{$ENDIF} begin len := zend_hash_num_elements(Value); Result := VarArrayCreate([0, len - 1], varVariant); @@ -1611,21 +1545,30 @@ function ZendToVariant(const Value: pzval; S: String; begin case {$IFDEF PHP7} Value^.u1.v._type {$ELSE}Value^._type{$ENDIF} of - 0: Result := Null; - 1: Result := Value^.value.lval; - 2: Result := Value^.value.dval; - 3: Result := boolean(Value^.value.lval); - 4: Result := HashToVarArray(Value^.value.ht); - 5: + 0: Result := Null; //Null + 1: Result := Value^.value.lval; //LongInt -> Integer + 2: Result := Value^.value.dval; //Double + 3: Result := boolean(Value^.value.lval); //Boolean + {$IFDEF PHP7} + 4: Result := HashToVarArray(Value^.value.arr);//Array + {$ELSE} + 4: Result := HashToVarArray(Value^.value.ht);//Array + {$ENDIF} + 5: //Object if Assigned(cobj) then Result := cobj(Value) else - Result := Null; - 7: Result := Value^.value.lval; + Result := Null; //String 6: begin S := Value^.value.str.val; Result := S; end; + 7: Result := Value^.value.lval; //Resource + //Constant 8: begin S := Value^.value.str.val; Result := S; end; - 9: Result := HashToVarArray(Value^.value.ht) - else Result := Null; + {$IFDEF PHP7} + 9: Result := HashToVarArray(Value^.value.arr) //Constant Array + {$ELSE} + 9: Result := HashToVarArray(Value^.value.ht) //Constant Array + {$ENDIF} + else Result := Null; //Unknown/undefined end; end; @@ -2255,15 +2198,46 @@ function ZENDLoaded: boolean; procedure UnloadZEND; var H : THandle; + t: Integer; begin - H := InterlockedExchange(Integer(PHPLib), 0); + t := Integer(PHPLib); + H := InterlockedExchange(t, 0); if H > 0 then begin FreeLibrary(H); end; end; +function Lfunc(var Func: Pointer; addr: LPCWSTR): BOOL; +begin + Result := True; + Func := GetProcAddress(PHPLib, addr); + if Func = nil then + begin + {$IFNDEF QUIET_LOAD} + raise EPHP4DelphiException.Create(addr); + {$ENDIF} + Result := False; + end; +end; +procedure zend_copy_constant(c: zend_constant); +begin + c.name := zend_strndup(c.name, c.name_len - 1); + if (c.flags and CONST_PERSISTENT) = 0 then + _zval_copy_ctor_func(@c.value, '', 0); +end; +{$IF defined(PHP540) or defined(PHP550) or defined(PHP560)} +procedure zend_copy_constants(target: PHashTable;source: PHashTable); +var tmp: zend_constant; +begin + zend_hash_copy(target, source, @zend_copy_constant, @tmp, sizeof(zend_constant)); +end; +procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; +begin + Inc(aclass^.refcount,1); +end; +{$ENDIF} function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; var WriteFuncPtr : pointer; @@ -2271,7 +2245,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$IFDEF QUIET_LOAD} Result := false; {$ENDIF} - PHPLib := {$IFDEF PHP_UNICE}LoadLibrary( PWideChar(WideString(DllFilename)) ){$ELSE}LoadLibraryA(zend_pchar(DllFileName)){$ENDIF}; + PHPLib := LoadLibrary( PWideChar(WideString(DllFilename)) ); {$IFNDEF QUIET_LOAD} if PHPLib = 0 then @@ -2284,53 +2258,57 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$ENDIF} {$IFDEF PHP5} - zend_copy_constants := GetProcAddress(PHPLib, 'zend_copy_constants'); - zend_objects_new := GetProcAddress(PHPLib, 'zend_objects_new'); - zend_objects_clone_obj := GetProcAddress(PHPLib, 'zend_objects_clone_obj'); - function_add_ref := GetProcAddress(PHPLib, 'function_add_ref'); - zend_class_add_ref := GetProcAddress(PHPLib, 'zend_class_add_ref'); - - zend_objects_store_add_ref := GetProcAddress(PHPLib, 'zend_objects_store_add_ref'); - zend_objects_store_del_ref := GetProcAddress(PHPLib, 'zend_objects_store_del_ref'); - - zend_get_std_object_handlers := GetProcAddress(PHPLib, 'zend_get_std_object_handlers'); - zend_objects_get_address := GetProcAddress(PHPLib, 'zend_objects_get_address'); - zend_is_true := GetProcAddress(PHPLib, 'zend_is_true'); + {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} + LFunc(@zend_copy_constants, 'zend_copy_constants'); + {$ENDIF} + LFunc(@zend_objects_new, 'zend_objects_new'); + LFunc(@zend_objects_clone_obj, 'zend_objects_clone_obj'); + LFunc(@function_add_ref, 'function_add_ref'); + {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} + LFunc(@zend_class_add_ref, 'zend_class_add_ref'); + {$ENDIF} + + LFunc(@zend_objects_store_add_ref, 'zend_objects_store_add_ref'); + LFunc(@zend_objects_store_del_ref, 'zend_objects_store_del_ref'); + + LFunc(@zend_get_std_object_handlers, 'zend_get_std_object_handlers'); + LFunc(@zend_objects_get_address, 'zend_objects_get_address'); + LFunc(@zend_is_true, 'zend_is_true'); {$ENDIF} - _zend_bailout := GetProcAddress(PHPLib, '_zend_bailout'); + LFunc(@_zend_bailout, '_zend_bailout'); - zend_disable_function := GetProcAddress(PHPLib, 'zend_disable_function'); - zend_disable_class := GetProcAddress(PHPLib, 'zend_disable_class'); - zend_register_list_destructors_ex := GetProcAddress(PHPLib, 'zend_register_list_destructors_ex'); - zend_register_resource := GetProcAddress(PHPLib, 'zend_register_resource'); - zend_fetch_resource := GetProcAddress(PHPLib, 'zend_fetch_resource'); - zend_list_insert := GetProcAddress(PHPLib, 'zend_list_insert'); + LFunc(@zend_disable_function, 'zend_disable_function'); + LFunc(@zend_disable_class, 'zend_disable_class'); + LFunc(@zend_register_list_destructors_ex, 'zend_register_list_destructors_ex'); + LFunc(@zend_register_resource, 'zend_register_resource'); + LFunc(@zend_fetch_resource, 'zend_fetch_resource'); + LFunc(@zend_list_insert, 'zend_list_insert'); {$IFNDEF PHP7} - _zend_list_addref := GetProcAddress(PHPLib, '_zend_list_addref'); - _zend_list_delete := GetProcAddress(PHPLib, '_zend_list_delete'); - _zend_list_find := GetProcAddress(PHPLib, '_zend_list_find'); + LFunc(@_zend_list_addref, '_zend_list_addref'); + LFunc(@_zend_list_delete, '_zend_list_delete'); + LFunc(@_zend_list_find, '_zend_list_find'); {$ENDIF} - zend_rsrc_list_get_rsrc_type := GetProcAddress(PHPLib, 'zend_rsrc_list_get_rsrc_type'); - zend_fetch_list_dtor_id := GetProcAddress(PHPLib, 'zend_fetch_list_dtor_id'); + LFunc(@zend_rsrc_list_get_rsrc_type, 'zend_rsrc_list_get_rsrc_type'); + LFunc(@zend_fetch_list_dtor_id, 'zend_fetch_list_dtor_id'); - zend_get_compiled_filename := GetProcAddress(PHPLib, 'zend_get_compiled_filename'); + LFunc(@zend_get_compiled_filename, 'zend_get_compiled_filename'); - zend_get_compiled_lineno := GetProcAddress(PHPLib, 'zend_get_compiled_lineno'); + LFunc(@zend_get_compiled_lineno, 'zend_get_compiled_lineno'); - zend_ini_deactivate := GetProcAddress(PHPLib, 'zend_ini_deactivate'); + LFunc(@zend_ini_deactivate, 'zend_ini_deactivate'); // -- tsrm_startup - tsrm_startup := GetProcAddress(PHPLib, 'tsrm_startup'); + LFunc(@tsrm_startup, 'tsrm_startup'); // -- ts_allocate_id - ts_allocate_id := GetProcAddress(PHPLib, 'ts_allocate_id'); + LFunc(@ts_allocate_id, 'ts_allocate_id'); // -- ts_free_id - ts_free_id := GetProcAddress(PHPLib, 'ts_free_id'); + LFunc(@ts_free_id, 'ts_free_id'); // -- zend_strndup - zend_strndup := GetProcAddress(PHPLib, + LFunc(@zend_strndup, {$IFNDEF PHP7} 'zend_strndup' {$ELSE} @@ -2338,7 +2316,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$ENDIF}); // -- _emalloc - _emalloc := GetProcAddress(PHPLib, + LFunc(@_emalloc, {$IFNDEF PHP7} '_emalloc' {$ELSE} @@ -2347,7 +2325,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; // -- _efree - _efree := GetProcAddress(PHPLib, + LFunc(@_efree, {$IFNDEF PHP7} '_efree' {$ELSE} @@ -2356,7 +2334,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; // -- _ecalloc - _ecalloc := GetProcAddress(PHPLib, + LFunc(@_ecalloc, {$IFNDEF PHP7} '_ecalloc' {$ELSE} @@ -2365,7 +2343,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; // -- _erealloc - _erealloc := GetProcAddress(PHPLib, + LFunc(@_erealloc, {$IFNDEF PHP7} '_erealloc' {$else} @@ -2374,7 +2352,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; // -- _estrdup - _estrdup := GetProcAddress(PHPLib, + LFunc(@_estrdup, {$IFNDEF PHP7} '_estrdup' {$ELSE} @@ -2382,7 +2360,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$ENDIF}); // -- _estrndup - _estrndup := GetProcAddress(PHPLib, + LFunc(@_estrndup, {$IFNDEF PHP7} '_estrndup' {$ELSE} @@ -2390,7 +2368,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$ENDIF}); // -- _estrndup Unicode - _estrndupu := GetProcAddress(PHPLib, + LFunc(@_estrndupu, {$IFNDEF PHP7} '_estrndup' {$ELSE} @@ -2398,657 +2376,634 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$ENDIF}); // -- zend_set_memory_limit - zend_set_memory_limit := GetProcAddress(PHPLib, 'zend_set_memory_limit'); + LFunc(@zend_set_memory_limit, 'zend_set_memory_limit'); // -- start_memory_manager - start_memory_manager := GetProcAddress(PHPLib, 'start_memory_manager'); + LFunc(@start_memory_manager, 'start_memory_manager'); // -- shutdown_memory_manager - shutdown_memory_manager := GetProcAddress(PHPLib, 'shutdown_memory_manager'); - - {$IFDEF PHP4} - // -- zend_hash_init - zend_hash_init := GetProcAddress(PHPLib, 'zend_hash_init'); + LFunc(@shutdown_memory_manager, 'shutdown_memory_manager'); - // -- zend_hash_init_ex - zend_hash_init_ex := GetProcAddress(PHPLib, 'zend_hash_init_ex'); + LFunc(@_zend_hash_init, '_zend_hash_init'); + LFunc(@_zend_hash_init_ex, '_zend_hash_init_ex'); - // -- zend_hash_quick_add_or_update - zend_hash_quick_add_or_update := GetProcAddress(PHPLib, 'zend_hash_quick_add_or_update'); - - // -- zend_hash_index_update_or_next_insert - zend_hash_index_update_or_next_insert := GetProcAddress(PHPLib, 'zend_hash_index_update_or_next_insert'); - - // -- zend_hash_merge - zend_hash_merge := GetProcAddress(PHPLib, 'zend_hash_merge'); - {$ELSE} - _zend_hash_init := GetProcAddress(PHPLib, '_zend_hash_init'); - _zend_hash_init_ex := GetProcAddress(PHPLib, '_zend_hash_init_ex'); - - {$ENDIF} - - {$IFDEF PHP4} // -- zend_hash_add_or_update - zend_hash_add_or_update := GetProcAddress(PHPLib, 'zend_hash_add_or_update'); - {$ELSE} - // -- zend_hash_add_or_update - _zend_hash_add_or_update := GetProcAddress(PHPLib, + LFunc(@_zend_hash_add_or_update, {$IFDEF PHP7}'_zend_hash_add_or_update@@16'{$ELSE}'_zend_hash_add_or_update'{$ENDIF}); - {$ENDIF} // -- zend_hash_destroy - zend_hash_destroy := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_destroy@@4'{$ELSE}'zend_hash_destroy'{$ENDIF}); + LFunc(@zend_hash_destroy, {$IFDEF PHP7}'zend_hash_destroy@@4'{$ELSE}'zend_hash_destroy'{$ENDIF}); // -- zend_hash_clean - zend_hash_clean := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_clean@@4'{$ELSE}'zend_hash_clean'{$ENDIF}); + LFunc(@zend_hash_clean, {$IFDEF PHP7}'zend_hash_clean@@4'{$ELSE}'zend_hash_clean'{$ENDIF}); // -- zend_hash_add_empty_element - zend_hash_add_empty_element := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_add_empty_element@@8'{$ELSE}'zend_hash_add_empty_element'{$ENDIF}); + LFunc(@zend_hash_add_empty_element, {$IFDEF PHP7}'zend_hash_add_empty_element@@8'{$ELSE}'zend_hash_add_empty_element'{$ENDIF}); // -- zend_hash_graceful_destroy - zend_hash_graceful_destroy := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_graceful_destroy@@4'{$ELSE}'zend_hash_graceful_destroy'{$ENDIF}); + LFunc(@zend_hash_graceful_destroy, {$IFDEF PHP7}'zend_hash_graceful_destroy@@4'{$ELSE}'zend_hash_graceful_destroy'{$ENDIF}); // -- zend_hash_graceful_reverse_destroy - zend_hash_graceful_reverse_destroy := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_graceful_reverse_destroy@@4'{$ELSE}'zend_hash_graceful_reverse_destroy'{$ENDIF}); + LFunc(@zend_hash_graceful_reverse_destroy, {$IFDEF PHP7}'zend_hash_graceful_reverse_destroy@@4'{$ELSE}'zend_hash_graceful_reverse_destroy'{$ENDIF}); // -- zend_hash_apply - zend_hash_apply := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_apply@@8'{$ELSE}'zend_hash_apply'{$ENDIF}); + LFunc(@zend_hash_apply, {$IFDEF PHP7}'zend_hash_apply@@8'{$ELSE}'zend_hash_apply'{$ENDIF}); // -- zend_hash_apply_with_argument - zend_hash_apply_with_argument := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_apply_with_argument@@12'{$ELSE}'zend_hash_apply_with_argument'{$ENDIF}); + LFunc(@zend_hash_apply_with_argument, {$IFDEF PHP7}'zend_hash_apply_with_argument@@12'{$ELSE}'zend_hash_apply_with_argument'{$ENDIF}); // -- zend_hash_reverse_apply - zend_hash_reverse_apply := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_reverse_apply@@8'{$ELSE}'zend_hash_reverse_apply'{$ENDIF}); + LFunc(@zend_hash_reverse_apply, {$IFDEF PHP7}'zend_hash_reverse_apply@@8'{$ELSE}'zend_hash_reverse_apply'{$ENDIF}); // -- zend_hash_del_key_or_index - zend_hash_del_key_or_index := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_del@@8'{$ELSE}'zend_hash_del_key_or_index'{$ENDIF}); + LFunc(@zend_hash_del_key_or_index, {$IFDEF PHP7}'zend_hash_del@@8'{$ELSE}'zend_hash_del_key_or_index'{$ENDIF}); // -- zend_get_hash_value - zend_get_hash_value := GetProcAddress(PHPLib, + LFunc(@zend_get_hash_value, {$IFDEF PHP560}'zend_hash_func'{$ELSE}'zend_get_hash_value'{$ENDIF}); // -- zend_hash_find - zend_hash_find := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_find@@8'{$ELSE}'zend_hash_find'{$ENDIF}); + LFunc(@zend_hash_find, {$IFDEF PHP7}'zend_hash_find@@8'{$ELSE}'zend_hash_find'{$ENDIF}); // -- zend_hash_quick_find - zend_hash_quick_find := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_find@@8'{$ELSE}'zend_hash_quick_find'{$ENDIF}); + LFunc(@zend_hash_quick_find, {$IFDEF PHP7}'zend_hash_find@@8'{$ELSE}'zend_hash_quick_find'{$ENDIF}); // -- zend_hash_index_find - zend_hash_index_find := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_index_find@@8'{$ELSE}'zend_hash_index_find'{$ENDIF}); + LFunc(@zend_hash_index_find, {$IFDEF PHP7}'zend_hash_index_find@@8'{$ELSE}'zend_hash_index_find'{$ENDIF}); // -- zend_hash_exists - zend_hash_exists := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_exists@@8'{$ELSE}'zend_hash_exists'{$ENDIF}); + LFunc(@zend_hash_exists, {$IFDEF PHP7}'zend_hash_exists@@8'{$ELSE}'zend_hash_exists'{$ENDIF}); // -- zend_hash_index_exists - zend_hash_index_exists := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_index_exists@@8'{$ELSE}'zend_hash_index_exists'{$ENDIF}); + LFunc(@zend_hash_index_exists, {$IFDEF PHP7}'zend_hash_index_exists@@8'{$ELSE}'zend_hash_index_exists'{$ENDIF}); {$IFDEF PHP7} - _zend_hash_add_or_update := GetProcAddress(PHPLib, '_zend_hash_add_or_update@@16'); - _zend_hash_add := GetProcAddress(PHPLib, '_zend_hash_add@@12'); - {$IFDEF P_CUT} - zend_hash_index_findZval := GetProcAddress(PHPLib,'zend_hash_index_findZval'); - zend_symtable_findTest := GetProcAddress(PHPLib,'zend_symtable_findTest'); - zend_hash_index_existsZval := GetProcAddress(PHPLib,'zend_hash_index_existsZval'); + LFunc(@_zend_hash_add_or_update, '_zend_hash_add_or_update@@16'); + LFunc(@_zend_hash_add, '_zend_hash_add@@12'); + {$IFDEF CUTTED_PHP7dll} + LFunc(@zend_hash_index_findZval,'zend_hash_index_findZval'); + LFunc(@zend_symtable_findTest,'zend_symtable_findTest'); + LFunc(@zend_hash_index_existsZval,'zend_hash_index_existsZval'); {$ENDIF} {$ELSE} // -- zend_hash_next_free_element - zend_hash_next_free_element := GetProcAddress(PHPLib, 'zend_hash_next_free_element'); + LFunc(@zend_hash_next_free_element, 'zend_hash_next_free_element'); {$ENDIF} // -- zend_hash_move_forward_ex - zend_hash_move_forward_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_move_forward_ex@@8'{$ELSE}'zend_hash_move_forward_ex'{$ENDIF}); + LFunc(@zend_hash_move_forward_ex, {$IFDEF PHP7}'zend_hash_move_forward_ex@@8'{$ELSE}'zend_hash_move_forward_ex'{$ENDIF}); // -- zend_hash_move_backwards_ex - zend_hash_move_backwards_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_move_backwards_ex@@8'{$ELSE}'zend_hash_move_backwards_ex'{$ENDIF}); + LFunc(@zend_hash_move_backwards_ex, {$IFDEF PHP7}'zend_hash_move_backwards_ex@@8'{$ELSE}'zend_hash_move_backwards_ex'{$ENDIF}); // -- zend_hash_get_current_key_ex - zend_hash_get_current_key_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_get_current_key_ex@@16'{$ELSE}'zend_hash_get_current_key_ex'{$ENDIF}); + LFunc(@zend_hash_get_current_key_ex, {$IFDEF PHP7}'zend_hash_get_current_key_ex@@16'{$ELSE}'zend_hash_get_current_key_ex'{$ENDIF}); // -- zend_hash_get_current_key_type_ex - zend_hash_get_current_key_type_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_get_current_key_type_ex@@8'{$ELSE}'zend_hash_get_current_key_type_ex'{$ENDIF}); + LFunc(@zend_hash_get_current_key_type_ex, {$IFDEF PHP7}'zend_hash_get_current_key_type_ex@@8'{$ELSE}'zend_hash_get_current_key_type_ex'{$ENDIF}); // -- zend_hash_get_current_data_ex - zend_hash_get_current_data_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_get_current_data_ex@@8'{$ELSE}'zend_hash_get_current_data_ex'{$ENDIF}); + LFunc(@zend_hash_get_current_data_ex, {$IFDEF PHP7}'zend_hash_get_current_data_ex@@8'{$ELSE}'zend_hash_get_current_data_ex'{$ENDIF}); // -- zend_hash_internal_pointer_reset_ex - zend_hash_internal_pointer_reset_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_internal_pointer_reset_ex@@8'{$ELSE}'zend_hash_internal_pointer_reset_ex'{$ENDIF}); + LFunc(@zend_hash_internal_pointer_reset_ex, {$IFDEF PHP7}'zend_hash_internal_pointer_reset_ex@@8'{$ELSE}'zend_hash_internal_pointer_reset_ex'{$ENDIF}); // -- zend_hash_internal_pointer_end_ex - zend_hash_internal_pointer_end_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_internal_pointer_end_ex@@8'{$ELSE}'zend_hash_internal_pointer_end_ex'{$ENDIF}); + LFunc(@zend_hash_internal_pointer_end_ex, {$IFDEF PHP7}'zend_hash_internal_pointer_end_ex@@8'{$ELSE}'zend_hash_internal_pointer_end_ex'{$ENDIF}); // -- zend_hash_copy - zend_hash_copy := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_copy@@12'{$ELSE}'zend_hash_copy'{$ENDIF}); + LFunc(@zend_hash_copy, {$IFDEF PHP7}'zend_hash_copy@@12'{$ELSE}'zend_hash_copy'{$ENDIF}); // -- zend_hash_sort - zend_hash_sort := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_sort_ex@@16'{$ELSE}'zend_hash_sort'{$ENDIF}); + LFunc(@zend_hash_sort, {$IFDEF PHP7}'zend_hash_sort_ex@@16'{$ELSE}'zend_hash_sort'{$ENDIF}); // -- zend_hash_compare - zend_hash_compare := GetProcAddress(PHPLib, 'zend_hash_compare'); + LFunc(@zend_hash_compare, 'zend_hash_compare'); // -- zend_hash_minmax - zend_hash_minmax := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_minmax@@12'{$ELSE}'zend_hash_minmax'{$ENDIF}); + LFunc(@zend_hash_minmax, {$IFDEF PHP7}'zend_hash_minmax@@12'{$ELSE}'zend_hash_minmax'{$ENDIF}); // -- zend_hash_num_elements {$IFNDEF PHP7} - zend_hash_num_elements := GetProcAddress(PHPLib, 'zend_hash_num_elements'); + LFunc(@zend_hash_num_elements, 'zend_hash_num_elements'); {$ENDIF} // -- zend_hash_rehash - zend_hash_rehash := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_hash_rehash@@4'{$ELSE}'zend_hash_rehash'{$ENDIF}); + LFunc(@zend_hash_rehash, {$IFDEF PHP7}'zend_hash_rehash@@4'{$ELSE}'zend_hash_rehash'{$ENDIF}); // -- zend_hash_func - zend_hash_func := GetProcAddress(PHPLib, 'zend_hash_func'); + LFunc(@zend_hash_func, 'zend_hash_func'); // -- zend_get_constant - zend_get_constant := GetProcAddress(PHPLib, 'zend_get_constant'); + LFunc(@zend_get_constant, 'zend_get_constant'); + + // -- zend_register_null_constant + LFunc(@zend_register_null_constant, 'zend_register_null_constant'); + + // -- zend_register_bool_constant + LFunc(@zend_register_bool_constant, 'zend_register_bool_constant'); // -- zend_register_long_constant - zend_register_long_constant := GetProcAddress(PHPLib, 'zend_register_long_constant'); + LFunc(@zend_register_long_constant, 'zend_register_long_constant'); // -- zend_register_double_constant - zend_register_double_constant := GetProcAddress(PHPLib, 'zend_register_double_constant'); + LFunc(@zend_register_double_constant, 'zend_register_double_constant'); // -- zend_register_string_constant - zend_register_string_constant := GetProcAddress(PHPLib, 'zend_register_string_constant'); + LFunc(@zend_register_string_constant, 'zend_register_string_constant'); // -- zend_register_stringl_constant - zend_register_stringl_constant := GetProcAddress(PHPLib, 'zend_register_stringl_constant'); + LFunc(@zend_register_stringl_constant, 'zend_register_stringl_constant'); // -- zend_register_constant - zend_register_constant := GetProcAddress(PHPLib, 'zend_register_constant'); + LFunc(@zend_register_constant, 'zend_register_constant'); - zend_register_auto_global := GetProcAddress(PHPLib, 'zend_register_auto_global'); + LFunc(@zend_register_auto_global, 'zend_register_auto_global'); {$IFDEF PHP5} - zend_activate_auto_globals := GetProcAddress(PHPLib, 'zend_activate_auto_globals'); + LFunc(@zend_activate_auto_globals, 'zend_activate_auto_globals'); {$ENDIF} // -- tsrm_shutdown - tsrm_shutdown := GetProcAddress(PHPLib, 'tsrm_shutdown'); + LFunc(@tsrm_shutdown, 'tsrm_shutdown'); // -- ts_resource_ex - ts_resource_ex := GetProcAddress(PHPLib, 'ts_resource_ex'); + LFunc(@ts_resource_ex, 'ts_resource_ex'); // -- ts_free_thread - ts_free_thread := GetProcAddress(PHPLib, 'ts_free_thread'); + LFunc(@ts_free_thread, 'ts_free_thread'); // -- zend_error - zend_error := GetProcAddress(PHPLib, 'zend_error'); + LFunc(@zend_error, 'zend_error'); // -- zend_error_cb - zend_error_cb := GetProcAddress(PHPLib, 'zend_error_cb'); + LFunc(@zend_error_cb, 'zend_error_cb'); // -- zend_eval_string - zend_eval_string := GetProcAddress(PHPLib, 'zend_eval_string'); - - // -- zend_make_compiled_string_description - zend_make_compiled_string_description := GetProcAddress(PHPLib, 'zend_make_compiled_string_description'); + LFunc(@zend_eval_string, 'zend_eval_string'); + // -- zend_eval_string + LFunc(@zend_eval_string_ex, 'zend_eval_string_ex'); - {$IFDEF PHP4} - // -- _zval_dtor - _zval_dtor := GetProcAddress(PHPLib, '_zval_dtor'); - - // -- _zval_copy_ctor - _zval_copy_ctor := GetProcAddress(PHPLib, '_zval_copy_ctor'); - - {$ELSE} - _zval_copy_ctor_func := GetProcAddress(PHPLib, {$IFDEF PHP7}'_zval_copy_ctor_func@@4'{$ELSE}'_zval_copy_ctor_func'{$ENDIF}); - _zval_dtor_func := GetProcAddress(PHPLib, {$IFDEF PHP7}'_zval_dtor_func@@4'{$ELSE}'_zval_dtor_func'{$ENDIF}); - _zval_ptr_dtor := GetProcAddress(PHPLib, '_zval_ptr_dtor'); + // -- zend_make_compiled_string_description + LFunc(@zend_make_compiled_string_description, 'zend_make_compiled_string_description'); - {$ENDIF} + LFunc(@_zval_copy_ctor_func, {$IFDEF PHP7}'_zval_copy_ctor_func@@4'{$ELSE}'_zval_copy_ctor_func'{$ENDIF}); + LFunc(@_zval_dtor_func, {$IFDEF PHP7}'_zval_dtor_func@@4'{$ELSE}'_zval_dtor_func'{$ENDIF}); + LFunc(@_zval_ptr_dtor, '_zval_ptr_dtor'); // -- zend_print_variable - zend_print_variable := GetProcAddress(PHPLib, 'zend_print_variable'); + LFunc(@zend_print_variable, 'zend_print_variable'); // -- zend_stack_init - zend_stack_init := GetProcAddress(PHPLib, 'zend_stack_init'); + LFunc(@zend_stack_init, 'zend_stack_init'); // -- zend_stack_push - zend_stack_push := GetProcAddress(PHPLib, 'zend_stack_push'); + LFunc(@zend_stack_push, 'zend_stack_push'); // -- zend_stack_top - zend_stack_top := GetProcAddress(PHPLib, 'zend_stack_top'); + LFunc(@zend_stack_top, 'zend_stack_top'); // -- zend_stack_del_top - zend_stack_del_top := GetProcAddress(PHPLib, 'zend_stack_del_top'); + LFunc(@zend_stack_del_top, 'zend_stack_del_top'); // -- zend_stack_int_top - zend_stack_int_top := GetProcAddress(PHPLib, 'zend_stack_int_top'); + LFunc(@zend_stack_int_top, 'zend_stack_int_top'); // -- zend_stack_is_empty - zend_stack_is_empty := GetProcAddress(PHPLib, 'zend_stack_is_empty'); + LFunc(@zend_stack_is_empty, 'zend_stack_is_empty'); // -- zend_stack_destroy - zend_stack_destroy := GetProcAddress(PHPLib, 'zend_stack_destroy'); + LFunc(@zend_stack_destroy, 'zend_stack_destroy'); // -- zend_stack_base - zend_stack_base := GetProcAddress(PHPLib, 'zend_stack_base'); + LFunc(@zend_stack_base, 'zend_stack_base'); // -- zend_stack_count - zend_stack_count := GetProcAddress(PHPLib, 'zend_stack_count'); + LFunc(@zend_stack_count, 'zend_stack_count'); // -- zend_stack_apply - zend_stack_apply := GetProcAddress(PHPLib, 'zend_stack_apply'); + LFunc(@zend_stack_apply, 'zend_stack_apply'); // -- zend_stack_apply_with_argument - zend_stack_apply_with_argument := GetProcAddress(PHPLib, 'zend_stack_apply_with_argument'); + LFunc(@zend_stack_apply_with_argument, 'zend_stack_apply_with_argument'); // -- _convert_to_string - _convert_to_string := GetProcAddress(PHPLib, {$IFDEF PHP7}'_convert_to_string@@4'{$ELSE}'_convert_to_string'{$ENDIF}); + LFunc(@_convert_to_string, {$IFDEF PHP7}'_convert_to_string@@4'{$ELSE}'_convert_to_string'{$ENDIF}); // -- add_function - add_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'add_function@@12'{$ELSE}'add_function'{$ENDIF}); + LFunc(@add_function, {$IFDEF PHP7}'add_function@@12'{$ELSE}'add_function'{$ENDIF}); // -- sub_function - sub_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'sub_function@@12'{$ELSE}'sub_function'{$ENDIF}); + LFunc(@sub_function, {$IFDEF PHP7}'sub_function@@12'{$ELSE}'sub_function'{$ENDIF}); // -- mul_function - mul_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'mul_function@@12'{$ELSE}'mul_function'{$ENDIF}); + LFunc(@mul_function, {$IFDEF PHP7}'mul_function@@12'{$ELSE}'mul_function'{$ENDIF}); // -- div_function - div_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'div_function@@12'{$ELSE}'div_function'{$ENDIF}); + LFunc(@div_function, {$IFDEF PHP7}'div_function@@12'{$ELSE}'div_function'{$ENDIF}); // -- mod_function - mod_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'mod_function@@12'{$ELSE}'mod_function'{$ENDIF}); + LFunc(@mod_function, {$IFDEF PHP7}'mod_function@@12'{$ELSE}'mod_function'{$ENDIF}); // -- boolean_xor_function - boolean_xor_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'boolean_xor_function@@12'{$ELSE}'boolean_xor_function'{$ENDIF}); + LFunc(@boolean_xor_function, {$IFDEF PHP7}'boolean_xor_function@@12'{$ELSE}'boolean_xor_function'{$ENDIF}); // -- boolean_not_function - boolean_not_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'boolean_not_function@@8'{$ELSE}'boolean_not_function'{$ENDIF}); + LFunc(@boolean_not_function, {$IFDEF PHP7}'boolean_not_function@@8'{$ELSE}'boolean_not_function'{$ENDIF}); // -- bitwise_not_function - bitwise_not_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'bitwise_not_function@@8'{$ELSE}'bitwise_not_function'{$ENDIF}); + LFunc(@bitwise_not_function, {$IFDEF PHP7}'bitwise_not_function@@8'{$ELSE}'bitwise_not_function'{$ENDIF}); // -- bitwise_or_function - bitwise_or_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'bitwise_or_function@@12'{$ELSE}'bitwise_or_function'{$ENDIF}); + LFunc(@bitwise_or_function, {$IFDEF PHP7}'bitwise_or_function@@12'{$ELSE}'bitwise_or_function'{$ENDIF}); // -- bitwise_and_function - bitwise_and_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'bitwise_and_function@@12'{$ELSE}'bitwise_and_function'{$ENDIF}); + LFunc(@bitwise_and_function, {$IFDEF PHP7}'bitwise_and_function@@12'{$ELSE}'bitwise_and_function'{$ENDIF}); // -- bitwise_xor_function - bitwise_xor_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'bitwise_xor_function@@12'{$ELSE}'bitwise_xor_function'{$ENDIF}); + LFunc(@bitwise_xor_function, {$IFDEF PHP7}'bitwise_xor_function@@12'{$ELSE}'bitwise_xor_function'{$ENDIF}); // -- shift_left_function - shift_left_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'shift_left_function@@12'{$ELSE}'shift_left_function'{$ENDIF}); + LFunc(@shift_left_function, {$IFDEF PHP7}'shift_left_function@@12'{$ELSE}'shift_left_function'{$ENDIF}); // -- shift_right_function - shift_right_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'shift_right_function@@12'{$ELSE}'shift_right_function'{$ENDIF}); + LFunc(@shift_right_function, {$IFDEF PHP7}'shift_right_function@@12'{$ELSE}'shift_right_function'{$ENDIF}); // -- concat_function - concat_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'concat_function@@12'{$ELSE}'concat_function'{$ENDIF}); + LFunc(@concat_function, {$IFDEF PHP7}'concat_function@@12'{$ELSE}'concat_function'{$ENDIF}); // -- is_equal_function - is_equal_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_equal_function@@12'{$ELSE}'is_equal_function'{$ENDIF}); + LFunc(@is_equal_function, {$IFDEF PHP7}'is_equal_function@@12'{$ELSE}'is_equal_function'{$ENDIF}); // -- is_identical_function - is_identical_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_identical_function@@12'{$ELSE}'is_identical_function'{$ENDIF}); + LFunc(@is_identical_function, {$IFDEF PHP7}'is_identical_function@@12'{$ELSE}'is_identical_function'{$ENDIF}); // -- is_not_identical_function - is_not_identical_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_not_identical_function@@12'{$ELSE}'is_not_identical_function'{$ENDIF}); + LFunc(@is_not_identical_function, {$IFDEF PHP7}'is_not_identical_function@@12'{$ELSE}'is_not_identical_function'{$ENDIF}); // -- is_not_equal_function - is_not_equal_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_not_equal_function@@12'{$ELSE}'is_not_equal_function'{$ENDIF}); + LFunc(@is_not_equal_function, {$IFDEF PHP7}'is_not_equal_function@@12'{$ELSE}'is_not_equal_function'{$ENDIF}); // -- is_smaller_function - is_smaller_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_smaller_function@@12'{$ELSE}'is_smaller_function'{$ENDIF}); + LFunc(@is_smaller_function, {$IFDEF PHP7}'is_smaller_function@@12'{$ELSE}'is_smaller_function'{$ENDIF}); // -- is_smaller_or_equal_function - is_smaller_or_equal_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'is_smaller_or_equal_function@@12'{$ELSE}'is_smaller_or_equal_function'{$ENDIF}); + LFunc(@is_smaller_or_equal_function, {$IFDEF PHP7}'is_smaller_or_equal_function@@12'{$ELSE}'is_smaller_or_equal_function'{$ENDIF}); // -- increment_function - increment_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'increment_function@@4'{$ELSE}'increment_function'{$ENDIF}); + LFunc(@increment_function, {$IFDEF PHP7}'increment_function@@4'{$ELSE}'increment_function'{$ENDIF}); // -- decrement_function - decrement_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'decrement_function@@4'{$ELSE}'decrement_function'{$ENDIF}); + LFunc(@decrement_function, {$IFDEF PHP7}'decrement_function@@4'{$ELSE}'decrement_function'{$ENDIF}); // -- convert_scalar_to_number - convert_scalar_to_number := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_scalar_to_number@@4'{$ELSE}'convert_scalar_to_number'{$ENDIF}); + LFunc(@convert_scalar_to_number, {$IFDEF PHP7}'convert_scalar_to_number@@4'{$ELSE}'convert_scalar_to_number'{$ENDIF}); // -- convert_to_long - convert_to_long := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_long@@4'{$ELSE}'convert_to_long'{$ENDIF}); + LFunc(@convert_to_long, {$IFDEF PHP7}'convert_to_long@@4'{$ELSE}'convert_to_long'{$ENDIF}); // -- convert_to_double - convert_to_double := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_double@@4'{$ELSE}'convert_to_double'{$ENDIF}); + LFunc(@convert_to_double, {$IFDEF PHP7}'convert_to_double@@4'{$ELSE}'convert_to_double'{$ENDIF}); // -- convert_to_long_base - convert_to_long_base := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_long_base@@8'{$ELSE}'convert_to_long_base'{$ENDIF}); + LFunc(@convert_to_long_base, {$IFDEF PHP7}'convert_to_long_base@@8'{$ELSE}'convert_to_long_base'{$ENDIF}); // -- convert_to_null - convert_to_null := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_null@@4'{$ELSE}'convert_to_null'{$ENDIF}); + LFunc(@convert_to_null, {$IFDEF PHP7}'convert_to_null@@4'{$ELSE}'convert_to_null'{$ENDIF}); // -- convert_to_boolean - convert_to_boolean := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_boolean@@4'{$ELSE}'convert_to_boolean'{$ENDIF}); + LFunc(@convert_to_boolean, {$IFDEF PHP7}'convert_to_boolean@@4'{$ELSE}'convert_to_boolean'{$ENDIF}); // -- convert_to_array - convert_to_array := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_array@@4'{$ELSE}'convert_to_array'{$ENDIF}); + LFunc(@convert_to_array, {$IFDEF PHP7}'convert_to_array@@4'{$ELSE}'convert_to_array'{$ENDIF}); // -- convert_to_object - convert_to_object := GetProcAddress(PHPLib, {$IFDEF PHP7}'convert_to_object@@4'{$ELSE}'convert_to_object'{$ENDIF}); + LFunc(@convert_to_object, {$IFDEF PHP7}'convert_to_object@@4'{$ELSE}'convert_to_object'{$ENDIF}); {$IFNDEF PHP7} // -- add_char_to_string - add_char_to_string := GetProcAddress(PHPLib, 'add_char_to_string'); + LFunc(@add_char_to_string, 'add_char_to_string'); // -- add_string_to_string - add_string_to_string := GetProcAddress(PHPLib, 'add_string_to_string'); + LFunc(@add_string_to_string, 'add_string_to_string'); {$ENDIF} // -- zend_string_to_double - zend_string_to_double := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_strtod'{$ELSE}'zend_string_to_double'{$ENDIF}); + LFunc(@zend_string_to_double, {$IFDEF PHP7}'zend_strtod'{$ELSE}'zend_string_to_double'{$ENDIF}); // -- zval_is_true - zval_is_true := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_is_true@@4'{$ELSE}'zval_is_true'{$ENDIF}); + LFunc(@zval_is_true, {$IFDEF PHP7}'zend_is_true@@4'{$ELSE}'zval_is_true'{$ENDIF}); // -- compare_function - compare_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'compare_function@@12'{$ELSE}'compare_function'{$ENDIF}); + LFunc(@compare_function, {$IFDEF PHP7}'compare_function@@12'{$ELSE}'compare_function'{$ENDIF}); // -- numeric_compare_function - numeric_compare_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'numeric_compare_function@@8'{$ELSE}'numeric_compare_function'{$ENDIF}); + LFunc(@numeric_compare_function, {$IFDEF PHP7}'numeric_compare_function@@8'{$ELSE}'numeric_compare_function'{$ENDIF}); // -- string_compare_function - string_compare_function := GetProcAddress(PHPLib, {$IFDEF PHP7}'string_compare_function@@8'{$ELSE}'string_compare_function'{$ENDIF}); + LFunc(@string_compare_function, {$IFDEF PHP7}'string_compare_function@@8'{$ELSE}'string_compare_function'{$ENDIF}); // -- zend_str_tolower - zend_str_tolower := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_str_tolower@@8'{$ELSE}'zend_str_tolower'{$ENDIF}); + LFunc(@zend_str_tolower, {$IFDEF PHP7}'zend_str_tolower@@8'{$ELSE}'zend_str_tolower'{$ENDIF}); // -- zend_binary_zval_strcmp - zend_binary_zval_strcmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_zval_strcmp@@8'{$ELSE}'zend_binary_zval_strcmp'{$ENDIF}); + LFunc(@zend_binary_zval_strcmp, {$IFDEF PHP7}'zend_binary_zval_strcmp@@8'{$ELSE}'zend_binary_zval_strcmp'{$ENDIF}); // -- zend_binary_zval_strncmp - zend_binary_zval_strncmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_zval_strncmp@@12'{$ELSE}'zend_binary_zval_strncmp'{$ENDIF}); + LFunc(@zend_binary_zval_strncmp, {$IFDEF PHP7}'zend_binary_zval_strncmp@@12'{$ELSE}'zend_binary_zval_strncmp'{$ENDIF}); // -- zend_binary_zval_strcasecmp - zend_binary_zval_strcasecmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_zval_strcasecmp@@8'{$ELSE}'zend_binary_zval_strcasecmp'{$ENDIF}); + LFunc(@zend_binary_zval_strcasecmp, {$IFDEF PHP7}'zend_binary_zval_strcasecmp@@8'{$ELSE}'zend_binary_zval_strcasecmp'{$ENDIF}); // -- zend_binary_zval_strncasecmp - zend_binary_zval_strncasecmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_zval_strncasecmp@@12'{$ELSE}'zend_binary_zval_strncasecmp'{$ENDIF}); + LFunc(@zend_binary_zval_strncasecmp, {$IFDEF PHP7}'zend_binary_zval_strncasecmp@@12'{$ELSE}'zend_binary_zval_strncasecmp'{$ENDIF}); // -- zend_binary_strcmp - zend_binary_strcmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_strcmp@@16'{$ELSE}'zend_binary_strcmp'{$ENDIF}); + LFunc(@zend_binary_strcmp, {$IFDEF PHP7}'zend_binary_strcmp@@16'{$ELSE}'zend_binary_strcmp'{$ENDIF}); // -- zend_binary_strncmp - zend_binary_strncmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_strncmp@@20'{$ELSE}'zend_binary_strncmp'{$ENDIF}); + LFunc(@zend_binary_strncmp, {$IFDEF PHP7}'zend_binary_strncmp@@20'{$ELSE}'zend_binary_strncmp'{$ENDIF}); // -- zend_binary_strcasecmp - zend_binary_strcasecmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_strcasecmp@@16'{$ELSE}'zend_binary_strcasecmp'{$ENDIF}); + LFunc(@zend_binary_strcasecmp, {$IFDEF PHP7}'zend_binary_strcasecmp@@16'{$ELSE}'zend_binary_strcasecmp'{$ENDIF}); // -- zend_binary_strncasecmp - zend_binary_strncasecmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_binary_strncasecmp@@20'{$ELSE}'zend_binary_strncasecmp'{$ENDIF}); + LFunc(@zend_binary_strncasecmp, {$IFDEF PHP7}'zend_binary_strncasecmp@@20'{$ELSE}'zend_binary_strncasecmp'{$ENDIF}); // -- zendi_smart_strcmp - zendi_smart_strcmp := GetProcAddress(PHPLib, {$IFDEF PHP7}'zendi_smart_strcmp@@8'{$ELSE}'zendi_smart_strcmp'{$ENDIF}); + LFunc(@zendi_smart_strcmp, {$IFDEF PHP7}'zendi_smart_strcmp@@8'{$ELSE}'zendi_smart_strcmp'{$ENDIF}); // -- zend_compare_symbol_tables - zend_compare_symbol_tables := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_compare_symbol_tables@@8'{$ELSE}'zend_compare_symbol_tables'{$ENDIF}); + LFunc(@zend_compare_symbol_tables, {$IFDEF PHP7}'zend_compare_symbol_tables@@8'{$ELSE}'zend_compare_symbol_tables'{$ENDIF}); // -- zend_compare_arrays - zend_compare_arrays := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_compare_arrays@@8'{$ELSE}'zend_compare_arrays'{$ENDIF}); + LFunc(@zend_compare_arrays, {$IFDEF PHP7}'zend_compare_arrays@@8'{$ELSE}'zend_compare_arrays'{$ENDIF}); // -- zend_compare_objects - zend_compare_objects := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_compare_objects@@8'{$ELSE}'zend_compare_objects'{$ENDIF}); + LFunc(@zend_compare_objects, {$IFDEF PHP7}'zend_compare_objects@@8'{$ELSE}'zend_compare_objects'{$ENDIF}); // -- zend_atoi - zend_atoi := GetProcAddress(PHPLib, {$IFDEF PHP7}'zend_atoi@@8'{$ELSE}'zend_atoi'{$ENDIF}); + LFunc(@zend_atoi, {$IFDEF PHP7}'zend_atoi@@8'{$ELSE}'zend_atoi'{$ENDIF}); // -- get_active_function_name - get_active_function_name := GetProcAddress(PHPLib, 'get_active_function_name'); + LFunc(@get_active_function_name, 'get_active_function_name'); // -- zend_get_executed_filename - zend_get_executed_filename := GetProcAddress(PHPLib, 'zend_get_executed_filename'); + LFunc(@zend_get_executed_filename, 'zend_get_executed_filename'); // -- zend_get_executed_lineno - zend_get_executed_lineno := GetProcAddress(PHPLib, 'zend_get_executed_lineno'); + LFunc(@zend_get_executed_lineno, 'zend_get_executed_lineno'); // -- zend_set_timeout - zend_set_timeout := GetProcAddress(PHPLib, 'zend_set_timeout'); + LFunc(@zend_set_timeout, 'zend_set_timeout'); // -- zend_unset_timeout - zend_unset_timeout := GetProcAddress(PHPLib, 'zend_unset_timeout'); + LFunc(@zend_unset_timeout, 'zend_unset_timeout'); // -- zend_timeout - zend_timeout := GetProcAddress(PHPLib, 'zend_timeout'); + LFunc(@zend_timeout, 'zend_timeout'); // -- zend_highlight - zend_highlight := GetProcAddress(PHPLib, 'zend_highlight'); + LFunc(@zend_highlight, 'zend_highlight'); // -- zend_strip - zend_strip := GetProcAddress(PHPLib, 'zend_strip'); + LFunc(@zend_strip, 'zend_strip'); // -- highlight_file - highlight_file := GetProcAddress(PHPLib, 'highlight_file'); + LFunc(@highlight_file, 'highlight_file'); // -- highlight_string - highlight_string := GetProcAddress(PHPLib, 'highlight_string'); + LFunc(@highlight_string, 'highlight_string'); // -- zend_html_putc - zend_html_putc := GetProcAddress(PHPLib, 'zend_html_putc'); + LFunc(@zend_html_putc, 'zend_html_putc'); // -- zend_html_puts - zend_html_puts := GetProcAddress(PHPLib, 'zend_html_puts'); + LFunc(@zend_html_puts, 'zend_html_puts'); + + LFunc(@zend_parse_method_parameters, 'zend_parse_method_parameters'); + LFunc(@zend_parse_method_parameters_ex, 'zend_parse_method_parameters_ex'); + {$IFDEF PHP7} // -- zend_parse_parameters_throw - zend_parse_parameters_throw := GetProcAddress(PHPLib, 'zend_parse_parameters_throw'); - ZvalGetArgs := GetProcAddress(PHPLib, 'zend_get_parameters_ex'); - _zend_get_parameters_array_ex := GetProcAddress(PHPLib, '_zend_get_parameters_array_ex'); + LFunc(@zend_parse_parameters_throw, 'zend_parse_parameters_throw'); + LFunc(@ZvalGetArgs, 'zend_get_parameters_ex'); {$ELSE} // -- zend_indent - zend_indent := GetProcAddress(PHPLib, 'zend_indent'); + LFunc(@zend_indent, 'zend_indent'); {$ENDIF} + // -- _zend_get_parameters_array + LFunc(@_zend_get_parameters_array, '_zend_get_parameters_array'); + // -- _zend_get_parameters_array_ex - _zend_get_parameters_array_ex := GetProcAddress(PHPLib, {$IFDEF PHP7}{$ELSE}{$ENDIF}'_zend_get_parameters_array_ex'); + LFunc(@_zend_get_parameters_array_ex, '_zend_get_parameters_array_ex'); // -- zend_ini_refresh_caches - zend_ini_refresh_caches := GetProcAddress(PHPLib, 'zend_ini_refresh_caches'); + LFunc(@zend_ini_refresh_caches, 'zend_ini_refresh_caches'); // -- zend_alter_ini_entry - zend_alter_ini_entry := GetProcAddress(PHPLib, 'zend_alter_ini_entry'); - zend_alter_ini_entry_ex:= GetProcAddress(PHPLib, 'zend_alter_ini_entry_ex'); + LFunc(@zend_alter_ini_entry, 'zend_alter_ini_entry'); + LFunc(@zend_alter_ini_entry_ex, 'zend_alter_ini_entry_ex'); // -- zend_restore_ini_entry - zend_restore_ini_entry := GetProcAddress(PHPLib, 'zend_restore_ini_entry'); + LFunc(@zend_restore_ini_entry, 'zend_restore_ini_entry'); // -- zend_ini_long - zend_ini_long := GetProcAddress(PHPLib, 'zend_ini_long'); + LFunc(@zend_ini_long, 'zend_ini_long'); // -- zend_ini_double - zend_ini_double := GetProcAddress(PHPLib, 'zend_ini_double'); + LFunc(@zend_ini_double, 'zend_ini_double'); // -- zend_ini_string - zend_ini_string := GetProcAddress(PHPLib, 'zend_ini_string'); + LFunc(@zend_ini_string, 'zend_ini_string'); // -- compile_string - compile_string := GetProcAddress(PHPLib, 'compile_string'); + LFunc(@compile_string, 'compile_string'); // -- execute - execute := GetProcAddress(PHPLib, {$IFDEF PHP550}'zend_execute'{$ELSE}'execute'{$ENDIF}); + LFunc(@execute, {$IFDEF PHP550}'zend_execute'{$ELSE}'execute'{$ENDIF}); // -- zend_wrong_param_count - zend_wrong_param_count := GetProcAddress(PHPLib, 'zend_wrong_param_count'); + LFunc(@zend_wrong_param_count, 'zend_wrong_param_count'); // -- zend_hash_quick_add_or_update - _zend_hash_quick_add_or_update := GetProcAddress(PHPLib, '_zend_hash_quick_add_or_update'); + LFunc(@_zend_hash_quick_add_or_update, '_zend_hash_quick_add_or_update'); // -- add_property_long_ex - add_property_long_ex := GetProcAddress(PHPLib, 'add_property_long_ex'); + LFunc(@add_property_long_ex, 'add_property_long_ex'); // -- add_property_null_ex - add_property_null_ex := GetProcAddress(PHPLib, 'add_property_null_ex'); + LFunc(@add_property_null_ex, 'add_property_null_ex'); // -- add_property_bool_ex - add_property_bool_ex := GetProcAddress(PHPLib, 'add_property_bool_ex'); + LFunc(@add_property_bool_ex, 'add_property_bool_ex'); // -- add_property_resource_ex - add_property_resource_ex := GetProcAddress(PHPLib, 'add_property_resource_ex'); + LFunc(@add_property_resource_ex, 'add_property_resource_ex'); // -- add_property_double_ex - add_property_double_ex := GetProcAddress(PHPLib, 'add_property_double_ex'); + LFunc(@add_property_double_ex, 'add_property_double_ex'); // -- add_property_string_ex - add_property_string_ex := GetProcAddress(PHPLib, 'add_property_string_ex'); + LFunc(@add_property_string_ex, 'add_property_string_ex'); // -- add_property_stringl_ex - add_property_stringl_ex := GetProcAddress(PHPLib, 'add_property_stringl_ex'); + LFunc(@add_property_stringl_ex, 'add_property_stringl_ex'); // -- add_property_zval_ex - add_property_zval_ex := GetProcAddress(PHPLib, 'add_property_zval_ex'); + LFunc(@add_property_zval_ex, 'add_property_zval_ex'); - call_user_function := GetProcAddress(PHPLib, {$IFDEF P_CUT}'__call_function'{$ELSE}'call_user_function'{$ENDIF}); - {$IFNDEF P_CUT} - call_user_function_ex := GetProcAddress(PHPLib, 'call_user_function_ex'); + LFunc(@call_user_function, {$IFDEF CUTTED_PHP7dll}'__call_function'{$ELSE}'call_user_function'{$ENDIF}); + {$IFNDEF CUTTED_PHP7dll} + LFunc(@call_user_function_ex, 'call_user_function_ex'); {$ENDIF} // -- add_assoc_long_ex - add_assoc_long_ex := GetProcAddress(PHPLib, 'add_assoc_long_ex'); + LFunc(@add_assoc_long_ex, 'add_assoc_long_ex'); // -- add_assoc_null_ex - add_assoc_null_ex := GetProcAddress(PHPLib, 'add_assoc_null_ex'); + LFunc(@add_assoc_null_ex, 'add_assoc_null_ex'); // -- add_assoc_bool_ex - add_assoc_bool_ex := GetProcAddress(PHPLib, 'add_assoc_bool_ex'); + LFunc(@add_assoc_bool_ex, 'add_assoc_bool_ex'); // -- add_assoc_resource_ex - add_assoc_resource_ex := GetProcAddress(PHPLib, 'add_assoc_resource_ex'); + LFunc(@add_assoc_resource_ex, 'add_assoc_resource_ex'); // -- add_assoc_double_ex - add_assoc_double_ex := GetProcAddress(PHPLib, 'add_assoc_double_ex'); + LFunc(@add_assoc_double_ex, 'add_assoc_double_ex'); // -- add_assoc_string_ex - add_assoc_string_ex := GetProcAddress(PHPLib, 'add_assoc_string_ex'); + LFunc(@add_assoc_string_ex, 'add_assoc_string_ex'); // -- add_assoc_stringl_ex - add_assoc_stringl_ex := GetProcAddress(PHPLib, 'add_assoc_stringl_ex'); + LFunc(@add_assoc_stringl_ex, 'add_assoc_stringl_ex'); // -- add_assoc_zval_ex - add_assoc_zval_ex := GetProcAddress(PHPLib, 'add_assoc_zval_ex'); + LFunc(@add_assoc_zval_ex, 'add_assoc_zval_ex'); // -- add_index_long - add_index_long := GetProcAddress(PHPLib, 'add_index_long'); + LFunc(@add_index_long, 'add_index_long'); // -- add_index_null - add_index_null := GetProcAddress(PHPLib, 'add_index_null'); + LFunc(@add_index_null, 'add_index_null'); // -- add_index_bool - add_index_bool := GetProcAddress(PHPLib, 'add_index_bool'); + LFunc(@add_index_bool, 'add_index_bool'); // -- add_index_resource - add_index_resource := GetProcAddress(PHPLib, 'add_index_resource'); + LFunc(@add_index_resource, 'add_index_resource'); // -- add_index_double - add_index_double := GetProcAddress(PHPLib, 'add_index_double'); + LFunc(@add_index_double, 'add_index_double'); // -- add_index_string - add_index_string := GetProcAddress(PHPLib, 'add_index_string'); + LFunc(@add_index_string, 'add_index_string'); // -- add_index_stringl - add_index_stringl := GetProcAddress(PHPLib, 'add_index_stringl'); + LFunc(@add_index_stringl, 'add_index_stringl'); // -- add_index_zval - add_index_zval := GetProcAddress(PHPLib, 'add_index_zval'); + LFunc(@add_index_zval, 'add_index_zval'); // -- add_next_index_long - add_next_index_long := GetProcAddress(PHPLib, 'add_next_index_long'); + LFunc(@add_next_index_long, 'add_next_index_long'); // -- add_next_index_null - add_next_index_null := GetProcAddress(PHPLib, 'add_next_index_null'); + LFunc(@add_next_index_null, 'add_next_index_null'); // -- add_next_index_bool - add_next_index_bool := GetProcAddress(PHPLib, 'add_next_index_bool'); + LFunc(@add_next_index_bool, 'add_next_index_bool'); // -- add_next_index_resource - add_next_index_resource := GetProcAddress(PHPLib, 'add_next_index_resource'); + LFunc(@add_next_index_resource, 'add_next_index_resource'); // -- add_next_index_double - add_next_index_double := GetProcAddress(PHPLib, 'add_next_index_double'); + LFunc(@add_next_index_double, 'add_next_index_double'); // -- add_next_index_string - add_next_index_string := GetProcAddress(PHPLib, 'add_next_index_string'); + LFunc(@add_next_index_string, 'add_next_index_string'); // -- add_next_index_stringl - add_next_index_stringl := GetProcAddress(PHPLib, 'add_next_index_stringl'); + LFunc(@add_next_index_stringl, 'add_next_index_stringl'); // -- add_next_index_zval - add_next_index_zval := GetProcAddress(PHPLib, 'add_next_index_zval'); + LFunc(@add_next_index_zval, 'add_next_index_zval'); // -- add_get_assoc_string_ex - add_get_assoc_string_ex := GetProcAddress(PHPLib, 'add_get_assoc_string_ex'); + LFunc(@add_get_assoc_string_ex, 'add_get_assoc_string_ex'); // -- add_get_assoc_stringl_ex - add_get_assoc_stringl_ex := GetProcAddress(PHPLib, 'add_get_assoc_stringl_ex'); + LFunc(@add_get_assoc_stringl_ex, 'add_get_assoc_stringl_ex'); // -- add_get_index_long - add_get_index_long := GetProcAddress(PHPLib, 'add_get_index_long'); + LFunc(@add_get_index_long, 'add_get_index_long'); // -- add_get_index_double - add_get_index_double := GetProcAddress(PHPLib, 'add_get_index_double'); + LFunc(@add_get_index_double, 'add_get_index_double'); // -- add_get_index_string - add_get_index_string := GetProcAddress(PHPLib, 'add_get_index_string'); + LFunc(@add_get_index_string, 'add_get_index_string'); // -- add_get_index_stringl - add_get_index_stringl := GetProcAddress(PHPLib, 'add_get_index_stringl'); + LFunc(@add_get_index_stringl, 'add_get_index_stringl'); // -- _array_init - _array_init := GetProcAddress(PHPLib, '_array_init'); + LFunc(@_array_init, '_array_init'); // -- _object_init - _object_init := GetProcAddress(PHPLib, '_object_init'); + LFunc(@_object_init, '_object_init'); // -- _object_init_ex - _object_init_ex := GetProcAddress(PHPLib, '_object_init_ex'); + LFunc(@_object_init_ex, '_object_init_ex'); // -- _object_and_properties_init - _object_and_properties_init := GetProcAddress(PHPLib, '_object_and_properties_init'); + LFunc(@_object_and_properties_init, '_object_and_properties_init'); // -- zend_register_internal_class - zend_register_internal_class := GetProcAddress(PHPLib, 'zend_register_internal_class'); + LFunc(@zend_register_internal_class, 'zend_register_internal_class'); // -- zend_register_internal_class_ex - zend_register_internal_class_ex := GetProcAddress(PHPLib, 'zend_register_internal_class_ex'); + LFunc(@zend_register_internal_class_ex, 'zend_register_internal_class_ex'); // -- zend_startup_module - zend_startup_module := GetProcAddress(PHPLib, 'zend_startup_module'); + LFunc(@zend_startup_module, 'zend_startup_module'); // -- zend_startup_module_ex - zend_startup_module_ex := GetProcAddress(PHPLib, 'zend_startup_module_ex'); + LFunc(@zend_startup_module_ex, 'zend_startup_module_ex'); // -- zend_register_module_ex - zend_register_module_ex := GetProcAddress(PHPLib, 'zend_register_module_ex'); + LFunc(@zend_register_module_ex, 'zend_register_module_ex'); // -- zend_register_internal_module - zend_register_internal_module := GetProcAddress(PHPLib, 'zend_register_internal_module'); + LFunc(@zend_register_internal_module, 'zend_register_internal_module'); // -- zend_startup_modules - zend_startup_modules := GetProcAddress(PHPLib, 'zend_startup_modules'); + LFunc(@zend_startup_modules, 'zend_startup_modules'); // -- zend_collect_module_handlers - zend_collect_module_handlers := GetProcAddress(PHPLib, 'zend_collect_module_handlers'); + LFunc(@zend_collect_module_handlers, 'zend_collect_module_handlers'); // -- get_zend_version - get_zend_version := GetProcAddress(PHPLib, 'get_zend_version'); + LFunc(@get_zend_version, 'get_zend_version'); // -- zend_make_printable_zval - zend_make_printable_zval := GetProcAddress(PHPLib, 'zend_make_printable_zval'); + LFunc(@zend_make_printable_zval, 'zend_make_printable_zval'); // -- zend_print_zval - zend_print_zval := GetProcAddress(PHPLib, 'zend_print_zval'); + LFunc(@zend_print_zval, 'zend_print_zval'); // -- zend_print_zval_r - zend_print_zval_r := GetProcAddress(PHPLib, 'zend_print_zval_r'); + LFunc(@zend_print_zval_r, 'zend_print_zval_r'); // -- zend_output_debug_string - zend_output_debug_string := GetProcAddress(PHPLib, 'zend_output_debug_string'); + LFunc(@zend_output_debug_string, 'zend_output_debug_string'); // -- zend_get_parameters - ZendGetParameters := GetProcAddress(PHPLib, 'zend_get_parameters'); + LFunc(@Zend_Get_Parameters, 'zend_get_parameters'); // - zend_get_parameters_ex (native call) - zend_get_params_ex := GetProcAddress(PHPLib, 'zend_get_parameters_ex'); + LFunc(@zend_get_params_ex, 'zend_get_parameters_ex'); {$IFDEF PHP5} - zend_destroy_file_handle := GetProcAddress(PHPLib, 'zend_destroy_file_handle'); + LFunc(@zend_destroy_file_handle, 'zend_destroy_file_handle'); {$ENDIF} - {$IFNDEF QUIET_LOAD} - CheckZendErrors; - {$ENDIF} - - WriteFuncPtr := GetProcAddress(PHPLib, 'zend_write'); + LFunc(WriteFuncPtr, 'zend_write'); if Assigned(WriteFuncPtr) then @zend_write := pointer(WriteFuncPtr^); @@ -3090,11 +3045,6 @@ procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: z class_container.name_length := strlen(class_name); class_container.builtin_functions := functions; {$ENDIF} - {$IFDEF PHP4} - class_container.handle_function_call := nil; - class_container.handle_property_get := nil; - class_container.handle_property_set := nil; - {$ENDIF} end; {$IFNDEF PHP7} function ZEND_FAST_ALLOC: pzval; @@ -3144,29 +3094,6 @@ function MAKE_STD_ZVAL: pzval; INIT_PZVAL(Result); end; -function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer; -var - i : integer; -begin - - if number = 0 then - begin - Result := SUCCESS; - Exit; - end; - {$IFDEF PHP7} - Params.value.arr.nNumOfElements := number; - for i := 0 to number - 1 do - zend_hash_index_add_empty_element(Params.value.arr, i); - Result := ZvalGetArgs(number, @Params); - {$ELSE} - SetLength(Params, number); - for i := 0 to number - 1 do - New(Params[i]); - Result := zend_get_parameters(number, number, Params); - {$ENDIF} -end; - function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer; var i : integer; @@ -3212,40 +3139,17 @@ function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS begin Params[i]^ := p^^; if i <> number then + {$IFDEF CPUX64} + p^ := ppzval( integer(p^) + sizeof(ppzval) ); + {$ELSE} inc(integer(p^), sizeof(ppzval)); + {$ENDIF} end; efree(p); {$ENDIF} end; -{$IFNDEF PHP7} -function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; assembler; register; -asm - push esi - mov esi, ecx - mov ecx, [ebp+8] - cmp ecx, 0 - je @first - @toploop: - {$IFDEF VERSION6} - push [esi][ecx * 4] - {$ELSE} - push dword [esi][ecx * 4] - {$ENDIF} - loop @toploop - @first: - push dword [esi] - push edx - push eax - call ZendGetParameters - mov ecx, [ebp+8] - add ecx, 3 - @toploop2: - pop edx - loop @toploop2 - pop esi -end; -{$ENDIF} + procedure dispose_pzval_array(Params: pzval_array); var i : integer; @@ -3274,271 +3178,6 @@ constructor EPHP4DelphiException.Create(const Msg: zend_ustr); zend_error(E_PARSE, Error); end;} - -{$IFNDEF QUIET_LOAD} -procedure CheckZendErrors; -begin - if @zend_disable_function = nil then raise EPHP4DelphiException.Create('zend_disable_function'); - if @zend_disable_class = nil then raise EPHP4DelphiException.Create('zend_disable_class'); - if @zend_register_list_destructors_ex = nil then raise EPHP4DelphiException.Create('zend_register_list_destructors_ex'); - if @zend_register_resource = nil then raise EPHP4DelphiException.Create('zend_register_resource'); - if @zend_fetch_resource = nil then raise EPHP4DelphiException.Create('zend_fetch_resource'); - if @zend_list_insert = nil then raise EPHP4DelphiException.Create('zend_list_insert'); - {$IFNDEF PHP7} - if @_zend_list_addref = nil then raise EPHP4DelphiException.Create('zend_list_addref'); - if @_zend_list_delete = nil then raise EPHP4DelphiException.Create('zend_list_delete'); - if @_zend_list_find = nil then raise EPHP4DelphiException.Create('_zend_list_find'); - {$ENDIF} - if @zend_rsrc_list_get_rsrc_type = nil then raise EPHP4DelphiException.Create('zend_rsrc_list_get_rsrc_type'); - if @zend_fetch_list_dtor_id = nil then raise EPHP4DelphiException.Create('zend_fetch_list_dtor_id'); - if @zend_get_compiled_filename = nil then raise EPHP4DelphiException.Create('zend_get_compiled_filename'); - if @zend_get_compiled_lineno = nil then raise EPHP4DelphiException.Create('zend_get_compiled_lineno'); - if @tsrm_startup = nil then raise EPHP4DelphiException.Create('tsrm_startup'); - if @ts_allocate_id = nil then raise EPHP4DelphiException.Create('ts_allocate_id'); - if @ts_free_id = nil then raise EPHP4DelphiException.Create('ts_free_id'); - if @zend_strndup = nil then raise EPHP4DelphiException.Create('zend_strndup'); - - if @_emalloc = nil then raise EPHP4DelphiException.Create('_emalloc'); - if @_efree = nil then raise EPHP4DelphiException.Create('_efree'); - if @_ecalloc = nil then raise EPHP4DelphiException.Create('_ecalloc'); - if @_erealloc = nil then raise EPHP4DelphiException.Create('_erealloc'); - if @_estrdup = nil then raise EPHP4DelphiException.Create('_estrdup'); - if @_estrndup = nil then raise EPHP4DelphiException.Create('_estrndup'); - if @zend_set_memory_limit = nil then raise EPHP4DelphiException.Create('zend_set_memory_limit'); - if @start_memory_manager = nil then raise EPHP4DelphiException.Create('start_memory_manager'); - if @shutdown_memory_manager = nil then raise EPHP4DelphiException.Create('shutdown_memory_manager'); - {$IFDEF PHP4} - if @zend_hash_init = nil then raise EPHP4DelphiException.Create('zend_hash_init'); - if @zend_hash_init_ex = nil then raise EPHP4DelphiException.Create('zend_hash_init_ex'); - if @zend_hash_add_or_update = nil then raise EPHP4DelphiException.Create('zend_hash_add_or_update'); - if @zend_hash_quick_add_or_update = nil then raise EPHP4DelphiException.Create('zend_hash_quick_add_or_update'); - if @zend_hash_index_update_or_next_insert = nil then raise EPHP4DelphiException.Create('zend_hash_index_update_or_next_insert'); - if @zend_hash_merge = nil then raise EPHP4DelphiException.Create('zend_hash_merge'); - {$ENDIF} - - {$IFDEF PHP5} - if @_zend_hash_add_or_update = nil then raise EPHP4DelphiException.Create('_zend_hash_add_or_update'); - {$ENDIF} - - if @zend_hash_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_destroy'); - if @zend_hash_clean = nil then raise EPHP4DelphiException.Create('zend_hash_clean'); - if @zend_hash_add_empty_element = nil then raise EPHP4DelphiException.Create('zend_hash_add_empty_element'); - if @zend_hash_graceful_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_graceful_destroy'); - if @zend_hash_graceful_reverse_destroy = nil then raise EPHP4DelphiException.Create('zend_hash_graceful_reverse_destroy'); - if @zend_hash_apply = nil then raise EPHP4DelphiException.Create('zend_hash_apply'); - if @zend_hash_apply_with_argument = nil then raise EPHP4DelphiException.Create('zend_hash_apply_with_argument'); - if @zend_hash_reverse_apply = nil then raise EPHP4DelphiException.Create('zend_hash_reverse_apply'); - if @zend_hash_del_key_or_index = nil then raise EPHP4DelphiException.Create('zend_hash_del_key_or_index'); - if @zend_get_hash_value = nil then raise EPHP4DelphiException.Create('zend_get_hash_value'); - if @zend_hash_find = nil then raise EPHP4DelphiException.Create('zend_hash_find'); - if @zend_hash_quick_find = nil then raise EPHP4DelphiException.Create('zend_hash_quick_find'); - if @zend_hash_index_find = nil then raise EPHP4DelphiException.Create('zend_hash_index_find'); - if @zend_hash_exists = nil then raise EPHP4DelphiException.Create('zend_hash_exists'); - if @zend_hash_index_exists = nil then raise EPHP4DelphiException.Create('zend_hash_index_exists'); - {$IFDEF PHP7} - if @_zend_hash_add = nil then raise EPHP4DelphiException.Create('_zend_hash_add'); - if @_zend_hash_add_or_update = nil then raise EPHP4DelphiException.Create('_zend_hash_add_or_update'); - - if @zend_hash_index_findZval = nil then raise EPHP4DelphiException.Create('zend_hash_index_findZval'); - if @zend_symtable_findTest = nil then raise EPHP4DelphiException.Create('zend_symtable_findTest'); - if @zend_hash_index_existsZval = nil then raise EPHP4DelphiException.Create('zend_hash_index_existsZval'); - - {$ENDIF} - {$IFNDEF PHP7} - if @zend_hash_next_free_element = nil then raise EPHP4DelphiException.Create('zend_hash_next_free_element'); - {$ENDIF} - if @zend_hash_move_forward_ex = nil then raise EPHP4DelphiException.Create('zend_hash_move_forward_ex'); - if @zend_hash_move_backwards_ex = nil then raise EPHP4DelphiException.Create('zend_hash_move_backwards_ex'); - if @zend_hash_get_current_key_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_key_ex'); - if @zend_hash_get_current_key_type_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_key_type_ex'); - if @zend_hash_get_current_data_ex = nil then raise EPHP4DelphiException.Create('zend_hash_get_current_data_ex'); - if @zend_hash_internal_pointer_reset_ex = nil then raise EPHP4DelphiException.Create('zend_hash_internal_pointer_reset_ex'); - if @zend_hash_internal_pointer_end_ex = nil then raise EPHP4DelphiException.Create('zend_hash_internal_pointer_end_ex'); - if @zend_hash_copy = nil then raise EPHP4DelphiException.Create('zend_hash_copy'); - if @zend_hash_sort = nil then raise EPHP4DelphiException.Create('zend_hash_sort'); - if @zend_hash_compare = nil then raise EPHP4DelphiException.Create('zend_hash_compare'); - if @zend_hash_minmax = nil then raise EPHP4DelphiException.Create('zend_hash_minmax'); - if @zend_hash_num_elements = nil then raise EPHP4DelphiException.Create('zend_hash_num_elements'); - if @zend_hash_rehash = nil then raise EPHP4DelphiException.Create('zend_hash_rehash'); - if @zend_hash_func = nil then raise EPHP4DelphiException.Create('zend_hash_func'); - if @zend_get_constant = nil then raise EPHP4DelphiException.Create('zend_get_constant'); - if @zend_register_long_constant = nil then raise EPHP4DelphiException.Create('zend_register_long_constant'); - if @zend_register_double_constant = nil then raise EPHP4DelphiException.Create('zend_register_double_constant'); - if @zend_register_string_constant = nil then raise EPHP4DelphiException.Create('zend_register_string_constant'); - if @zend_register_stringl_constant = nil then raise EPHP4DelphiException.Create('zend_register_stringl_constant'); - if @zend_register_constant = nil then raise EPHP4DelphiException.Create('zend_register_constant'); - if @tsrm_shutdown = nil then raise EPHP4DelphiException.Create('tsrm_shutdown'); - if @ts_resource_ex = nil then raise EPHP4DelphiException.Create('ts_resource_ex'); - if @ts_free_thread = nil then raise EPHP4DelphiException.Create('ts_free_thread'); - if @zend_error = nil then raise EPHP4DelphiException.Create('zend_error'); - if @zend_error_cb = nil then raise EPHP4DelphiException.Create('zend_error_cb'); - if @zend_eval_string = nil then raise EPHP4DelphiException.Create('zend_eval_string'); - if @zend_make_compiled_string_description = nil then raise EPHP4DelphiException.Create('zend_make_compiled_string_description'); - - {$IFDEF PHP4} - if @_zval_dtor = nil then raise EPHP4DelphiException.Create('_zval_dtor'); - if @_zval_copy_ctor = nil then raise EPHP4DelphiException.Create('_zval_copy_ctor'); - {$ELSE} - if @_zval_dtor_func = nil then raise EPHP4DelphiException.Create('_zval_dtor_func'); - if @_zval_copy_ctor_func = nil then raise EPHP4DelphiException.Create('_zval_copy_ctor_func'); - {$ENDIF} - - if @zend_print_variable = nil then raise EPHP4DelphiException.Create('zend_print_variable'); - if @zend_stack_init = nil then raise EPHP4DelphiException.Create('zend_stack_init'); - if @zend_stack_push = nil then raise EPHP4DelphiException.Create('zend_stack_push'); - if @zend_stack_top = nil then raise EPHP4DelphiException.Create('zend_stack_top'); - if @zend_stack_del_top = nil then raise EPHP4DelphiException.Create('zend_stack_del_top'); - if @zend_stack_int_top = nil then raise EPHP4DelphiException.Create('zend_stack_int_top'); - if @zend_stack_is_empty = nil then raise EPHP4DelphiException.Create('zend_stack_is_empty'); - if @zend_stack_destroy = nil then raise EPHP4DelphiException.Create('zend_stack_destroy'); - if @zend_stack_base = nil then raise EPHP4DelphiException.Create('zend_stack_base'); - if @zend_stack_count = nil then raise EPHP4DelphiException.Create('zend_stack_count'); - if @zend_stack_apply = nil then raise EPHP4DelphiException.Create('zend_stack_apply'); - if @zend_stack_apply_with_argument = nil then raise EPHP4DelphiException.Create('zend_stack_apply_with_argument'); - if @_convert_to_string = nil then raise EPHP4DelphiException.Create('_convert_to_string'); - if @add_function = nil then raise EPHP4DelphiException.Create('add_function'); - if @sub_function = nil then raise EPHP4DelphiException.Create('sub_function'); - if @mul_function = nil then raise EPHP4DelphiException.Create('mul_function'); - if @div_function = nil then raise EPHP4DelphiException.Create('div_function'); - if @mod_function = nil then raise EPHP4DelphiException.Create('mod_function'); - if @boolean_xor_function = nil then raise EPHP4DelphiException.Create('boolean_xor_function'); - if @boolean_not_function = nil then raise EPHP4DelphiException.Create('boolean_not_function'); - if @bitwise_not_function = nil then raise EPHP4DelphiException.Create('bitwise_not_function'); - if @bitwise_or_function = nil then raise EPHP4DelphiException.Create('bitwise_or_function'); - if @bitwise_and_function = nil then raise EPHP4DelphiException.Create('bitwise_and_function'); - if @bitwise_xor_function = nil then raise EPHP4DelphiException.Create('bitwise_xor_function'); - if @shift_left_function = nil then raise EPHP4DelphiException.Create('shift_left_function'); - if @shift_right_function = nil then raise EPHP4DelphiException.Create('shift_right_function'); - if @concat_function = nil then raise EPHP4DelphiException.Create('concat_function'); - if @is_equal_function = nil then raise EPHP4DelphiException.Create('is_equal_function'); - if @is_identical_function = nil then raise EPHP4DelphiException.Create('is_identical_function'); - if @is_not_identical_function = nil then raise EPHP4DelphiException.Create('is_not_identical_function'); - if @is_not_equal_function = nil then raise EPHP4DelphiException.Create('is_not_equal_function'); - if @is_smaller_function = nil then raise EPHP4DelphiException.Create('is_smaller_function'); - if @is_smaller_or_equal_function = nil then raise EPHP4DelphiException.Create('is_smaller_or_equal_function'); - if @increment_function = nil then raise EPHP4DelphiException.Create('increment_function'); - if @decrement_function = nil then raise EPHP4DelphiException.Create('decrement_function'); - if @convert_scalar_to_number = nil then raise EPHP4DelphiException.Create('convert_scalar_to_number'); - if @convert_to_long = nil then raise EPHP4DelphiException.Create('convert_to_long'); - if @convert_to_double = nil then raise EPHP4DelphiException.Create('convert_to_double'); - if @convert_to_long_base = nil then raise EPHP4DelphiException.Create('convert_to_long_base'); - if @convert_to_null = nil then raise EPHP4DelphiException.Create('convert_to_null'); - if @convert_to_boolean = nil then raise EPHP4DelphiException.Create('convert_to_boolean'); - if @convert_to_array = nil then raise EPHP4DelphiException.Create('convert_to_array'); - if @convert_to_object = nil then raise EPHP4DelphiException.Create('convert_to_object'); - if @add_char_to_string = nil then raise EPHP4DelphiException.Create('add_char_to_string'); - if @add_string_to_string = nil then raise EPHP4DelphiException.Create('add_string_to_string'); - if @zend_string_to_double = nil then raise EPHP4DelphiException.Create('zend_string_to_double'); - if @zval_is_true = nil then raise EPHP4DelphiException.Create('zval_is_true'); - if @compare_function = nil then raise EPHP4DelphiException.Create('compare_function'); - if @numeric_compare_function = nil then raise EPHP4DelphiException.Create('numeric_compare_function'); - if @string_compare_function = nil then raise EPHP4DelphiException.Create('string_compare_function'); - if @zend_str_tolower = nil then raise EPHP4DelphiException.Create('zend_str_tolower'); - if @zend_binary_zval_strcmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strcmp'); - if @zend_binary_zval_strncmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strncmp'); - if @zend_binary_zval_strcasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strcasecmp'); - if @zend_binary_zval_strncasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_zval_strncasecmp'); - if @zend_binary_strcmp = nil then raise EPHP4DelphiException.Create('zend_binary_strcmp'); - if @zend_binary_strncmp = nil then raise EPHP4DelphiException.Create('zend_binary_strncmp'); - if @zend_binary_strcasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_strcasecmp'); - if @zend_binary_strncasecmp = nil then raise EPHP4DelphiException.Create('zend_binary_strncasecmp'); - if @zendi_smart_strcmp = nil then raise EPHP4DelphiException.Create('zendi_smart_strcmp'); - if @zend_compare_symbol_tables = nil then raise EPHP4DelphiException.Create('zend_compare_symbol_tables'); - if @zend_compare_arrays = nil then raise EPHP4DelphiException.Create('zend_compare_arrays'); - if @zend_compare_objects = nil then raise EPHP4DelphiException.Create('zend_compare_objects'); - if @zend_atoi = nil then raise EPHP4DelphiException.Create('zend_atoi'); - if @get_active_function_name = nil then raise EPHP4DelphiException.Create('get_active_function_name'); - if @zend_get_executed_filename = nil then raise EPHP4DelphiException.Create('zend_get_executed_filename'); - if @zend_set_timeout = nil then raise EPHP4DelphiException.Create('zend_set_timeout'); - if @zend_unset_timeout = nil then raise EPHP4DelphiException.Create('zend_unset_timeout'); - if @zend_timeout = nil then raise EPHP4DelphiException.Create('zend_timeout'); - if @zend_highlight = nil then raise EPHP4DelphiException.Create('zend_highlight'); - if @zend_strip = nil then raise EPHP4DelphiException.Create('zend_strip'); - if @highlight_file = nil then raise EPHP4DelphiException.Create('highlight_file'); - if @highlight_string = nil then raise EPHP4DelphiException.Create('highlight_string'); - if @zend_html_putc = nil then raise EPHP4DelphiException.Create('zend_html_putc'); - if @zend_html_puts = nil then raise EPHP4DelphiException.Create('zend_html_puts'); - {$IFDEF PHP7} - if @zend_parse_parameters_throw = nil then EPHP4DelphiException.Create('zend_parse_parameters_throw'); - if @ZvalGetArgs = nil then EPHP4DelphiException.Create('ZvalGetArgs'); - if @_zend_get_parameters_array_ex = nil then EPHP4DelphiException.Create('_zend_get_parameters_array_ex'); - {$ELSE} - if @zend_indent = nil then raise EPHP4DelphiException.Create('zend_indent'); - {$ENDIF} - if @_zend_get_parameters_array_ex = nil then raise EPHP4DelphiException.Create('_zend_get_parameters_array_ex'); - if @zend_ini_refresh_caches = nil then raise EPHP4DelphiException.Create('zend_ini_refresh_caches'); - if @zend_alter_ini_entry = nil then raise EPHP4DelphiException.Create('zend_alter_ini_entry'); - if @zend_restore_ini_entry = nil then raise EPHP4DelphiException.Create('zend_restore_ini_entry'); - if @zend_ini_long = nil then raise EPHP4DelphiException.Create('zend_ini_long'); - if @zend_ini_double = nil then raise EPHP4DelphiException.Create('zend_ini_double'); - if @zend_ini_string = nil then raise EPHP4DelphiException.Create('zend_ini_string'); - if @compile_string = nil then raise EPHP4DelphiException.Create('compile_string'); - if @execute = nil then raise EPHP4DelphiException.Create('execute'); - if @zend_wrong_param_count = nil then raise EPHP4DelphiException.Create('zend_wrong_param_count'); - if @add_property_long_ex = nil then raise EPHP4DelphiException.Create('add_property_long_ex'); - if @add_property_null_ex = nil then raise EPHP4DelphiException.Create('add_property_null_ex'); - if @add_property_bool_ex = nil then raise EPHP4DelphiException.Create('add_property_bool_ex'); - if @add_property_resource_ex = nil then raise EPHP4DelphiException.Create('add_property_resource_ex'); - if @add_property_double_ex = nil then raise EPHP4DelphiException.Create('add_property_double_ex'); - if @add_property_string_ex = nil then raise EPHP4DelphiException.Create('add_property_string_ex'); - if @add_property_stringl_ex = nil then raise EPHP4DelphiException.Create('add_property_stringl_ex'); - if @add_property_zval_ex = nil then raise EPHP4DelphiException.Create('add_property_zval_ex'); - if @call_user_function = nil then raise EPHP4DelphiException.Create('call_user_function'); - {$IFNDEF P_CUT} - if @call_user_function_ex = nil then raise EPHP4DelphiException.Create('call_user_function_ex'); - {$ENDIF} - if @add_assoc_long_ex = nil then raise EPHP4DelphiException.Create('add_assoc_long_ex'); - if @add_assoc_null_ex = nil then raise EPHP4DelphiException.Create('add_assoc_null_ex'); - if @add_assoc_bool_ex = nil then raise EPHP4DelphiException.Create('add_assoc_bool_ex'); - if @add_assoc_resource_ex = nil then raise EPHP4DelphiException.Create('add_assoc_resource_ex'); - if @add_assoc_double_ex = nil then raise EPHP4DelphiException.Create('add_assoc_double_ex'); - if @add_assoc_string_ex = nil then raise EPHP4DelphiException.Create('add_assoc_string_ex'); - if @add_assoc_stringl_ex = nil then raise EPHP4DelphiException.Create('add_assoc_stringl_ex'); - if @add_assoc_zval_ex = nil then raise EPHP4DelphiException.Create('add_assoc_zval_ex'); - if @add_index_long = nil then raise EPHP4DelphiException.Create('add_index_long'); - if @add_index_null = nil then raise EPHP4DelphiException.Create('add_index_null'); - if @add_index_bool = nil then raise EPHP4DelphiException.Create('add_index_bool'); - if @add_index_resource = nil then raise EPHP4DelphiException.Create('add_index_resource'); - if @add_index_double = nil then raise EPHP4DelphiException.Create('add_index_double'); - if @add_index_string = nil then raise EPHP4DelphiException.Create('add_index_string'); - if @add_index_stringl = nil then raise EPHP4DelphiException.Create('add_index_stringl'); - if @add_index_zval = nil then raise EPHP4DelphiException.Create('add_index_zval'); - if @add_next_index_long = nil then raise EPHP4DelphiException.Create('add_next_index_long'); - if @add_next_index_null = nil then raise EPHP4DelphiException.Create('add_next_index_null'); - if @add_next_index_bool = nil then raise EPHP4DelphiException.Create('add_next_index_bool'); - if @add_next_index_resource = nil then raise EPHP4DelphiException.Create('add_next_index_resource'); - if @add_next_index_double = nil then raise EPHP4DelphiException.Create('add_next_index_double'); - if @add_next_index_string = nil then raise EPHP4DelphiException.Create('add_next_index_string'); - if @add_next_index_stringl = nil then raise EPHP4DelphiException.Create('add_next_index_stringl'); - if @add_next_index_zval = nil then raise EPHP4DelphiException.Create('add_next_index_zval'); - if @add_get_assoc_string_ex = nil then raise EPHP4DelphiException.Create('add_get_assoc_string_ex'); - if @add_get_assoc_stringl_ex = nil then raise EPHP4DelphiException.Create('add_get_assoc_stringl_ex'); - if @add_get_index_long = nil then raise EPHP4DelphiException.Create('add_get_index_long'); - if @add_get_index_double = nil then raise EPHP4DelphiException.Create('add_get_index_double'); - if @add_get_index_string = nil then raise EPHP4DelphiException.Create('add_get_index_string'); - if @add_get_index_stringl = nil then raise EPHP4DelphiException.Create('add_get_index_stringl'); - if @_array_init = nil then raise EPHP4DelphiException.Create('_array_init'); - if @_object_init = nil then raise EPHP4DelphiException.Create('_object_init'); - if @_object_init_ex = nil then raise EPHP4DelphiException.Create('_object_init_ex'); - if @_object_and_properties_init = nil then raise EPHP4DelphiException.Create('_object_and_properties_init'); - if @zend_register_internal_class = nil then raise EPHP4DelphiException.Create('zend_register_internal_class'); - if @zend_register_internal_class_ex = nil then raise EPHP4DelphiException.Create('zend_register_internal_class_ex'); - if @zend_startup_module = nil then raise EPHP4DelphiException.Create('zend_startup_module'); - if @zend_startup_module_ex = nil then raise EPHP4DelphiException.Create('zend_startup_module_ex'); - if @zend_register_module_ex = nil then raise EPHP4DelphiException.Create('zend_register_module_ex'); - if @zend_register_internal_module = nil then raise EPHP4DelphiException.Create('zend_register_internal_module'); - if @zend_startup_modules = nil then raise EPHP4DelphiException.Create('zend_startup_modules'); - if @zend_collect_module_handlers = nil then raise EPHP4DelphiException.Create('zend_collect_module_handlers'); - - if @get_zend_version = nil then raise EPHP4DelphiException.Create('get_zend_version'); - if @zend_make_printable_zval = nil then raise EPHP4DelphiException.Create('zend_make_printable_zval'); - if @zend_print_zval = nil then raise EPHP4DelphiException.Create('zend_print_zval'); - if @zend_print_zval_r = nil then raise EPHP4DelphiException.Create('zend_print_zval_r'); - if @zend_output_debug_string = nil then raise EPHP4DelphiException.Create('zend_output_debug_string'); - if @ZendGetParameters = nil then raise EPHP4DelphiException.Create('zend_get_parameters'); -end; -{$ENDIF} - function zend_hash_get_current_data(ht: {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; pData: Pointer): Integer; cdecl; begin result := zend_hash_get_current_data_ex(ht, pData, cardinal(nil)); @@ -3559,13 +3198,6 @@ function tsrmls_fetch : pointer; result := ts_resource_ex(0, nil); end; -{$IFDEF PHP4} -function zval_copy_ctor(val : pzval) : integer; -begin - result := _zval_copy_ctor(val, nil, 0); -end; -{$ENDIF} - function zend_unregister_functions(functions : {$IFDEF PHP7}P_zend_function_entry{$ELSE}pzend_function_entry{$ENDIF}; count : integer; function_table : {$IFDEF PHP7} Pzend_array {$ELSE} PHashTable{$ENDIF}; TSRMLS_DC : pointer) : integer; var i : integer; @@ -3669,30 +3301,41 @@ function zend_register_functions(functions : {$IFDEF PHP7}P_zend_function_entry{ end; - +function __asm_fetchval +{$IFDEF CPUX64} +(val_id: int64; tsrmls_dc_p: pointer) +{$ELSE} +(val_id: integer; tsrmls_dc_p: pointer) +{$ENDIF} +: pointer; assembler; register; +{$IFDEF CPUX64} +asm + mov rcx, val_id + mov rdx, dword64 ptr tsrmls_dc_p + mov rax, dword64 ptr [rdx] + mov rcx, dword64 ptr [rax+rcx*8-8] + mov Result, rcx +end; +{$ELSE} +asm + mov ecx, val_id + mov edx, dword ptr tsrmls_dc_p + mov eax, dword ptr [edx] + mov ecx, dword ptr [eax+ecx*4-4] + mov Result, ecx +end; +{$ENDIF} function GetGlobalResource(resource_name: AnsiString) : pointer; var global_id : pointer; - global_value : integer; - global_ptr : pointer; - tsrmls_dc : pointer; begin Result := nil; try global_id := GetProcAddress(PHPLib, zend_pchar(resource_name)); if Assigned(global_id) then begin - tsrmls_dc := tsrmls_fetch; - global_value := integer(global_id^); - asm - mov ecx, global_value - mov edx, dword ptr tsrmls_dc - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov global_ptr, ecx - end; - Result := global_ptr; + Result := __asm_fetchval(integer(global_id^), tsrmls_fetch); end; except Result := nil; @@ -3702,23 +3345,13 @@ function GetGlobalResource(resource_name: AnsiString) : pointer; function GetGlobalResourceDC(resource_name: AnsiString;TSRMLS_DC:pointer) : pointer; var global_id : pointer; - global_value : integer; - global_ptr : pointer; begin Result := nil; try global_id := GetProcAddress(PHPLib, zend_pchar(resource_name)); if Assigned(global_id) then begin - global_value := integer(global_id^); - asm - mov ecx, global_value - mov edx, dword ptr TSRMLS_DC - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov global_ptr, ecx - end; - Result := global_ptr; + Result := __asm_fetchval(integer(global_id^), TSRMLS_DC); end; except Result := nil; @@ -3763,6 +3396,20 @@ procedure copy_zend_constant(C: PZendConstant); cdecl; end; function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : integer; cdecl; assembler; +{$IFDEF CPUX64} +asm + mov rax, [rsp + 32] + mov rcx, [rsp + 24] + mov rdx, [rsp + 16] + pop rbp + push rax + push rcx + push rdx + call _object_init_ex + add rsp, $0c + ret +end; +{$ELSE} asm mov eax, [esp + 16] mov ecx, [esp + 12] @@ -3775,6 +3422,7 @@ function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : i add esp, $0c ret end; +{$ENDIF} function Z_LVAL(z : pzval) : longint; @@ -3948,6 +3596,79 @@ function Z_STRWVAL(z : pzval) : String; end; end; +function Z_CHAR(z: PZval) : zend_uchar; +var S: zend_ustr; +begin +Result := #0; + if z = nil then + exit; + + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then + S := z.value.str.val + else + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of + IS_LONG: S := IntToStr(z.value.lval); + IS_DOUBLE: S := FloatToStr(z.value.dval); + IS_BOOL: if z.value.lval = 0 then S := '0' else S := '1'; + end; + SetLength(S,1); + Result := zend_uchar(S[1]); +end; +function Z_ACHAR(z: PZVAL): AnsiChar; +var S: AnsiString; +begin +Result := #0; + if z = nil then + exit; + + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then + S := z.value.str.val + else + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of + IS_LONG: S := IntToStr(z.value.lval); + IS_DOUBLE: S := FloatToStr(z.value.dval); + IS_BOOL: if z.value.lval = 0 then S := '0' else S := '1'; + end; + SetLength(S,1); + Result := AnsiChar(S[1]); +end; +function Z_WCHAR(z: PZVAL): WideChar; +var S: WideString; +begin +Result := #0; + if z = nil then + exit; + + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then + S := z.value.str.val + else + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of + IS_LONG: S := IntToStr(z.value.lval); + IS_DOUBLE: S := FloatToStr(z.value.dval); + IS_BOOL: if z.value.lval = 0 then S := '0' else S := '1'; + end; + SetLength(S,1); + Result := WideChar(S[1]); +end; +function Z_UCHAR(z: PZVAL): UTF8Char; +var S: UTF8String; +begin +Result := #0; + if z = nil then + exit; + + if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then + S := z.value.str.val + else + case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of + IS_LONG: S := IntToStr(z.value.lval); + IS_DOUBLE: S := FloatToStr(z.value.dval); + IS_BOOL: if z.value.lval = 0 then S := '0' else S := '1'; + end; + SetLength(S,1); + Result := Utf8Char(S[1]); +end; + function Z_STRLEN(z : pzval) : longint; begin Result := Length(Z_STRVAL(z)); @@ -3968,15 +3689,14 @@ function Z_OBJ_HT(z : pzval) : {$IFDEF PHP7}hzend_types.P_zend_object_handlers{$ Result := z.value.obj.handlers; end; -function Z_OBJPROP(z : pzval) : {$IFDEF PHP7}hzend_types.PHashTable{$ELSE}PHashTable{$ENDIF}; +function Z_OBJPROP(z : pzval;TSRMLS_DC:pointer=nil) : {$IFDEF PHP7}hzend_types.PHashTable{$ELSE}PHashTable{$ENDIF}; {$IFDEF PHP7} begin Result := Z_OBJ_HT(z)^.get_properties(z); end; {$ELSE} -var - TSRMLS_DC : pointer; begin + if TSRMLS_DC = nil then TSRMLS_DC := ts_resource_ex(0, nil); Result := Z_OBJ_HT(z)^.get_properties(@z, TSRMLS_DC); end; diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index b48329a..0de67d3 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -478,12 +478,27 @@ interface { Common Types } type - zend_uint = uint; + CharPtr = + {$IFDEF VERSION12} + WideChar + {$ELSE} + AnsiChar + {$ENDIF}; + {$IFDEF CPUX64} + IntPtr = Int64; + UIntPtr = UInt64; + ULongPtr = ULong64; + {$ELSE} + IntPtr = Longint; + UIntPtr = LongWord; + ULongPtr = ULong; + {$ENDIF} + zend_uint = UIntPtr; zend_bool = boolean; zend_uchar = {$IFDEF PHP_UNICE}Utf8Char{$ELSE}AnsiChar{$ENDIF}; zend_ustr = {$IFDEF PHP_UNICE}Utf8String{$ELSE}AnsiString{$ENDIF}; - zend_ulong = ulong; - zend_long = integer; + zend_ulong = ULongPtr; + zend_long = IntPtr; zend_pchar = {$IFDEF PHP_UNICE}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; zend_pstr = {$IFDEF PHP_UNICE}PUtf8String{$ELSE}PAnsiString{$ENDIF}; {$IFDEF PHP7} @@ -800,23 +815,7 @@ zend_function = record Pzend_class_entry = ^Tzend_class_entry; PPZend_class_entry = ^PZend_class_entry; {$ENDIF} - {$IFDEF PHP4} - Tzend_class_entry = - record - _type: zend_uchar; - name: zend_pchar; - name_length: uint; - parent: pointer; - refcount: pointer; - constants_updated: boolean; - function_table: THashTable; - default_properties: THashTable; - builtin_functions: pointer; - handle_function_call: pointer; - handle_property_get: pointer; - handle_property_set: pointer; - end; - {$ELSE} + {$IFNDEF PHP7} Tzend_class_entry = record _type : zend_uchar; @@ -879,7 +878,7 @@ Tzend_class_entry = record module : pointer; end; {$ENDIF} - {$ENDIF} + {$IFNDEF PHP7} //P_zend_object_handlers = ^_zend_object_handlers; Pzend_Object = ^Tzend_object; @@ -912,7 +911,7 @@ _zend_object = record Tzend_object_get_classname = function(_object : pointer; class_name : pointer; class_name_len : pointer; p : integer; TSRMLS_DC : pointer) : integer; cdecl; {$IFNDEF PHP7} - zend_object_handlers = record + _zend_object_handlers = record // general object functions add_ref : pointer; del_ref : pointer; @@ -946,7 +945,8 @@ zend_object_handlers = record {$ENDIF} zend_object_handle = cardinal; {$IFNDEF PHP7} - pzend_object_handlers = ^zend_object_handlers; + zend_object_handlers = _zend_object_handlers; + pzend_object_handlers = ^_zend_object_handlers; _zend_object_value = record @@ -969,24 +969,10 @@ zvalue_value = record len: integer; end); 3: (ht: PHashTable); - {$IFDEF PHP4} - 4: (obj: Tzend_Object); - {$ELSE} 4 : (obj : _zend_object_value); - {$ENDIF} end; pppzval = ^ppzval; ppzval = ^pzval; - {$IFDEF PHP4} - Pzval = ^zval; - zval = record - value: zvalue_value; - _type: Byte; - is_ref: Byte; - refcount: Smallint; - end; - Tzval = zval; - {$ELSE} pzval = ^zval; zval = record @@ -995,14 +981,14 @@ zval = record _type : byte; is_ref : byte; end; - {$ENDIF} + {$ENDIF} ppzval_array = ^pzval_array; + pzval_array = array of ppzval; pzval_array_ex = array of pzval; - type PZend_rsrc_list_entry = ^zend_rsrc_list_entry; zend_rsrc_list_entry = record @@ -1088,7 +1074,7 @@ _zend_stream = record PZendFileHandle = ^TZendFileHandle; zend_file_handle = record - {$IFDEF PHP530} + {$IF Defined(PHP530) or Defined(PHP540) or Defined(PHP550) or Defined(PHP560) or Defined(PHP700)} _type : zend_stream_type; {$ELSE} _type: uchar; @@ -1098,22 +1084,19 @@ _zend_stream = record handle: record case Integer of - 1: - ( - fd: Integer; - ); - 2: - ( - fp: pointer; - ); - {$IFDEF PHP5} - 3 : - ( - stream : TZendStream; - ); + {$IFDEF PHP7} + 0:( fd: Integer; ); + 1:( fp: pointer; ); + 2 : ( stream : TZendStream; ); + {$ELSE} + 1:( fd: Integer; ); + 2:( fp: pointer; ); + {$IFDEF PHP5} + 3 : ( stream : TZendStream; ); + {$ENDIF} {$ENDIF} end; - free_filename: shortint; + free_filename: {$IFDEF PHP7}byte{$ELSE}shortint{$ENDIF}; end; TZendFileHandle = zend_file_handle; @@ -1180,13 +1163,9 @@ _zend_arg_info = record zend_function_entry = record fname: zend_pchar; handler: pointer; - {$IFDEF PHP4} - func_arg_types: Pbyte; - {$ELSE} arg_info : PZendArgInfo; num_args : zend_uint; flags : zend_uint; - {$ENDIF} end; Tzend_function_entry = zend_function_entry; TZendFunctionEntry = zend_function_entry; @@ -1502,21 +1481,10 @@ zend_executor_globals = record symtable_cache_ptr : ^PHashTable; opline_ptr : pointer; - - {$IFDEF PHP4} - current_execute_data : pointer; - {$ENDIF} - active_symbol_table : PHashTable; symbol_table : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; // main symbol table - included_files : {$IFDEF PHP7}HashTable{$ELSE}THashTable{$ENDIF}; // files already included */ - - {$IFDEF PHP4} - bailout : jump_buf; - {$ELSE} bailout : p_jump_buf; - {$ENDIF} error_reporting : integer; orig_error_reporting : integer; @@ -1545,10 +1513,6 @@ zend_executor_globals = record {$ENDIF} {$ENDIF} - {$IFDEF PHP4} - bailout_set : zend_bool; - {$ENDIF} - full_tables_cleanup : zend_bool; {$IFDEF PHP5} ze1_compatibility_mode : zend_bool; diff --git a/Source/php4AppUnit.pas b/Source/php4AppUnit.pas index 71e903b..459d395 100644 --- a/Source/php4AppUnit.pas +++ b/Source/php4AppUnit.pas @@ -35,9 +35,7 @@ TPHPInfoBlock = class private FBuffer : zend_ustr; FVarList : TStringList; - {$IFDEF PHP5} FVirtualStream : TMemoryStream; - {$ENDIF} procedure SetVarList(AValue : TStringList); public constructor Create; virtual; @@ -190,26 +188,23 @@ procedure PrepareStartup; php_delphi_module.module_shutdown_func := nil; php_delphi_module.info_func := @php_info_delphi; php_delphi_module.version := '7.4'; - {$IFDEF PHP4} - php_delphi_module.global_startup_func := nil; - {$ENDIF} php_delphi_module.request_shutdown_func := nil; - {$IFDEF PHP5} + {$IFNDEF PHP520} php_delphi_module.global_id := 0; {$ENDIF} - {$ENDIF} + php_delphi_module.module_started := 0; php_delphi_module._type := 0; php_delphi_module.handle := nil; php_delphi_module.module_number := 0; {$IFDEF PHP530} - {$IFNDEF COMPILER_VC9} - php_delphi_module.build_id := strdup(zend_pchar(ZEND_MODULE_BUILD_ID)); - {$ELSE} - php_delphi_module.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); - {$ENDIF} + {$IFNDEF COMPILER_VC9} + php_delphi_module.build_id := strdup(zend_pchar(ZEND_MODULE_BUILD_ID)); + {$ELSE} + php_delphi_module.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); + {$ENDIF} {$ENDIF} end; @@ -228,18 +223,7 @@ procedure PrepareResult(RequestID : integer; TSRMLS_D : pointer); begin InfoBlock := TPHPInfoBlock(RequestID); - - {$IFDEF PHP4} - ht := GetSymbolsTable - {$ELSE} - begin - EG := GetExecutorGlobals; - if Assigned(EG) then - ht := @EG.symbol_table - else - ht := nil; - end ; - {$ENDIF} + ht := GetSymbolsTable; if Assigned(ht) then begin @@ -285,8 +269,7 @@ function ExecutePHP(RequestID : integer; FileName : zend_pchar) : integer; stdca file_handle.opened_path := nil; file_handle.free_filename := 0; file_handle.handle.fp := nil; - - PG(TSRMLS_D)^.register_globals := true; + GetPHPGlobals(TSRMLS_D)^.register_globals := true; gl := GetSAPIGlobals; TPHPInfoBlock(RequestID).FBuffer := ''; gl^.server_context := pointer(RequestID); @@ -295,9 +278,8 @@ function ExecutePHP(RequestID : integer; FileName : zend_pchar) : integer; stdca php_request_startup(TSRMLS_D); result := php_execute_script(@file_handle, TSRMLS_D); - {$IFDEF PHP5} zend_destroy_file_handle(@file_handle, TSRMLS_D); - {$ENDIF} + PrepareResult(RequestID, TSRMLS_D); php_request_shutdown(nil); except @@ -477,7 +459,7 @@ function ExecuteCode(RequestID : integer; ACode : zend_pchar) : integer; stdcall TSRMLS_D := ts_resource_ex(0, nil); - PG(TSRMLS_D)^.register_globals := true; + GetPHPGlobals(TSRMLS_D)^.register_globals := true; gl := GetSAPIGlobals; TPHPInfoBlock(RequestID).FBuffer := ''; gl^.server_context := pointer(RequestID); @@ -645,19 +627,15 @@ constructor TPHPInfoBlock.Create; inherited Create; FBuffer := ''; FVarList := TStringList.Create; - {$IFDEF PHP5} FVirtualStream := TMemoryStream.Create; - {$ENDIF} end; destructor TPHPInfoBlock.Destroy; begin FBuffer := ''; FVarList.Free; - {$IFDEF PHP5} if FVirtualStream <> nil then FreeAndNil(FVirtualStream); - {$ENDIF} inherited; end; @@ -733,7 +711,9 @@ procedure StopEngine; try delphi_sapi_module.shutdown(@delphi_sapi_module); sapi_shutdown; + {$IF not Defined(PHP550) and not Defined(PHP560)} tsrm_shutdown(); + {$ENDIF} except end; end; diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 35a7d96..33ffd04 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -94,9 +94,10 @@ TpsvCustomPHP = class(TPHPComponent) FRequestType : TPHPRequestType; FOnReadResult : TPHPReadResultEvent; FContentType: zend_ustr; - {$IFDEF PHP5} - FVirtualStream : TMemoryStream; + {$IFDEF sCPUX64} + FCode: zend_ustr; {$ENDIF} + FVirtualStream : TStringStream; procedure SetVariables(Value : TPHPVariables); procedure SetHeaders(Value : TPHPHeaders); function GetVariableCount: integer; @@ -108,7 +109,7 @@ TpsvCustomPHP = class(TPHPComponent) procedure PrepareVariables; virtual; function RunTime : boolean; function GetThreadSafeResourceManager : pointer; - function CreateVirtualFile(ACode : zend_ustr) : boolean; + function CreateVirtualFile(A_code: zend_ustr) : boolean; procedure CloseVirtualFile; {$IFDEF PHP4} property VirtualCode : string read FVirtualCode; @@ -865,10 +866,10 @@ procedure delphi_error_cb(_type : integer; const error_filename : zend_pchar; else error_type_str := 'Unknown error'; end; - {$IFDEF P_CUT} - ShowMessage(zend_pchar( + {$IFDEF CUTTED_PHP7dll} + ShowMessage( {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} - ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno]))); + ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])); {$ELSE} php_log_err(zend_pchar( {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} @@ -990,7 +991,7 @@ constructor TpsvCustomPHP.Create(AOwner: TComponent); {$IFDEF PHP4} FVirtualCode := ''; {$ELSE} - FVirtualStream := TMemoryStream.Create; + FVirtualStream := TStringStream.Create; {$ENDIF} end; @@ -1031,6 +1032,9 @@ function TpsvCustomPHP.Execute : zend_ustr; {$IFDEF PHP5} ZendStream : TZendStream; {$ENDIF} + {$IFDEF sCPUX64} + z: pzval; + {$ENDIF} begin if not EngineActive then @@ -1062,27 +1066,24 @@ function TpsvCustomPHP.Execute : zend_ustr; if not FileExists(FFileName) then raise Exception.CreateFmt('File %s does not exists', [FFileName]); end; - StartupRequest; - ZeroMemory(@file_handle, sizeof(zend_file_handle)); - + {$IFNDEF sCPUX64} if FUseMapping then begin {$IFDEF PHP5} ZeroMemory(@ZendStream, sizeof(ZendStream)); ZendStream.reader := delphi_stream_reader; ZendStream.closer := delphi_stream_closer; - {$IFDEF PHP530} - ZendStream.fsizer := delphi_stream_fsizer; - {$ELSE} - {$IFDEF PHP510} - ZendStream.fteller := delphi_stream_teller; - {$ENDIF} - ZendStream.interactive := 0; - {$ENDIF} - + {$IFDEF PHP530} + ZendStream.fsizer := delphi_stream_fsizer; + {$ELSE} + {$IFDEF PHP510} + ZendStream.fteller := delphi_stream_teller; + {$ENDIF} + ZendStream.interactive := 0; + {$ENDIF} ZendStream.handle := FVirtualStream; file_handle._type := ZEND_HANDLE_STREAM; @@ -1101,6 +1102,10 @@ function TpsvCustomPHP.Execute : zend_ustr; {$ENDIF} end else + {$ENDIF} + {$IFDEF CPUX64} + if not FUseMapping then + {$ENDIF} begin file_handle._type := ZEND_HANDLE_FILENAME; file_handle.filename := zend_pchar(FFileName); @@ -1109,7 +1114,21 @@ function TpsvCustomPHP.Execute : zend_ustr; end; try - php_execute_script(@file_handle, TSRMLS_D); + begin + //ShowMessage('php_execute_script'); + {$IFDEF CPUX64} + if FUseMapping then + begin + ShowMessage('eval'); + z := ALLOC_ZVAL; + INIT_PZVAL(z); + z^._type := IS_STRING; + zend_eval_string(zend_pchar(FCode), z, 'SAPI execution', TSRMLS_D); + end + else + {$ENDIF} + PHPAPI.php_execute_script(@file_handle, TSRMLS_D); + end except FBuffer.Clear; try @@ -1147,7 +1166,7 @@ function TpsvCustomPHP.Execute : zend_ustr; end; end; -function TpsvCustomPHP.RunCode(ACode : zend_ustr) : zend_ustr; +function TpsvCustomPHP.RunCode(Acode : zend_ustr) : zend_ustr; begin if not EngineActive then begin @@ -1158,19 +1177,26 @@ function TpsvCustomPHP.RunCode(ACode : zend_ustr) : zend_ustr; ClearHeaders; ClearBuffer; FUseMapping := true; + try if FUseDelimiters then begin if Pos('', [ACode]); end; + {$IFDEF CPUX64} + FCode := Acode; + {$ELSE} if not CreateVirtualFile(ACode) then begin Result := ''; Exit; end; + {$ENDIF} Result := Execute; + {$IFNDEF CPUX64} CloseVirtualFile; + {$ENDIF} finally FUseMapping := false; end; @@ -1208,25 +1234,12 @@ procedure TpsvCustomPHP.PrepareResult; data: ^ppzval; cnt : integer; variable : pzval; - {$IFDEF PHP5} - EG : pzend_executor_globals; - {$ENDIF} begin if FVariables.Count = 0 then Exit; if FExecuteMethod = emServer then - {$IFDEF PHP4} ht := GetSymbolsTable - {$ELSE} - begin - EG := GetExecutorGlobals; - if Assigned(EG) then - ht := @EG.symbol_table - else - ht := nil; - end - {$ENDIF} else ht := GetTrackHash('_GET'); if Assigned(ht) then @@ -1278,19 +1291,22 @@ procedure TpsvCustomPHP.StartupRequest; gl := GetSAPIGlobals; gl^.server_context := Self; - + //ShowMessage('TpsvCustomPHP.StartupRequest -- RegisterGlobals'); if PHPEngine.RegisterGlobals then GetPHPGlobals(TSRMLS_D)^.register_globals := true; - + //ShowMessage('TpsvCustomPHP.StartupRequest -- Try'); try + //ShowMessage('TpsvCustomPHP.StartupRequest -- FOnReadPost'); if Assigned(FOnReadPost) then FOnReadPost(Self, FPostStream); - + //ShowMessage('TpsvCustomPHP.StartupRequest -- zend_alter_ini_entry'); zend_alter_ini_entry('max_execution_time', 19, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_RUNTIME); + //ShowMessage('TpsvCustomPHP.StartupRequest -- php_request_startup'); php_request_startup(TSRMLS_D); + //ShowMessage('TpsvCustomPHP.StartupRequest -- FOnRequestStartup'); if Assigned(FOnRequestStartup) then FOnRequestStartup(Self); - + //ShowMessage('TpsvCustomPHP.StartupRequest --'); FSessionActive := true; except FSessionActive := false; @@ -1406,7 +1422,7 @@ procedure TpsvCustomPHP.CloseVirtualFile; {$ENDIF} end; -function TpsvCustomPHP.CreateVirtualFile(ACode : zend_ustr): boolean; +function TpsvCustomPHP.CreateVirtualFile(A_code : zend_ustr): boolean; {$IFDEF PHP4} var _handles : array[0..1] of THandle; @@ -1422,7 +1438,7 @@ function TpsvCustomPHP.CreateVirtualFile(ACode : zend_ustr): boolean; Exit; {empty buffer was provided} end; - FVirtualCode := ACode; + FVirtualCode := A_code; if pipe(@_handles, 4096, 0) = -1 then begin @@ -1436,16 +1452,15 @@ function TpsvCustomPHP.CreateVirtualFile(ACode : zend_ustr): boolean; FVirtualWriteHandle := _handles[1]; Result := true; {$ELSE} - if ACode = '' then + if A_code = '' then Exit; - try + try FVirtualStream.Clear; - FVirtualStream.Write(ACode[1], Length(ACode)); - FVirtualStream.Position := 0; - Result := true; - except - Result := false; - end; + FVirtualStream.WriteString(A_code); + FVirtualStream.Seek(0, TSeekOrigin.soBeginning); + finally + Result := True; + end; {$ENDIF} end; @@ -1531,7 +1546,7 @@ procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; if ht > 0 then begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then + if ( not (zend_get_parameters_my(ht, Params, TSRMLS_DC) = SUCCESS )) then begin zend_wrong_param_count(TSRMLS_DC); Exit; @@ -1592,7 +1607,7 @@ procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; procedure TPHPEngine.PrepareIniEntry; var - p : integer; + p, p2 : pointer; TimeStr : string; begin if not PHPLoaded then @@ -1601,11 +1616,9 @@ procedure TPHPEngine.PrepareIniEntry; if FHandleErrors then begin // p := integer(GetProcAddress(PHPLib, 'zend_do_print')); - p := integer(GetProcAddress(PHPLib, 'zend_error_cb')); - asm - mov edx, dword ptr [p] - mov dword ptr [edx], offset delphi_error_cb - end; + p := GetProcAddress(PHPLib, 'zend_error_cb'); + p2 := @delphi_error_cb; + Move(p, p2, 1); end; {$IFNDEF PHP540} if FSafeMode then @@ -1707,7 +1720,8 @@ procedure TPHPEngine.RegisterConstants; strlen(zend_pchar(ConstantName)) + 1, zend_pchar(ConstantValue), CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); end; - + zend_register_bool_constant( zend_pchar('UTF8_SUPPORT'), 13, {$IFDEF PHP_UNICE}TRUE{$ELSE}FALSE{$ENDIF}, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); RegisterInternalConstants(TSRMLS_D); end; @@ -1752,12 +1766,13 @@ procedure TPHPEngine.ShutdownEngine; {Shutdown PHP thread safe resource manager} if Assigned(FOnEngineShutdown) then FOnEngineShutdown(Self); - + {$IF not Defined(PHP550) and not Defined(PHP560)} try tsrm_shutdown(); except end; + {$ENDIF} FHash.Clear; finally FEngineActive := false; @@ -1807,83 +1822,35 @@ procedure TPHPEngine.RefreshLibrary; cnt, offset : integer; HashName : zend_ustr; begin - SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 14); + SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 5); PHP_FUNCTION(FLibraryEntryTable[0], 'delphi_date', @delphi_date); - PHP_FUNCTION(FLibraryEntryTable[1], 'delphi_extract_file_dir', @delphi_extract_file_dir); - PHP_FUNCTION(FLibraryEntryTable[2], 'delphi_extract_file_drive', @delphi_extract_file_drive); - PHP_FUNCTION(FLibraryEntryTable[3], 'delphi_extract_file_name', @delphi_extract_file_name); - - FLibraryEntryTable[4].fname := 'delphi_extract_file_ext'; - FLibraryEntryTable[4].handler := @delphi_extract_file_ext; - {$IFDEF PHP4} - FLibraryEntryTable[4].func_arg_types := nil; - {$ELSE} - FLibraryEntryTable[4].arg_info := nil; - {$ENDIF} - FLibraryEntryTable[5].fname := 'delphi_show_message'; - FLibraryEntryTable[5].handler := @delphi_show_message; - {$IFDEF PHP4} - FLibraryEntryTable[5].func_arg_types := nil; - {$ELSE} - FLibraryEntryTable[5].arg_info := nil; - {$ENDIF} + FLibraryEntryTable[1].fname := 'delphi_get_author'; + FLibraryEntryTable[1].handler := @delphi_get_author; + FLibraryEntryTable[1].arg_info := nil; - FLibraryEntryTable[6].fname := 'register_delphi_object'; - FLibraryEntryTable[6].handler := @register_delphi_object; - {$IFDEF PHP4} - FLibraryEntryTable[6].func_arg_types := nil; - {$ELSE} - FLibraryEntryTable[6].arg_info := nil; - {$ENDIF} - - FLibraryEntryTable[7].fname := 'delphi_get_author'; - FLibraryEntryTable[7].handler := @delphi_get_author; - {$IFDEF PHP4} - FLibraryEntryTable[7].func_arg_types := nil; - {$ELSE} - FLibraryEntryTable[7].arg_info := nil; - {$ENDIF} - - FLibraryEntryTable[8].fname := 'delphi_is_uc'; - FLibraryEntryTable[8].handler := @delphi_is_uc; - {$IFDEF PHP4} - FLibraryEntryTable[8].func_arg_types := nil; - {$ELSE} - FLibraryEntryTable[8].arg_info := nil; - {$ENDIF} - - FLibraryEntryTable[9].fname := 'delphi_str_date'; - FLibraryEntryTable[9].handler := @delphi_str_date; - {$IFDEF PHP4} - FLibraryEntryTable[9].func_arg_types := nil; - {$ELSE} - FLibraryEntryTable[9].arg_info := nil; - {$ENDIF} - - PHP_FUNCTION(FLibraryEntryTable[10], 'delphi_get_system_directory', @delphi_get_system_directory); - PHP_FUNCTION(FLibraryEntryTable[11], 'InputBox', @delphi_input_box); - PHP_FUNCTION(FLibraryEntryTable[12], 'register_delphi_component', @register_delphi_component); + FLibraryEntryTable[2].fname := 'delphi_str_date'; + FLibraryEntryTable[2].handler := @delphi_str_date; + FLibraryEntryTable[2].arg_info := nil; + PHP_FUNCTION(FLibraryEntryTable[3], 'InputBox', @delphi_input_box); for cnt := 0 to FHash.Count - 1 do begin HashName := FHash[cnt]; {$IFNDEF COMPILER_VC9} - FLibraryEntryTable[cnt+13].fname := strdup(zend_pchar(HashName)); + FLibraryEntryTable[cnt+4].fname := strdup(zend_pchar(HashName)); {$ELSE} - FLibraryEntryTable[cnt+13].fname := DupStr(zend_pchar(HashName)); + FLibraryEntryTable[cnt+4].fname := DupStr(zend_pchar(HashName)); {$ENDIF} - FLibraryEntryTable[cnt+13].handler := @DispatchRequest; - {$IFDEF PHP4} - FLibraryEntryTable[cnt+13].func_arg_types := nil; - {$ENDIF} + FLibraryEntryTable[cnt+4].handler := @DispatchRequest; + FLibraryEntryTable[cnt+4].arg_info := nil; end; - offset := FHash.Count + 13; + offset := FHash.Count + 4; for cnt := 0 to MyFuncs.Count - 1 do begin HashName := MyFuncs[cnt]; @@ -1894,17 +1861,13 @@ procedure TPHPEngine.RefreshLibrary; {$ENDIF} FLibraryEntryTable[cnt+offset].handler := MyFuncs.Objects[ cnt ]; - {$IFDEF PHP4} - FLibraryEntryTable[cnt+offset].func_arg_types := nil; - {$ENDIF} + FLibraryEntryTable[cnt+offset].arg_info := nil; end; - FLibraryEntryTable[FHash.Count+MyFuncs.Count+13].fname := nil; - FLibraryEntryTable[FHash.Count+MyFuncs.Count+13].handler := nil; - {$IFDEF PHP4} - FLibraryEntryTable[FHash.Count+MyFuncs.Count+13].func_arg_types := nil; - {$ENDIF} + FLibraryEntryTable[FHash.Count+MyFuncs.Count+4].fname := nil; + FLibraryEntryTable[FHash.Count+MyFuncs.Count+4].handler := nil; + FLibraryEntryTable[FHash.Count+MyFuncs.Count+4].arg_info := nil; FLibraryModule.functions := @FLibraryEntryTable[0]; end; diff --git a/Source/phpClass.pas b/Source/phpClass.pas index a684840..8e3f286 100644 --- a/Source/phpClass.pas +++ b/Source/phpClass.pas @@ -156,7 +156,6 @@ TPHPClassInstance = class(TComponent) property Properties : TClassProperties read FProperties write SetProperties; end; - {$IFDEF PHP5} procedure RegisterClassHandlers; {$ENDIF} @@ -174,11 +173,7 @@ implementation {$ENDIF} const - {$IFDEF PHP4} - le_classresource_name = 'TPHPCLASS4'; - {$ELSE} le_classresource_name = 'TPHPCLASS5'; - {$ENDIF} procedure class_destructor_handler(rsrc : PZend_rsrc_list_entry; TSRMLS_D : pointer); cdecl; var @@ -224,211 +219,6 @@ function class_call_constructor(AClassName : zend_ustr; return_value : pzval) : end; end; -{$IFDEF PHP4} - -//PHP4 -function class_set_property_handler(property_reference : Pzend_property_reference; value : pzval) : integer; cdecl; -var - this_ptr : pzval; - OBJ : TPHPClassInstance; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - propname : zend_ustr; - tsrmls : pointer; - param : TClassProperty; -begin - tsrmls := ts_resource_ex(0, nil); - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - - this_ptr := property_reference^._object; - new(data); - if zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) = SUCCESS then - Obj := zend_fetch_resource(data^, TSRMLS, -1, 'class resource', nil, 1, le_classresource) - else - OBJ := nil; - freemem(data); - if Assigned(Obj) then - begin - convert_to_string(value); - param := Obj.Properties.ByName(propname); - if Assigned(param) then - param.Value := value.value.str.val; - end; - Result := SUCCESS; -end; - - - -//PHP4 -procedure class_call_function(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer; property_reference : Pzend_property_reference ); cdecl; -var - OBJ : TPHPClassInstance; - Producer : TPHPClass; - M : TPHPClassMethod; - data: ^ppzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - p : pointer; - MethodName : zend_ustr; - Params : pzval_array; - j : integer; -begin - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - MethodName := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - if (zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) = SUCCESS) then - Obj := zend_fetch_resource(data^, TSRMLS_DC, -1, 'class resource', nil, 1, le_classresource) - else - Obj := nil; - freemem(data); - - if not Assigned(Obj) then - begin - //not assigned obj = new instance (constructor) - class_call_constructor(MethodName, this_ptr); - exit; - end; - - if ht > 0 then - begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - end; - - - Producer := Obj.Producer; - if Assigned(Producer) then - begin - M := Producer.Methods.ByName(MethodName); - if Assigned(M) then - begin - if Assigned(M.FOnExecute) then - begin - if M.Parameters.Count <> ht then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - if ht > 0 then - begin - for j := 0 to ht - 1 do - begin - if not IsParamTypeCorrect(M.Parameters[j].ParamType, Params[j]^) then - begin - zend_error(E_WARNING, zend_pchar(Format('Wrong parameter type for %s()', [get_active_function_name(TSRMLS_DC)]))); - Exit; - end; - M.Parameters[j].Value := zval2variant(Params[j]^^); - end; - end; // if ht > 0 - - - M.ZendVar.AsZendVariable := return_value; //direct access to zend variable - M.FOnExecute(Obj, M.Parameters, M.ReturnValue, M.FZendVar.AsZendVariable, this_ptr, TSRMLS_DC); - if M.ZendVar.ISNull then //perform variant conversion - variant2zval(M.ReturnValue, return_value); - - end; - end; - end; - dispose_pzval_array(Params); -end; - - -//PHP4 -procedure class_get_property_handler(val : pzval; property_reference : PZend_property_reference); cdecl; -var - this_ptr : pzval; - element : pzend_list_element; - prop : pzend_overloaded_element; - obj : TPHPClassInstance; - p : pointer; - propname : zend_ustr; - tsrmls : pointer; - data: ^ppzval; - param : TClassProperty; -begin - tsrmls := ts_resource_ex(0, nil); - element := property_reference^.elements_list^.head; - p := @element^.data; - prop := pzend_overloaded_element(p); - propname := prop^.element.value.str.val; - this_ptr := property_reference^._object; - new(data); - if ( zend_hash_find(this_ptr^.value.obj.properties, 'instance', strlen('instance') + 1, data) <> SUCCESS) then - Obj := nil - else - Obj := zend_fetch_resource(data^, TSRMLS, -1, 'class resource', nil, 1, le_classresource); - freemem(data); - if Assigned(Obj) then - begin - param := Obj.Properties.ByName(propname); - if Assigned(param) then - ZVAL_STRING(val, zend_pchar(param.value), true) - else - ZVAL_EMPTY_STRING(val) - end - else - ZVAL_STRING(val, 'undefined', true); -end; - -//PHP4 -procedure _class_get_property_wrapper; assembler; -asm - push ebp - mov ebp,esp - sub esp,50h - push ebx - push esi - push edi - lea edi,[ebp-50h] - mov ecx,14h - mov eax,0CCCCCCCCh - rep stosd - mov eax,dword ptr [ebp+0Ch] - push eax - lea ecx,[ebp-10h] - push ecx - call class_get_property_handler - add esp,8 - mov edx,dword ptr [ebp+8] - mov eax,dword ptr [ebp-10h] - mov dword ptr [edx],eax - mov ecx,dword ptr [ebp-0Ch] - mov dword ptr [edx+4],ecx - mov eax,dword ptr [ebp-8] - mov dword ptr [edx+8],eax - mov ecx,dword ptr [ebp-4] - mov dword ptr [edx+0Ch],ecx - mov eax,dword ptr [ebp+8] - - pop edi - pop esi - pop ebx - add esp,50h - cmp ebp,esp - mov esp,ebp - pop ebp - ret -end; -{$ENDIF} - - - - {$IFDEF PHP5} // Read object property value (getter) @@ -535,7 +325,7 @@ function class_call_method(method : zend_pchar; ht : integer; return_value : pzv if ht > 0 then begin - if ( not (zend_get_parameters_ex(ht, Params) = SUCCESS )) then + if ( not (zend_get_parameters_my(ht, Params, TSRMLS_DC) = SUCCESS )) then begin zend_wrong_param_count(TSRMLS_DC); Result := FAILURE; @@ -679,24 +469,12 @@ procedure TPHPClass.ClassRegister(AModuleNumber : integer); ZeroMemory(@FClassEntry, SizeOf(TZend_Class_Entry)); - {$IFDEF PHP5} FClassFunction[0].fname := zend_pchar(FClassName); FClassFunction[0].handler := @class_init_new; INIT_CLASS_ENTRY(FClassEntry, zend_pchar(FClassName) , @FClassFunction); - {$ELSE} - INIT_CLASS_ENTRY(FClassEntry, zend_pchar(FClassName) , nil); - {$ENDIF} FClassObject := zend_register_internal_class(@FClassEntry, tsrmls); - - {$IFDEF PHP4} - FClassObject.handle_property_get := @_class_get_property_wrapper; - FClassObject.handle_property_set := @class_set_property_handler; - FClassObject.handle_function_call := @class_call_function; - {$ENDIF} - - Application.RegisterPHPClass(FClassName, FClassObject); end; end; @@ -743,17 +521,8 @@ function TPHPClass.InstanceConstructor(return_value : pzval): TPHPClassInstance; FClassObject := GetClassEntry; if not assigned(FClassObject) then Exit; - {$IFDEF PHP4} - _object_init_ex(return_value, FClassObject, nil, 0, TSRMLS); - {$ELSE} object_init(return_value, FClassObject, TSRMLS ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_resource_ex(return_value, 'instance', strlen('instance') +1, rn); - {$ELSE} add_property_resource_ex(return_value, 'instance', strlen('instance') +1, rn, TSRMLS); - {$ENDIF} {$IFDEF PHP5} return_value.value.obj.handlers := @ClassObjectHandlers; @@ -787,18 +556,8 @@ procedure TPHPClass.ProduceInstance(AValue: pzval); FClassObject := Application.GetPHPClass(FClassName); if not assigned(FClassObject) then Exit; - - {$IFDEF PHP4} - _object_init_ex(AValue, FClassObject, nil, 0, TSRMLS); - {$ELSE} object_init(AValue, FClassObject, TSRMLS ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_resource_ex(AValue, 'instance', strlen('instance') +1, rn); - {$ELSE} add_property_resource_ex(AValue, 'instance', strlen('instance') +1, rn, TSRMLS); - {$ENDIF} {$IFDEF PHP5} AValue.value.obj.handlers := @ClassObjectHandlers; @@ -882,11 +641,7 @@ function TClassProperty.GetAsFloat: double; function TClassProperty.GetAsInteger: integer; var - {$IFDEF VERSION12} - c : WideChar; - {$ELSE} - c : AnsiChar; - {$ENDIF} + c: CharPtr; begin c := FormatSettings.DecimalSeparator; try @@ -920,11 +675,7 @@ procedure TClassProperty.SetAsFloat(const Value: double); procedure TClassProperty.SetAsInteger(const Value: integer); var - {$IFDEF VERSION12} - c : WideChar; - {$ELSE} - c : AnsiChar; - {$ENDIF} + c: CharPtr; begin c := FormatSettings.DecimalSeparator; try diff --git a/Source/phpModules.pas b/Source/phpModules.pas index 9943c82..04dcf0a 100644 --- a/Source/phpModules.pas +++ b/Source/phpModules.pas @@ -265,7 +265,7 @@ function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointe procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; begin - ZVAL_NULL(return_value); + ZVAL(return_value); if Assigned(Application) then try Application.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); @@ -343,15 +343,11 @@ function get_module : Pzend_module_entry; cdecl; {$ENDIF} module_entry_table[cnt].handler := @DispatchRequest; - {$IFDEF PHP4} - module_entry_table[cnt].func_arg_types := nil; - {$ENDIF} + module_entry_table[cnt].arg_info := nil; end; module_entry_table[Extension.FFunctions.Count].fname := nil; module_entry_table[Extension.FFunctions.Count].handler := nil; - {$IFDEF PHP4} - module_entry_table[Extension.FFunctions.Count].func_arg_types := nil; - {$ENDIF} + module_entry_table[Extension.FFunctions.Count].arg_info := nil; ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := ORD(Extension.ModuleType) + 1; From c2bdc6ee76d0172200463f07e09fae45f1412d33 Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Wed, 12 Feb 2020 00:52:52 +0200 Subject: [PATCH 36/54] intpr --- Source/PHPAPI.pas | 6 +++--- Source/ZENDAPI.pas | 11 +++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index d1a6baf..2a14ce9 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -345,7 +345,7 @@ function GetSAPIGlobals : Psapi_globals_struct; begin Result := nil; if Assigned(sapi_globals_id) then - Result := __asm_fetchval(integer(sapi_globals_id^), tsrmls_fetch); + Result := __asm_fetchval(IntPtr(sapi_globals_id^), tsrmls_fetch); end; function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; var @@ -354,7 +354,7 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; Result := nil; sapi_global_id := GetProcAddress(PHPLib, 'sapi_globals_id'); if Assigned(sapi_global_id) then - Result := __asm_fetchval(integer(sapi_globals_id^), TSRMLS_DC); + Result := __asm_fetchval(IntPtr(sapi_globals_id^), TSRMLS_DC); end; function GetStringOf(const V: TVarData): string; @@ -407,7 +407,7 @@ function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; begin Result := nil; if Assigned(core_globals_id) then - Result := Pphp_Core_Globals(__asm_fetchval(integer(core_globals_id^), TSRMLS_DC)); + Result := Pphp_Core_Globals(__asm_fetchval(IntPtr(core_globals_id^), TSRMLS_DC)); end; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 7417590..c39df3e 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -3301,12 +3301,7 @@ function zend_register_functions(functions : {$IFDEF PHP7}P_zend_function_entry{ end; -function __asm_fetchval -{$IFDEF CPUX64} -(val_id: int64; tsrmls_dc_p: pointer) -{$ELSE} -(val_id: integer; tsrmls_dc_p: pointer) -{$ENDIF} +function __asm_fetchval(val_id: IntPtr; tsrmls_dc_p: pointer) : pointer; assembler; register; {$IFDEF CPUX64} asm @@ -3335,7 +3330,7 @@ function GetGlobalResource(resource_name: AnsiString) : pointer; global_id := GetProcAddress(PHPLib, zend_pchar(resource_name)); if Assigned(global_id) then begin - Result := __asm_fetchval(integer(global_id^), tsrmls_fetch); + Result := __asm_fetchval(IntPtr(global_id^), tsrmls_fetch); end; except Result := nil; @@ -3351,7 +3346,7 @@ function GetGlobalResourceDC(resource_name: AnsiString;TSRMLS_DC:pointer) : poin global_id := GetProcAddress(PHPLib, zend_pchar(resource_name)); if Assigned(global_id) then begin - Result := __asm_fetchval(integer(global_id^), TSRMLS_DC); + Result := __asm_fetchval(IntPtr(global_id^), TSRMLS_DC); end; except Result := nil; From 09f6b4852ff363f72a5e4a27bdc12f5421166e82 Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Wed, 12 Feb 2020 13:57:07 +0200 Subject: [PATCH 37/54] Closed #4 , #2 Still facing encoding problems with RunCode() function --- Source/DelphiFunctions.pas | 2 +- Source/Demos/psvPHP/console/phpcon.dpr | 4 +- Source/Demos/psvPHP/console/phpcon.dproj | 2 +- Source/PHP.INC | 9 +- Source/PHPAPI.pas | 12 +- Source/PHPFunctions.pas | 23 +- Source/PHPLibrary.pas | 13 +- Source/PHPProjectWizard.pas | 2 +- Source/PHPTypes.pas | 12 +- Source/ZENDAPI.pas | 330 +++++++++-------------- Source/ZendTypes.pas | 17 +- Source/hzend_types.pas | 8 +- Source/php4AppIntf.pas | 3 +- Source/php4AppUnit.pas | 2 +- Source/php4delphi.pas | 25 +- Source/phpClass.pas | 16 +- 16 files changed, 202 insertions(+), 278 deletions(-) diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index 3be090d..74bbcc3 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -18,7 +18,7 @@ interface uses SysUtils, Classes, VCL.Controls, - {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} ZendAPI, PHPTypes, PHPAPI, VCL.Dialogs, typinfo, + ZendTypes, ZendAPI, PHPTypes, PHPAPI, VCL.Dialogs, typinfo, VCL.Forms, VCL.stdctrls; {$ifdef fpc} diff --git a/Source/Demos/psvPHP/console/phpcon.dpr b/Source/Demos/psvPHP/console/phpcon.dpr index 5ac140b..afe658b 100644 --- a/Source/Demos/psvPHP/console/phpcon.dpr +++ b/Source/Demos/psvPHP/console/phpcon.dpr @@ -31,7 +31,7 @@ var begin if zend_parse_method_parameters(1, TSRMLS_DC, this_ptr, 'z', @Text) = 0 then begin - ShowMessage(Z_STRVAL(Text)); + ShowMessage(WideString(Z_RawStr(Text))); end; end; procedure grc(ht: integer; return_value: pzval; @@ -42,7 +42,7 @@ var begin if zend_parse_method_parameters(1, TSRMLS_DC, this_ptr, 'z', @p) = 0 then begin - p^.value.lval := 0; + ZVAL_STRING(z,'🐆🐆🐆 .-=WPD=-. 🐆🐆🐆',true); end; end; begin diff --git a/Source/Demos/psvPHP/console/phpcon.dproj b/Source/Demos/psvPHP/console/phpcon.dproj index fdd2dd5..06928a9 100644 --- a/Source/Demos/psvPHP/console/phpcon.dproj +++ b/Source/Demos/psvPHP/console/phpcon.dproj @@ -8,7 +8,7 @@ Console None 18.2 - Win64 + Win32 true diff --git a/Source/PHP.INC b/Source/PHP.INC index 2662f6d..5ee313f 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -52,7 +52,7 @@ backward compatibility between PHP versions. {$DEFINE ZEND_WIN32} {$DEFINE PHP_COMPILER_ID} {$ENDIF} -{s$DEFINE soulengine_build} +{$DEFINE soulengine_build} {.$DEFINE PHP7} {.$DEFINE CUTTED_PHP7dll} {$IFDEF PHP7} @@ -64,7 +64,6 @@ backward compatibility between PHP versions. {$DEFINE PHP530} {$DEFINE PHP540} {$DEFINE PHP550} - {//$DEFINE PHP_UNICE} {$DEFINE ZEND_WIN32} {$DEFINE PHP_COMPILER_ID} {$ENDIF} @@ -97,6 +96,12 @@ backward compatibility between PHP versions. {$DEFINE ZTS} {zts support} {$ENDIF} +{$IF Defined(COMPILER_VC11) and Defined(PHP560) or Defined(PHP7)} + {$DEFINE PHP_UNICODE} +{$ELSEIF Defined(COMPILER_VC12) or Defined(COMPILER_VC13) or Defined(COMPILER_VC14) or Defined(COMPILER_VC15)} + {$DEFINE PHP_UNICODE} +{$ENDIF} + {$IFNDEF VER80} {Delphi 1.0} {$DEFINE VERSION2} {Delphi 2.0 and BCB 1 or higher} {$ENDIF} diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index 2a14ce9..28b154e 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -29,7 +29,7 @@ interface Windows {$ENDIF}, - {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} + ZendTypes, PHPTypes, zendAPI, @@ -704,7 +704,7 @@ function GetPHPVersion: TPHPFileInfo; {$ELSE} function GetPHPVersion: TPHPFileInfo; var - FileName: {$IFDEF PHP_UNICE}String{$ELSE}AnsiString{$ENDIF}; + FileName: String; InfoSize, Wnd: DWORD; VerBuf: Pointer; FI: PVSFixedFileInfo; @@ -715,20 +715,12 @@ function GetPHPVersion: TPHPFileInfo; Result.Release := 0; Result.Build := 0; FileName := PHPWin; - {$IFDEF PHP_UNICE} InfoSize := GetFileVersionInfoSize(PWideChar(Filename), Wnd); - {$ELSE} - InfoSize := GetFileVersionInfoSizeA(PAnsiChar(FileName), Wnd); - {$ENDIF} if InfoSize <> 0 then begin GetMem(VerBuf, InfoSize); try - {$IFDEF PHP_UNICE} if GetFileVersionInfo(PWideChar(FileName), Wnd, InfoSize, VerBuf) then - {$ELSE} - if GetFileVersionInfoA(PAnsiChar(FileName), Wnd, InfoSize, VerBuf) then - {$ENDIF} if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then begin Result.MajorVersion := HIWORD(FI.dwFileVersionMS); diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index 80ceda8..07abf5b 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -20,10 +20,10 @@ interface uses Windows, SysUtils, Classes, - {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} + {$IFDEF PHP_UNICODE}WideStrUtils, {$ENDIF} {$IFDEF VERSION6} Variants, {$ENDIF} - {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} PHPTypes, ZendAPI, PHPAPI ; + ZendTypes, PHPTypes, ZendAPI, PHPAPI ; type TParamType = (tpString, tpInteger, tpFloat, tpBoolean, tpArray, tpUnknown); @@ -316,17 +316,17 @@ procedure TPHPFunction.SetDisplayName(const Value: string); NameValue : zend_ustr; begin NameValue := Value; - if {$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(NameValue, FFunctionName) <> 0 then + if {$IFDEF PHP_UNICODE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(NameValue, FFunctionName) <> 0 then begin if Collection <> nil then for I := 0 to Collection.Count - 1 do begin F := TPHPFunctions(Collection).Items[I]; if (F <> Self) and (F is TPHPFunction) and - ({$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(NameValue, F.FunctionName) = 0) then + ({$IFDEF PHP_UNICODE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(NameValue, F.FunctionName) = 0) then raise Exception.CreateFmt('Duplicate function name: %s', [Value]); end; - FFunctionName := {$IFDEF PHP_UNICE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF}(Value); + FFunctionName := {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF}(Value); Changed(False); end; end; @@ -467,14 +467,14 @@ procedure TFunctionParam.SetDisplayName(const Value: string); I: Integer; F: TFunctionParam; begin - if {$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, FName) <> 0 then + if {$IFDEF PHP_UNICODE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, FName) <> 0 then begin if Collection <> nil then for I := 0 to Collection.Count - 1 do begin F := TFunctionParams(Collection).Items[I]; if ((F <> Self) and (F is TFunctionParam) and - ({$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, F.Name) = 0)) then + ({$IFDEF PHP_UNICODE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, F.Name) = 0)) then raise Exception.Create('Duplicate parameter name'); end; FName := Value; @@ -611,14 +611,7 @@ function TZendVariable.GetAsString: zend_ustr; end; case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of - IS_STRING : begin - try - SetLength(Result, FValue^.value.str.len); - Move(FValue^.value.str.val^, Result[1], FValue^.value.str.len); - except - Result := ''; - end; - end; + IS_STRING : result := Z_STRVAL(FValue); IS_DOUBLE : result := FloatToStr(FValue^.value.dval); IS_LONG : result := IntToStr(FValue^.value.lval); IS_NULL : result := ''; diff --git a/Source/PHPLibrary.pas b/Source/PHPLibrary.pas index 531998f..1ffad85 100644 --- a/Source/PHPLibrary.pas +++ b/Source/PHPLibrary.pas @@ -16,6 +16,9 @@ interface uses Windows, SysUtils, Classes, + {$IFDEF PHP_UNICODE} + WideStrUtils, + {$ENDIF} {$IFDEF VERSION6} Variants, {$ENDIF} @@ -178,7 +181,7 @@ procedure TPHPSimpleLibrary.RegisterMethod(AName: zend_ustr; ADescription : zend begin Func := TPHPFunction(Functions.Add); Func.FunctionName := - {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF}(AName); + {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF}(AName); Func.Description := ADescription; for cnt := 0 to Length(AParams) - 1 do @@ -353,28 +356,28 @@ procedure TPHPSystemLibrary.CompareTextProc; procedure TPHPSystemLibrary.AnsiUpperCaseProc; begin ReturnOutputArg( - {$IFDEF PHP_UNICE}UpperCase{$ELSE}AnsiUpperCase{$ENDIF}( GetInputArgAsString( 0 ) ) + {$IFDEF PHP_UNICODE}UTF8UpperCase{$ELSE}AnsiUpperCase{$ENDIF}( GetInputArgAsString( 0 ) ) ); end; procedure TPHPSystemLibrary.AnsiLowerCaseProc; begin ReturnOutputArg( - {$IFDEF PHP_UNICE}LowerCase{$ELSE}AnsiLowerCase{$ENDIF}( GetInputArgAsString( 0 ) ) + {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF}( GetInputArgAsString( 0 ) ) ); end; procedure TPHPSystemLibrary.AnsiCompareStrProc; begin ReturnOutputArg( - {$IFDEF PHP_UNICE}CompareStr{$ELSE}AnsiCompareStr{$ENDIF}( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) + {$IFDEF PHP_UNICODE}CompareStr{$ELSE}AnsiCompareStr{$ENDIF}( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); end; procedure TPHPSystemLibrary.AnsiCompareTextProc; begin ReturnOutputArg( - {$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) + {$IFDEF PHP_UNICODE}CompareText{$ELSE}AnsiCompareText{$ENDIF}( GetInputArgAsString( 0 ),GetInputArgAsString( 1 ) ) ); end; diff --git a/Source/PHPProjectWizard.pas b/Source/PHPProjectWizard.pas index 4a281d1..78c8a6e 100644 --- a/Source/PHPProjectWizard.pas +++ b/Source/PHPProjectWizard.pas @@ -268,7 +268,7 @@ function TPHPProjectCreator.GetFileName: string; begin try TempFileName := ProjGroup.Projects[i].FileName; - if {$IFDEF PHP_UNICE}CompareFileName{$ELSE}AnsiCompareFileName{$ENDIF}(ExtractFileName(TempFileName), ExtractFileName(TempFileName2)) = 0 then + if CompareFileName(ExtractFileName(TempFileName), ExtractFileName(TempFileName2)) = 0 then begin Found := True; Break; diff --git a/Source/PHPTypes.pas b/Source/PHPTypes.pas index 9fa22fe..6516dbe 100644 --- a/Source/PHPTypes.pas +++ b/Source/PHPTypes.pas @@ -16,7 +16,7 @@ interface uses - {$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7} hzend_types {$ELSE} ZendTypes {$ENDIF}; + {$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, ZendTypes; const phpVersion = {$IFDEF PHP7}7{$ELSE}5{$ENDIF}; @@ -249,8 +249,8 @@ interface sapi_module_struct = record - name : PAnsiChar; - pretty_name : PAnsiChar; + name : zend_pchar; + pretty_name : zend_pchar; startup : TModuleStartupFunc; //int (*startup)(struct _sapi_module_struct *sapi_module); @@ -283,14 +283,14 @@ interface get_request_time : pointer; terminate_process : pointer; - php_ini_path_override : PAnsiChar; + php_ini_path_override : zend_pchar; block_interruptions : pointer; unblock_interruptions : pointer; default_post_reader : pointer; treat_data : pointer; - executable_location : PAnsiChar; + executable_location : zend_pchar; php_ini_ignore : Integer; @@ -308,7 +308,7 @@ interface phpinfo_as_text : integer; - ini_entries : PAnsiChar; + ini_entries : zend_pchar; additional_functions: Pointer; input_filter_init : Pointer; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index c39df3e..2a965f2 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -21,8 +21,9 @@ interface uses VCL.Dialogs, - {$IFNDEF FPC} Windows{$ELSE} LCLType,LCLIntf,dynlibs,libc{$ENDIF}, SysUtils, - {$IFDEF PHP7} hzend_types, {$ElSE} ZendTypes, {$ENDIF} Variants, +WideStrUtils, + {$IFDEF FPC} LCLType,LCLIntf,dynlibs,libc{$ELSE}Windows{$ENDIF}, SysUtils, + ZendTypes, Variants, PHPTypes; type TArrayVariant = array of variant; @@ -77,7 +78,7 @@ align_test = record end; const PLATFORM_ALIGNMENT = (SizeOf(align_test)); -{$IFNDEF PHP_UNICE} +{$IFNDEF PHP_UNICODE} function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; {$ENDIF} function Lfunc(var Func: Pointer; addr: LPCWSTR): Bool; @@ -318,13 +319,13 @@ procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE} zend_register_auto_global : {$IFDEF PHP700} - function(name:Pzend_string; jit:zend_bool; auto_global_callback:Pointer):longint; cdecl; + function(name:Pzend_string; jit:boolean; instance_init_callback:Pointer): IntPtr; cdecl; {$ELSE} {$IFDEF PHP5} - function(name: zend_pchar; name_len: uint; jit:boolean; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; + function(name: zend_pchar; name_len: uint; jit:boolean; instance_init_callback: Pointer; TSRMLS_DC: Pointer): IntPtr; cdecl; zend_activate_auto_globals: procedure(TSRMLS_C: Pointer); cdecl; {$ELSE} - function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl; + function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): IntPtr; cdecl; {$ENDIF} {$ENDIF} procedure REGISTER_MAIN_LONG_CONSTANT(name: zend_pchar; lval: longint; flags: integer; TSRMLS_DC: Pointer); @@ -349,7 +350,7 @@ procedure REGISTER_MAIN_STRINGL_CONSTANT(name: zend_pchar; str: zend_pchar; len: zend_error_cb : procedure; cdecl; zend_eval_string : function(str: zend_pchar; ret_val: pointer; strname: zend_pchar; tsrm: pointer): integer; cdecl; - zend_eval_string_ex : function(str:PAnsiChar; retval_ptr:pzval; string_name:PAnsiChar; handle_exceptions:longint):longint; cdecl; + zend_eval_string_ex : function(str: zend_pchar; retval_ptr:pzval; string_name: zend_pchar; handle_exceptions:longint):longint; cdecl; zend_make_compiled_string_description : function(a: zend_pchar; tsrm: pointer): zend_pchar; cdecl; _zval_copy_ctor_func : procedure(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; _zval_dtor_func : procedure(val: pzval; __zend_filename: zend_pchar; __zend_lineno: uint); cdecl; @@ -530,12 +531,12 @@ procedure convert_to_string(op: pzval); zend_html_puts : procedure(s: zend_pchar; len: uint; TSRMLS_DC: Pointer); cdecl; - zend_parse_method_parameters:function(num_args:longint; TSRMLS_DC:Pointer; this_ptr:Pzval; type_spec:PAnsiChar):longint; cdecl varargs; + zend_parse_method_parameters:function(num_args:longint; TSRMLS_DC:Pointer; this_ptr:Pzval; type_spec:zend_pchar):longint; cdecl varargs; - zend_parse_method_parameters_ex:function(flags:longint; num_args:longint; TSRMLS_DC:Pointer; this_ptr:Pzval; type_spec:PAnsiChar):longint; cdecl varargs; + zend_parse_method_parameters_ex:function(flags:longint; num_args:longint; TSRMLS_DC:Pointer; this_ptr:Pzval; type_spec:zend_pchar):longint; cdecl varargs; {$IFDEF PHP7} - zend_parse_parameters_throw : function(num_args:longint; type_spec:PAnsiChar):longint; cdecl varargs; + zend_parse_parameters_throw : function(num_args:longint; type_spec:zend_pchar):longint; cdecl varargs; {$ELSE} zend_indent : procedure; cdecl; {$ENDIF} @@ -566,7 +567,7 @@ procedure dispose_pzval_array(Params: pzval_array); var _zend_bailout : procedure (filename : zend_pchar; lineno : uint); cdecl; - zend_alter_ini_entry : function(name: PAnsiChar; name_length: uint; new_value: PAnsiChar; new_value_length: uint; modify_type: Integer; stage: Integer): Integer; cdecl; + zend_alter_ini_entry : function(name: zend_pchar; name_length: uint; new_value: zend_pchar; new_value_length: uint; modify_type: Integer; stage: Integer): Integer; cdecl; zend_alter_ini_entry_ex : function(name: zend_pchar; name_length: uint; new_value: zend_pchar; new_value_length: uint; modify_type: Integer; stage: Integer; force_change: integer): Integer; cdecl; zend_restore_ini_entry : function(name: zend_pchar; name_length: uint; stage: Integer): Integer; cdecl; @@ -674,13 +675,6 @@ procedure ZEND_PUTS(str: zend_pchar); zend_register_internal_module : function(module_entry: Pzend_module_entry; TSRMLS_DC: pointer): Pzend_module_entry;cdecl; zend_startup_modules : function(TSRMLS_DC:pointer):integer; zend_collect_module_handlers : function(TSRMLS_DC:pointer):integer; - function ZvalInt(z:zval):Integer; - function ZvalDouble(z:zval):Double; - function ZvalBool(z:zval):Boolean; - - function ZvalStrS(z:zval) : string; - function ZvalStr(z:zval) : zend_ustr; - function ZvalStrW(z:zval) : WideString; procedure ZvalVAL(z:pzval; v:Boolean) overload; procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG) overload; @@ -739,8 +733,9 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of st procedure HashToArray(HT: {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; var AR: TArrayVariant); overload; procedure ArrayToHash(AR: Array of Variant; var HT: pzval); overload; procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload; -function ToStrA(V: Variant): zend_ustr; -function ToStr(V: Variant): String; +function ToStrA(V: Variant): AnsiString; +function ToStrW(V: Variant): WideString; +function ToStr(V: Variant): zend_ustr; function toWChar(s: zend_pchar): PWideChar; function ZendToVariant(const Value: pzval;cobj: TObjectBConvertMethod=nil): Variant; {$IFNDEF PHP7} @@ -750,10 +745,11 @@ function ZendToVariant(const Value: pppzval;cobj: TObjectBConvertMethod=nil): Va {$ENDIF} procedure VariantToZend(const Value: Variant; z: pzval; cobj: TObjectAConvertMethod=nil); -procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); -procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); -procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); - +procedure ZVAL_RawStr(z: pzval; s:RawByteString; duplicate: boolean); +procedure ZVAL_STRING(z: pzval; s: WideString; duplicate: boolean); +procedure ZVAL_STRINGU(z: pzval; s: UTF8String; duplicate: boolean); +procedure ZVAL_STRINGW(z: pzval; StW: WideString; duplicate: boolean); +procedure ZVAL_STRINGA(z: pzval; s: AnsiString; duplicate: boolean); procedure ZVAL_STRINGL(z: pzval; s: zend_pchar; l: integer; duplicate: boolean); procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); @@ -832,9 +828,11 @@ function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : i function Z_LVAL(z : Pzval) : longint; function Z_BVAL(z : Pzval) : boolean; function Z_DVAL(z : Pzval) : double; -function Z_STRVAL(z : Pzval) : zend_ustr; +function Z_RAWSTR(z: PZval): RawByteString; +function Z_STRVAL(z : Pzval) : WideString; +function Z_ASTRVAL(z : Pzval) : AnsiString; function Z_STRUVAL(z : PZval): UTF8String; -function Z_STRWVAL(z : pzval) : String; +function Z_WSTRVAL(z : pzval) : String; function Z_CHAR(z: PZval) : zend_uchar; function Z_WCHAR(z: PZval) : WideChar; function Z_ACHAR(z: PZVAL): AnsiChar; @@ -873,7 +871,7 @@ function add_char_to_string (_result: Pzval; op1: Pzval; op2: Pzval): Integer; if op1.u1.v._type = IS_STRING then begin _result.value.str.len := op1.value.str.len + op2.value.str.len; - _result.value.str.val := zend_pchar(zend_ustr(op1.value.str.val) + zend_ustr(op2.value.str.val)); + _result.value.str.val := op1.value.str.val + op2.value.str.val; Result := SUCCESS; end; End; @@ -1024,35 +1022,6 @@ procedure ZvalString(z:pzval; s:string; len:Integer = 0); else ZvalString(z, _s, len); end; -function ZvalInt; -begin - Result := z.value.lval; -end; - -function ZvalDouble; -begin - Result := z.value.dval; -end; - -function ZvalBool; -begin - Result := boolean(z.value.lval); -end; - -function ZvalStrS; -begin - Result := z.value.str.val; -end; - -function ZvalStr; -begin - Result := z.value.str.val; -end; - -function ZvalStrW; -begin - Result := WideString(z.value.str.val); -end; procedure ZvalVAL(z:pzval; v:Boolean); Begin @@ -1262,7 +1231,7 @@ function ZValArrayKeyExists(v: pzval; idx: Integer; out pData: pzval) function ZValArrayKeyDel(v: pzval; key: zend_ustr): Boolean; overload; {$IFDEF PHP7} var - pzs: pzend_string; + pzs: zend_pchar; {$ENDIF} begin Result := false; @@ -1282,7 +1251,7 @@ function ZValArrayKeyDel(v: pzval; key: zend_ustr): Boolean; overload; function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload; {$IFDEF PHP7} var - pzs: pzend_string; + pzs: zend_pchar; {$ENDIF} begin Result := false; @@ -1359,9 +1328,9 @@ function GetArgPZval; vtUnicodeString: ZvalVAL(Result, UnicodeString(Args._Reserved1)); vtWideChar: - ZvalVAL(Result, zend_ustr(Args.VWideChar)); + ZvalVAL(Result, zend_pchar(Args.VWideChar)); vtChar: - ZvalVAL(Result, zend_pchar(zend_uchar(Args.VChar))); + ZvalVAL(Result, zend_pchar(Args.VChar)); vtPWideChar: ZvalVAL(Result, Args.VPWideChar); vtPChar: @@ -1373,66 +1342,52 @@ function GetArgPZval; end; -procedure ZVAL_STRINGU(z: pzval; s: PUtf8Char; duplicate: boolean); +procedure ZVAL_STRINGU(z: pzval; s: UTF8String; duplicate: boolean); var - __s : PUTF8Char; + sc: PUTF8Char; begin - if not assigned(s) then - __s := '' - else - __s := s; - - z^.value.str.len := length(__s); + sc := PUtf8Char(s); + z^.value.str.len := Length(s); if duplicate then - - z^.value.str.val := estrndup(__s, z^.value.str.len) + z^.value.str.val := estrndup(sc, z^.value.str.len) else - z^.value.str.val := __s; - {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; + z^.value.str.val := sc; + + z^._type := IS_STRING; end; -procedure ZVAL_STRING(z: pzval; s: zend_pchar; duplicate: boolean); -var - __s : zend_pchar; +procedure ZVAL_RawStr(z: pzval; s: RawByteString; duplicate: boolean); +var _s: RawByteString; begin - if not assigned(s) then - __s := '' - else - __s := s; - - z^.value.str.len := strlen(__s); - if duplicate then - - z^.value.str.val := estrndup(__s, z^.value.str.len) - else - z^.value.str.val := __s; - {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; + _s := s; + SetCodePage(_s, CP_UTF8, not IsUTF8String(_s)); + ZVAL_STRINGU(z, UTF8String(_s), duplicate); end; -procedure ZVAL_STRINGW(z: pzval; s: PWideChar; duplicate: boolean); +procedure ZVAL_STRING(z: pzval; s: WideString; duplicate: boolean); +begin + ZVAL_STRINGU(z, UTF8String(s), duplicate); +end; +procedure ZVAL_STRINGW(z: pzval; StW: WideString; duplicate: boolean); var - __s : zend_pchar; - StA : zend_ustr; - StW : WideString; + St: UTF8String; + sc: PUTF8Char; begin - if not assigned(s) then - __s := '' - else - begin - StW := WideString(s); - StA := zend_ustr(StW); - __s := zend_pchar(StA); - end; - z^.value.str.len := strlen(__s); + St := UTF8String(StW); + sc := PUtf8Char(St); + z^.value.str.len := Length(St); if duplicate then - - z^.value.str.val := estrndup(__s, z^.value.str.len) + z^.value.str.val := estrndup(sc, z^.value.str.len) else - z^.value.str.val := __s; - {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; -end; + z^.value.str.val := sc; + z^._type := IS_STRING; +end; +procedure ZVAL_STRINGA(z: pzval; s: AnsiString; duplicate: boolean); +begin + ZVAL_STRINGU(z, UTF8String(s), duplicate); +end; procedure ZVAL_STRINGL(z: pzval; s: zend_pchar; l: integer; duplicate: boolean); var __s : zend_pchar; @@ -1479,27 +1434,28 @@ procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); procedure ZVAL_EMPTY_STRING(z: pzval); begin z^.value.str.len := 0; - // {$IFDEF PHP510} z^.value.str.val := STR_EMPTY_ALLOC; - (*{$ELSE} - z^.value.str.val := ''; - {$ENDIF}*) {$IFDEF PHP7} z^.u1.v._type {$ELSE} z^._type {$ENDIF} := IS_STRING; end; -function ToStrA(V: Variant): zend_ustr; +function ToStrA(V: Variant): AnsiString; begin Result := V; end; -function ToStr(V: Variant): String; +function ToStr(V: Variant): zend_ustr; +begin + Result := V; +end; + +function ToStrW(V: Variant): WideString; begin Result := V; end; function ToPChar(V: Variant): zend_pchar; begin - Result := zend_pchar(ToStr(V)); + Result := zend_pchar(zend_ustr(V)); end; function toWChar(s: zend_pchar): PWideChar; @@ -1541,8 +1497,6 @@ procedure VarArrayToHash(var HT: pzval;Value: Variant); end; function ZendToVariant(const Value: pzval; cobj: TObjectBConvertMethod=nil): Variant; overload; - Var - S: String; begin case {$IFDEF PHP7} Value^.u1.v._type {$ELSE}Value^._type{$ENDIF} of 0: Result := Null; //Null @@ -1558,11 +1512,11 @@ function ZendToVariant(const Value: pzval; if Assigned(cobj) then Result := cobj(Value) else - Result := Null; //String - 6: begin S := Value^.value.str.val; Result := S; end; + Result := Null; + 6: Result := Z_STRVAL(Value); //String 7: Result := Value^.value.lval; //Resource //Constant - 8: begin S := Value^.value.str.val; Result := S; end; + 8: Result := Z_STRVAL(Value); {$IFDEF PHP7} 9: Result := HashToVarArray(Value^.value.arr) //Constant Array {$ELSE} @@ -1586,9 +1540,10 @@ procedure VariantToZend(const Value:Variant;z:pzval; case TVarData(Value).VType of varString : //Peter Enz begin + // ShowMessage('h_e'); if Assigned ( TVarData(Value).VString ) then begin - ZVAL_STRING(z, TVarData(Value).VString , true); + ZVAL_STRINGA(z, AnsiString(PAnsiChar(TVarData(Value).VString)), true); end else begin @@ -1663,9 +1618,10 @@ procedure VariantToZend(const Value:Variant;z:pzval; end; varStrArg : //Peter Enz begin + //ShowMessage('h_e_e'); if Assigned ( TVarData(Value).VString ) then begin - ZVAL_STRING(z, TVarData(Value).VString , true); + ZVAL_STRINGA(z, AnsiString(PAnsiChar(TVarData(Value).VString)), true); end else begin @@ -1843,7 +1799,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; for i := 0 to Length(arr)-1 do begin - add_next_index_string(z, zend_pchar(arr[i]), 1); + add_next_index_string(z, zend_pchar(zend_ustr(arr[i])), 1); end; Exit; end; @@ -2002,7 +1958,7 @@ procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of ansichar; keyvals: Array of if Length(keynames) = Length(keyvals) then begin for i := 0 to Length(keynames)-1 do - add_assoc_string_ex(z, zend_pchar(zend_uchar(keynames[i])), StrLen(PAnsiChar(keynames[i])) + 1, zend_pchar(zend_uchar(keyvals[i])), 1); + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), Length(zend_ustr(keynames[i])) + 1, zend_pchar(zend_ustr(keyvals[i])), 1); end else begin @@ -2033,7 +1989,7 @@ procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of begin for i := 0 to Length(keynames)-1 do begin - add_assoc_string_ex(z, zend_pchar(keynames[i]), StrLen(zend_pchar(keynames[i])) + 1, zend_pchar(keyvals[i]), 1); + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), Length(zend_ustr(keynames[i])) + 1, zend_pchar(zend_ustr(keyvals[i])), 1); end; Exit; end @@ -2070,7 +2026,7 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: TWSDate; keyvals: TWSDate); overloa begin // // - add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), StrLen(zend_pchar(zend_ustr(keynames[i]))) + 1, + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), Length(zend_ustr(keynames[i])) + 1, zend_pchar(zend_ustr(keyvals[i])), 1); // @@ -2108,7 +2064,7 @@ procedure ZVAL_ARRAYWS(z: pzval; keynames: array of string; keyvals: array of begin for i := 0 to Length(keynames)-1 do begin - add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), StrLen(zend_pchar(zend_ustr(keynames[i]))) + 1, + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), Length(zend_ustr(keynames[i])) + 1, zend_pchar(zend_ustr(keyvals[i])), 1); end; Exit; @@ -2144,7 +2100,7 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: TASDate; keyvals: TASDate); overload; begin for i := 0 to Length(keynames)-1 do begin - add_assoc_string_ex(z, zend_pchar(keynames[i]), StrLen(zend_pchar(keynames[i])) + 1, zend_pchar(keyvals[i]), 1); + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), Length(zend_ustr(keynames[i])) + 1, zend_pchar(zend_ustr(keyvals[i])), 1); end; Exit; end @@ -2179,7 +2135,7 @@ procedure ZVAL_ARRAYAS(z: pzval; keynames: Array of AnsiString; keyvals: Array o begin for i := 0 to Length(keynames)-1 do begin - add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), StrLen(PAnsiChar(keynames[i])) + 1, zend_pchar(zend_ustr(keyvals[i])), 1); + add_assoc_string_ex(z, zend_pchar(zend_ustr(keynames[i])), Length(zend_ustr(keynames[i])) + 1, zend_pchar(zend_ustr(keyvals[i])), 1); end; Exit; end @@ -3202,7 +3158,7 @@ function zend_unregister_functions(functions : {$IFDEF PHP7}P_zend_function_entr var i : integer; {$IFDEF PHP7} - pzs: pzend_string; + pzs: zend_pchar; {$ENDIF} ptr : {$IFDEF PHP7}P_zend_function_entry{$ELSE}pzend_function_entry{$ENDIF}; begin @@ -3481,8 +3437,6 @@ function Z_DVAL(z : pzval) : double; end; function Z_VARREC(z: pzval): TVarRec; - Var - P: zend_ustr; begin if z = nil then begin @@ -3506,16 +3460,8 @@ function Z_VARREC(z: pzval): TVarRec; Result.VExtended^ := z.value.dval; end; IS_STRING: begin - Result.VType := {$IFDEF PHP_UNICE}vtString{$ELSE}vtAnsiString{$ENDIF}; - - SetLength(P, z.value.str.len); - Move(z.value.str.val^, P[1], z.value.str.len); - - {$IFDEF PHP_UNICE} - Result.VUnicodeString := Pointer(p); - {$ELSE} - Result.VAnsiString := Pointer(P); - {$ENDIF} + Result.VType := vtWideString; + Result.VWideString := PWideChar(Z_STRVAL(z)); end; else begin @@ -3524,71 +3470,56 @@ function Z_VARREC(z: pzval): TVarRec; end; end; end; - -function Z_STRUVAL(z : pzval) : UTF8String; +function Z_RawStr(z: pzval): RawByteString; +{$ifdef fpc} +var + s_len: SizeInt; +{$endif} begin - if z = nil then - begin - Result := ''; - exit; - end; - - if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then - begin - SetLength(Result, z.value.str.len); - Move(z.value.str.val^, Result[1], z.value.str.len); - end else - case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of - IS_LONG: Result := IntToStr(z.value.lval); - IS_DOUBLE: Result := FloatToStr(z.value.dval); - IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; - else - Result := ''; + Result := ''; + case z^._type of + IS_BOOL: + begin + if z^.value.lval = 1 then + Result := RawByteString('True') + Else + Result := RawByteString('False'); end; + IS_LONG: + Result := RawByteString(inttostr(z^.value.lval)); + IS_DOUBLE: + Result := RawByteString(FloatToStr(z^.value.dval)); + IS_STRING: + begin + SetString(Result, PAnsiChar(z^.value.str.val), z^.value.str.len); + SetCodePage(Result, CP_UTF8, not IsUTF8String(Result)); + end; + IS_ARRAY: + Result := RawByteString('(array)'); + IS_OBJECT: + Result := RawByteString('[object]'); + IS_RESOURCE: + Result := RawByteString('#resource#id:' + IntToStr(z^.value.lval)); + end; end; - -function Z_STRVAL(z : pzval) : zend_ustr; +function Z_STRUVAL(z : pzval) : UTF8String; begin - if z = nil then - begin - Result := ''; - exit; - end; + Result := UTf8String(Z_RawStr(z)); +end; - if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then - begin - SetLength(Result, z.value.str.len); - Move(z.value.str.val^, Result[1], z.value.str.len); - end else - case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of - IS_LONG: Result := IntToStr(z.value.lval); - IS_DOUBLE: Result := FloatToStr(z.value.dval); - IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; - else - Result := ''; - end; +function Z_STRVAL(z : pzval) : WideString; +begin + Result := WideString(Z_RawStr(z)); end; -function Z_STRWVAL(z : pzval) : String; +function Z_ASTRVAL(z : pzval) : AnsiString; begin - if z = nil then - begin - Result := ''; - exit; - end; + Result := AnsiString(Z_RawStr(z)); +end; - if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_STRING then - begin - SetLength(Result, z.value.str.len); - Move(z.value.str.val^, Result[1], z.value.str.len); - end else - case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of - IS_LONG: Result := IntToStr(z.value.lval); - IS_DOUBLE: Result := FloatToStr(z.value.dval); - IS_BOOL: if z.value.lval = 0 then Result := '' else Result := '1'; - else - Result := ''; - end; +function Z_WSTRVAL(z : pzval) : String; +begin + Result := String(Z_RawStr(z)); end; function Z_CHAR(z: PZval) : zend_uchar; @@ -3627,6 +3558,7 @@ function Z_ACHAR(z: PZVAL): AnsiChar; SetLength(S,1); Result := AnsiChar(S[1]); end; + function Z_WCHAR(z: PZVAL): WideChar; var S: WideString; begin @@ -3679,12 +3611,12 @@ function Z_OBJ_HANDLE(z :pzval) : {$IFDEF PHP7} P_zend_object_handlers {$ELSE} z Result := {$IFDEF PHP7}z.value.obj.handlers{$ELSE}z.value.obj.handle{$ENDIF}; end; -function Z_OBJ_HT(z : pzval) : {$IFDEF PHP7}hzend_types.P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF}; +function Z_OBJ_HT(z : pzval) : pzend_object_handlers; begin Result := z.value.obj.handlers; end; -function Z_OBJPROP(z : pzval;TSRMLS_DC:pointer=nil) : {$IFDEF PHP7}hzend_types.PHashTable{$ELSE}PHashTable{$ENDIF}; +function Z_OBJPROP(z : pzval;TSRMLS_DC:pointer=nil) : {$IFDEF PHP7} PZend_Array {$ELSE} PHashTable {$ENDIF}; {$IFDEF PHP7} begin Result := Z_OBJ_HT(z)^.get_properties(z); @@ -3726,7 +3658,7 @@ function zend_hash_add_or_update(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{ nKeyLength : uint; pData : {$IFDEF PHP7}pzval{$ELSE}pointer{$ENDIF}; nDataSize : uint; pDes : pointer; flag : integer) : integer; {$IFDEF PHP7} -var pz: Pzend_string; +var pz: zend_pchar; {$ENDIF} begin {$IFDEF PHP7} @@ -3750,7 +3682,7 @@ function zend_hash_init_ex (ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDI {$ENDIF} -{$IFNDEF PHP_UNICE} +{$IFNDEF PHP_UNICODE} function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; begin Result := Sysutils.Format(Format, Args); diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index 0de67d3..a9c2d43 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -495,12 +495,12 @@ interface {$ENDIF} zend_uint = UIntPtr; zend_bool = boolean; - zend_uchar = {$IFDEF PHP_UNICE}Utf8Char{$ELSE}AnsiChar{$ENDIF}; - zend_ustr = {$IFDEF PHP_UNICE}Utf8String{$ELSE}AnsiString{$ENDIF}; + zend_uchar = {$IF Defined(PHP_UNICODE)}Utf8Char{$ELSE}AnsiChar{$ENDIF}; + zend_ustr = {$IF Defined(PHP_UNICODE)}UTF8String{$ELSE}AnsiString{$ENDIF}; zend_ulong = ULongPtr; zend_long = IntPtr; - zend_pchar = {$IFDEF PHP_UNICE}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; - zend_pstr = {$IFDEF PHP_UNICE}PUtf8String{$ELSE}PAnsiString{$ENDIF}; + zend_pchar = {$IF Defined(PHP_UNICODE)}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; + zend_pstr = {$IF Defined(PHP_UNICODE)}PUtf8String{$ELSE}PAnsiString{$ENDIF}; {$IFDEF PHP7} _zend_refcounted_h = record refcount : cardinal; @@ -529,14 +529,13 @@ _zend_string = record P_zend_refcounted = ^_zend_refcounted; zend_string = _zend_string; P_zend_string = ^_zend_string; + pzend_string = ^_zend_string; + {$ELSE} + pzend_string = zend_pchar; {$ENDIF} zend_ushort = word; unsigned_char = byte; { Common Types } -{$IFNDEF PHP7} -type - pzend_string = {$IFDEF PHP_UNICE}PUTF8Char{$ELSE}PAnsiChar{$ENDIF}; -{$ENDIF} type uint = longword; PINT = ^Integer; @@ -965,7 +964,7 @@ zvalue_value = record 0: (lval: zend_long); 1: (dval: double); 2: (str: record - val: zend_pchar; + val: PUTF8Char;// zend_pchar; len: integer; end); 3: (ht: PHashTable); diff --git a/Source/hzend_types.pas b/Source/hzend_types.pas index e079681..573b976 100644 --- a/Source/hzend_types.pas +++ b/Source/hzend_types.pas @@ -205,11 +205,11 @@ interface uint32_t = CARDINAL; - zend_pchar = {$IFDEF PHP_UNICE}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; - zend_pstr = {$IFDEF PHP_UNICE}PUtf8String{$ELSE}PAnsiString{$ENDIF}; + zend_pchar = {$IFDEF PHP_UNICODE}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; + zend_pstr = {$IFDEF PHP_UNICODE}PUtf8String{$ELSE}PAnsiString{$ENDIF}; - //zend_uchar = {$IFDEF PHP_UNICE}Utf8Char{$ELSE}AnsiChar{$ENDIF}; - zend_ustr = {$IFDEF PHP_UNICE}Utf8String{$ELSE}AnsiString{$ENDIF}; + //zend_uchar = {$IFDEF PHP_UNICODE}Utf8Char{$ELSE}AnsiChar{$ENDIF}; + zend_ustr = {$IFDEF PHP_UNICODE}Utf8String{$ELSE}AnsiString{$ENDIF}; diff --git a/Source/php4AppIntf.pas b/Source/php4AppIntf.pas index ffb1b2b..ef7a952 100644 --- a/Source/php4AppIntf.pas +++ b/Source/php4AppIntf.pas @@ -12,8 +12,7 @@ unit php4AppIntf; interface -type -zend_pchar = {$IF DEFINED(Unicode)} PUTF8Char {$ELSE} PAnsiChar {$ENDIF}; +uses ZendTypes; function InitRequest : integer; stdcall; procedure DoneRequest(RequestID : integer); stdcall; procedure RegisterVariable(RequestID : integer; AName : zend_pchar; AValue : zend_pchar); stdcall; diff --git a/Source/php4AppUnit.pas b/Source/php4AppUnit.pas index 459d395..b2b78c1 100644 --- a/Source/php4AppUnit.pas +++ b/Source/php4AppUnit.pas @@ -234,7 +234,7 @@ procedure PrepareResult(RequestID : integer; TSRMLS_D : pointer); if zend_hash_find(ht, zend_pchar(InfoBlock.VarList.Names[cnt]), strlen(zend_pchar(InfoBlock.VarList.Names[cnt])) + 1, data) = SUCCESS then case data^^^._type of - IS_STRING : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := data^^^.value.str.val; + IS_STRING : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := Z_STRVAL(data^^); IS_LONG, IS_RESOURCE, IS_BOOL : InfoBlock.VarList.Values[InfoBlock.VarList.Names[cnt]] := IntToStr(data^^^.value.lval); diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 33ffd04..98bfd2b 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -38,9 +38,9 @@ interface uses Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, PHPCommon, WinApi.WinSock, - {$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} PHPTypes, PHPAPI, ZENDAPI, + ZendTypes, PHPTypes, PHPAPI, ZENDAPI, DelphiFunctions, phpFunctions, strUtils, varUtils, - {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} + {$IFDEF PHP_UNICODE}WideStrUtils, {$ENDIF} {$IFDEF soulengine_build} VCL.Dialogs, {$ENDIF} System.UITypes; @@ -868,11 +868,11 @@ procedure delphi_error_cb(_type : integer; const error_filename : zend_pchar; end; {$IFDEF CUTTED_PHP7dll} ShowMessage( - {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} + Format ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])); {$ELSE} php_log_err(zend_pchar( - {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} + {$IFDEF PHP_UNICODE}Format{$ELSE}AnsiFormat{$ENDIF} ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])), p); {$ENDIF} end; @@ -1253,7 +1253,7 @@ procedure TpsvCustomPHP.PrepareResult; begin variable := data^^; convert_to_string(variable); - FVariables[cnt].Value := variable^.value.str.val; + FVariables[cnt].Value := Z_STRVAL(variable); end; finally freemem(data); @@ -1423,10 +1423,11 @@ procedure TpsvCustomPHP.CloseVirtualFile; end; function TpsvCustomPHP.CreateVirtualFile(A_code : zend_ustr): boolean; -{$IFDEF PHP4} var - _handles : array[0..1] of THandle; +{$IFDEF PHP4} +_handles : array[0..1] of THandle; {$ENDIF} +sc:PUTF8Char; begin Result := false; @@ -1580,7 +1581,7 @@ procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; if not IsParamTypeCorrect(FParameters[j].ParamType, Params[j]^) then begin zend_error(E_WARNING, zend_pchar( - {$IFDEF PHP_UNICE}Format{$ELSE}AnsiFormat{$ENDIF} + {$IFDEF PHP_UNICODE}Format{$ELSE}AnsiFormat{$ENDIF} ('Wrong parameter type for %s()', [FActiveFunctionName]))); Exit; end; @@ -1671,7 +1672,7 @@ procedure TPHPEngine.PrepareEngine; delphi_sapi_module.register_server_variables := @php_delphi_register_variables; delphi_sapi_module.log_message := @php_delphi_log_message; if FIniPath <> '' then - delphi_sapi_module.php_ini_path_override := PAnsiChar(FIniPath) + delphi_sapi_module.php_ini_path_override := zend_pchar(FIniPath) else delphi_sapi_module.php_ini_path_override := nil; delphi_sapi_module.block_interruptions := nil; @@ -1720,7 +1721,7 @@ procedure TPHPEngine.RegisterConstants; strlen(zend_pchar(ConstantName)) + 1, zend_pchar(ConstantValue), CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); end; - zend_register_bool_constant( zend_pchar('UTF8_SUPPORT'), 13, {$IFDEF PHP_UNICE}TRUE{$ELSE}FALSE{$ENDIF}, + zend_register_bool_constant( zend_pchar('UTF8_SUPPORT'), 13, {$IFDEF PHP_UNICODE}TRUE{$ELSE}FALSE{$ENDIF}, CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); RegisterInternalConstants(TSRMLS_D); end; @@ -1796,7 +1797,7 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); for cnt := 0 to ALib.Functions.Count - 1 do begin FN := - {$IFDEF PHP_UNICE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} + {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} (ALib.Functions[cnt].FunctionName); if FHash.IndexOf(FN) > -1 then begin @@ -1809,7 +1810,7 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); begin for cnt := 0 to ALib.Functions.Count - 1 do begin - FN := {$IFDEF PHP_UNICE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} + FN := {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} (ALib.Functions[cnt].FunctionName); FHash.AddObject(FN, ALib.Functions[cnt]); end; diff --git a/Source/phpClass.pas b/Source/phpClass.pas index 8e3f286..1074d34 100644 --- a/Source/phpClass.pas +++ b/Source/phpClass.pas @@ -18,7 +18,7 @@ interface uses Windows, SysUtils, Classes, PHPCommon, - {$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF} + {$IFDEF PHP_UNICODE}WideStrUtils, {$ENDIF} ZendTypes, ZendAPI, phpTypes, PHPAPI, phpFunctions; @@ -234,7 +234,7 @@ function class_get_property_handler(_object : pzval; member : pzval; _type : int begin retval := emalloc(sizeof(zval)); ZeroMemory(retval, sizeof(zval)); - propname := member^.value.str.val; + propname := Z_STRVAL(member); new(data); try object_properties := Z_OBJPROP(_object); @@ -271,7 +271,7 @@ procedure class_set_property_handler(_object : pzval; member : pzval; value : pz object_properties : PHashTable; param : TClassProperty; begin - propname := member^.value.str.val; + propname := Z_STRVAL(member); new(data); try object_properties := Z_OBJPROP(_object); @@ -288,7 +288,7 @@ procedure class_set_property_handler(_object : pzval; member : pzval; value : pz convert_to_string(value); param := Obj.Properties.ByName(propname); if Assigned(param) then - param.Value := value.value.str.val; + param.Value := Z_STRVAL(value); end; end; @@ -567,7 +567,7 @@ procedure TPHPClass.ProduceInstance(AValue: pzval); procedure TPHPClass.SetClassName(const Value: zend_ustr); begin - FClassName := {$IFDEF PHP_UNICE}UTF8LowerCase(Value){$ELSE}LowerCase(Value){$ENDIF}; + FClassName := {$IFDEF PHP_UNICODE}UTF8LowerCase(Value){$ELSE}LowerCase(Value){$ENDIF}; end; procedure TPHPClass.SetMethods(const Value: TPHPClassmethods); @@ -875,17 +875,17 @@ procedure TPHPClassMethod.SetDisplayName(const Value: string); F: TPHPClassMethod; begin if - {$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, FName) <> 0 then + {$IFDEF PHP_UNICODE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, FName) <> 0 then begin if Collection <> nil then for I := 0 to Collection.Count - 1 do begin F := TPHPClassMethods(Collection).Items[I]; if (F <> Self) and (F is TPHPClassMethod) and - ({$IFDEF PHP_UNICE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, F.Name) = 0) then + ({$IFDEF PHP_UNICODE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, F.Name) = 0) then raise Exception.Create('Duplicate method name'); end; - FName := {$IFDEF PHP_UNICE}LowerCase(Value){$ELSE}AnsiLowerCase(Value){$ENDIF}; + FName := {$IFDEF PHP_UNICODE}LowerCase(Value){$ELSE}AnsiLowerCase(Value){$ENDIF}; Changed(False); end; end; From fd245b246a56e81dd7cc077a0bde79a15ac914d7 Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Wed, 12 Feb 2020 14:38:02 +0200 Subject: [PATCH 38/54] Fixes --- Source/ZENDAPI.pas | 13 +++++++++++-- Source/ZendTypes.pas | 2 +- Source/phpClass.pas | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 2a965f2..2c50f1f 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -3437,6 +3437,7 @@ function Z_DVAL(z : pzval) : double; end; function Z_VARREC(z: pzval): TVarRec; +var P: zend_ustr; begin if z = nil then begin @@ -3460,8 +3461,16 @@ function Z_VARREC(z: pzval): TVarRec; Result.VExtended^ := z.value.dval; end; IS_STRING: begin - Result.VType := vtWideString; - Result.VWideString := PWideChar(Z_STRVAL(z)); + Result.VType := {$IFDEF PHP_UNICODE}vtString{$ELSE}vtAnsiString{$ENDIF}; + + SetLength(P, z.value.str.len); + Move(z.value.str.val^, P[1], z.value.str.len); + + {$IFDEF PHP_UNICODE} + Result.VUnicodeString := Pointer(P); + {$ELSE} + Result.VAnsiString := Pointer(P); + {$ENDIF} end; else begin diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index a9c2d43..252446a 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -964,7 +964,7 @@ zvalue_value = record 0: (lval: zend_long); 1: (dval: double); 2: (str: record - val: PUTF8Char;// zend_pchar; + val: zend_pchar; len: integer; end); 3: (ht: PHashTable); diff --git a/Source/phpClass.pas b/Source/phpClass.pas index 1074d34..a51fceb 100644 --- a/Source/phpClass.pas +++ b/Source/phpClass.pas @@ -885,7 +885,7 @@ procedure TPHPClassMethod.SetDisplayName(const Value: string); ({$IFDEF PHP_UNICODE}CompareText{$ELSE}AnsiCompareText{$ENDIF}(Value, F.Name) = 0) then raise Exception.Create('Duplicate method name'); end; - FName := {$IFDEF PHP_UNICODE}LowerCase(Value){$ELSE}AnsiLowerCase(Value){$ENDIF}; + FName := {$IFDEF PHP_UNICODE}UTF8LowerCase(Value){$ELSE}AnsiLowerCase(Value){$ENDIF}; Changed(False); end; end; From 93920a67e7941078c521c974bfb8bb80265acd10 Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Wed, 12 Feb 2020 15:30:36 +0200 Subject: [PATCH 39/54] Fixes #2 --- Source/PHPFunctions.pas | 9 ++++++++- Source/ZENDAPI.pas | 13 ++----------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Source/PHPFunctions.pas b/Source/PHPFunctions.pas index 07abf5b..eef5c76 100644 --- a/Source/PHPFunctions.pas +++ b/Source/PHPFunctions.pas @@ -611,7 +611,14 @@ function TZendVariable.GetAsString: zend_ustr; end; case {$IFDEF PHP7}FValue^.u1.v._type{$ELSE} FValue^._type{$ENDIF} of - IS_STRING : result := Z_STRVAL(FValue); + IS_STRING : begin + try + SetLength(Result, FValue^.value.str.len); + Move(FValue^.value.str.val^, Result[1], FValue^.value.str.len); + except + Result := ''; + end; + end; IS_DOUBLE : result := FloatToStr(FValue^.value.dval); IS_LONG : result := IntToStr(FValue^.value.lval); IS_NULL : result := ''; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 2c50f1f..5ecb63b 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -1552,11 +1552,7 @@ procedure VariantToZend(const Value:Variant;z:pzval; end; varUString : //Peter Enz - begin - S := string(TVarData(Value).VUString); - - ZVAL_STRING(z, zend_pchar(zend_ustr(S)), true); - end; + ZVAL_RawStr(z, RawByteString(TVarData(Value).VUString), true); varOleStr : //Peter Enz begin @@ -1629,12 +1625,7 @@ procedure VariantToZend(const Value:Variant;z:pzval; end; end; - varUStrArg : //Peter Enz - begin - S := string(TVarData(Value).VUString); - - ZVAL_STRING(z, zend_pchar(zend_ustr(S)), true); - end; + varUStrArg : ZVAL_RawStr(z, RawByteString(TVarData(Value).VUString), true); varInt64 : ZVALVAL(z, TVarData(Value).VInt64); varUInt64 : ZVALVAL(z, TVarData(Value).VUInt64); varShortInt : ZVALVAL(z, Integer(TVarData(Value).VShortInt)); From a5a7b69b7a3a81740fc2b59f72ae191ee374d3a6 Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Wed, 12 Feb 2020 16:52:29 +0200 Subject: [PATCH 40/54] zend_ustr --- Source/ZENDAPI.pas | 10 ++++------ Source/php4delphi.pas | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 5ecb63b..43948b9 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -1538,9 +1538,8 @@ procedure VariantToZend(const Value:Variant;z:pzval; Exit; end; case TVarData(Value).VType of - varString : //Peter Enz + varString : begin - // ShowMessage('h_e'); if Assigned ( TVarData(Value).VString ) then begin ZVAL_STRINGA(z, AnsiString(PAnsiChar(TVarData(Value).VString)), true); @@ -1551,10 +1550,10 @@ procedure VariantToZend(const Value:Variant;z:pzval; end; end; - varUString : //Peter Enz + varUString : ZVAL_RawStr(z, RawByteString(TVarData(Value).VUString), true); - varOleStr : //Peter Enz + varOleStr : begin if Assigned ( TVarData(Value).VOleStr ) then begin @@ -1612,9 +1611,8 @@ procedure VariantToZend(const Value:Variant;z:pzval; else ZVALVAL(z, integer(TObject(TVarData(Value).VPointer^))); end; - varStrArg : //Peter Enz + varStrArg : begin - //ShowMessage('h_e_e'); if Assigned ( TVarData(Value).VString ) then begin ZVAL_STRINGA(z, AnsiString(PAnsiChar(TVarData(Value).VString)), true); diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 98bfd2b..d5e6a95 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -198,7 +198,7 @@ TCustomPHPLibrary = class(TPHPComponent) TPHPEngineInitEvent = procedure(Sender:TObject;TSRMLS_DC:Pointer) of object; TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) private - FINIPath : AnsiString; + FINIPath : zend_ustr; FOnEngineStartup : TNotifyEvent; FAddMods : TArray; FOnEngineShutdown : TNotifyEvent; @@ -264,7 +264,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) property OnEngineShutdown : TNotifyEvent read FOnEngineShutdown write FOnEngineShutdown; property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; - property IniPath : AnsiString read FIniPath write FIniPath; + property IniPath : zend_ustr read FIniPath write FIniPath; {$IFNDEF PHP540} property SafeMode : boolean read FSafeMode write FSafeMode default false; property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; From 978b112c9c283e3a1acb28dd998d2ff45e957984 Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Wed, 12 Feb 2020 17:57:41 +0200 Subject: [PATCH 41/54] Some small fixes One more step #7 to remove assembler --- Source/Demos/psvPHP/console/phpcon.dpr | 2 +- Source/ZENDAPI.pas | 1 - Source/php4delphi.pas | 5 +---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Source/Demos/psvPHP/console/phpcon.dpr b/Source/Demos/psvPHP/console/phpcon.dpr index afe658b..e6ab66e 100644 --- a/Source/Demos/psvPHP/console/phpcon.dpr +++ b/Source/Demos/psvPHP/console/phpcon.dpr @@ -42,7 +42,7 @@ var begin if zend_parse_method_parameters(1, TSRMLS_DC, this_ptr, 'z', @p) = 0 then begin - ZVAL_STRING(z,'🐆🐆🐆 .-=WPD=-. 🐆🐆🐆',true); + ZVAL_STRINGW(p,'🐆🐆🐆 .-=WPD=-. 🐆🐆🐆',true); end; end; begin diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 43948b9..531519b 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -1530,7 +1530,6 @@ procedure VariantToZend(const Value:Variant;z:pzval; cobj: TObjectAConvertMethod=nil); var W : WideString; - S: String; begin if VarIsEmpty(value) or VarIsNull(Value) then begin diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index d5e6a95..e55b8ae 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -1616,10 +1616,7 @@ procedure TPHPEngine.PrepareIniEntry; if FHandleErrors then begin - // p := integer(GetProcAddress(PHPLib, 'zend_do_print')); - p := GetProcAddress(PHPLib, 'zend_error_cb'); - p2 := @delphi_error_cb; - Move(p, p2, 1); + ppointer(GetProcAddress(PHPLib, 'zend_error_cb'))^ := @delphi_error_cb; end; {$IFNDEF PHP540} if FSafeMode then From 75337d1711d0d88e58adad2ad84dedd576d02e3a Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Sat, 15 Feb 2020 05:04:34 +0200 Subject: [PATCH 42/54] Update ZENDAPI.pas --- Source/ZENDAPI.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 531519b..2b82542 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -1058,7 +1058,7 @@ procedure ZvalVAL(z:pzval; v:Double); z^.u1.v._type {$ELSE} z^._type - {$ENDIF} := IS_LONG; + {$ENDIF} := IS_DOUBLE; z.value.dval := v; End; From 14d9e47e7a4d5b02e531cc2dc9a0e23519fd6478 Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Sat, 15 Feb 2020 07:22:18 +0200 Subject: [PATCH 43/54] actualized calls --- Source/phpClass.pas | 2 +- Source/phpModules.pas | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Source/phpClass.pas b/Source/phpClass.pas index a51fceb..3770112 100644 --- a/Source/phpClass.pas +++ b/Source/phpClass.pas @@ -367,7 +367,7 @@ function class_call_method(method : zend_pchar; ht : integer; return_value : pzv M.ZendVar.AsZendVariable := return_value; //direct access to zend variable M.FOnExecute(Obj, M.Parameters, M.ReturnValue, M.FZendVar.AsZendVariable, this_ptr, TSRMLS_DC); if M.ZendVar.ISNull then //perform variant conversion - variant2zval(M.ReturnValue, return_value); + VariantToZend(M.ReturnValue, return_value); end; end; diff --git a/Source/phpModules.pas b/Source/phpModules.pas index 04dcf0a..6c12fa1 100644 --- a/Source/phpModules.pas +++ b/Source/phpModules.pas @@ -265,7 +265,7 @@ function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointe procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; return_value_used : integer; TSRMLS_DC : pointer); cdecl; begin - ZVAL(return_value); + ZvalVal(return_value); if Assigned(Application) then try Application.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); @@ -407,22 +407,30 @@ function TCustomPHPExtension.FunctionByName( procedure TCustomPHPExtension.phpwrite(str: zend_pchar; str_len: integer); begin +{$IFNDEF PHP550} php_body_write(str, str_len, FTSRMLS); +{$ENDIF} end; procedure TCustomPHPExtension.phpwrite_h(str: zend_pchar; str_len: integer); begin +{$IFNDEF PHP550} php_header_write(str, str_len, FTSRMLS); +{$ENDIF} end; procedure TCustomPHPExtension.puts(str: zend_pchar); begin +{$IFNDEF PHP550} php_body_write(str, strlen(str), FTSRMLS); +{$ENDIF} end; procedure TCustomPHPExtension.puts_h(str: zend_pchar); begin +{$IFNDEF PHP550} php_header_write(str, strlen(str), FTSRMLS); +{$ENDIF} end; procedure TCustomPHPExtension.ReportError(ErrType: integer; @@ -466,6 +474,7 @@ procedure DoneVCLApplication; VCL.Forms.Application.ShowHint := False; VCL.Forms.Application.Destroying; VCL.Forms.Application.DestroyComponents; + {$ENDIF} except end; end; @@ -702,7 +711,7 @@ procedure TPHPApplication.HandleRequest(ht: integer; return_value : pzval; retu FZendVar.AsZendVariable := return_value; AFunction.OnExecute(DataModule, FParameters, ReturnValue, FZendVar, TSRMLS_DC); if FZendVar.ISNull then - variant2zval(ReturnValue, return_value); + VariantToZend(ReturnValue, return_value); finally FZendVar.Free; end; From d30902d424ec8d8c18f9e0498595040ed390e0ea Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Tue, 18 Feb 2020 08:24:33 +0200 Subject: [PATCH 44/54] some changes --- .../MultithreadSample.dproj | 275 +++++++++++------- .../MultithreadSample.otares | Bin 0 -> 96 bytes .../Multithread simple/MultithreadSample.res | Bin 1860 -> 4172 bytes .../MultithreadSample_Icon.ico | Bin 0 -> 1718 bytes .../MultithreadSample_Icon1.ico | Bin 0 -> 1718 bytes .../MultithreadSample_Icon2.ico | Bin 0 -> 1718 bytes .../MultithreadSample_Icon3.ico | Bin 0 -> 1718 bytes .../MultithreadSample_Icon4.ico | Bin 0 -> 1718 bytes Source/Demos/psvPHP/console/phpcon.dpr | 1 + Source/Demos/psvPHP/console/phpcon.dproj | 51 ++-- Source/PHPAPI.pas | 8 +- Source/ZENDAPI.pas | 86 +++--- Source/hzend_types.pas | 1 - ...4delphi Delphi 10.1 Berlin.groupproj.local | 2 +- .../packages/php4delphi Delphi 10.tvsconfig | 2 + Source/php4DelphiD2010.identcache | Bin 1252 -> 1204 bytes Source/php4DelphiD2010.stat | 6 +- Source/php4DelphiR2010.identcache | Bin 856 -> 823 bytes Source/php4DelphiR2010.stat | 6 +- Source/php4delphi.pas | 122 ++------ Source/phpAbout.dfm | 2 +- readme.txt | 8 +- 22 files changed, 293 insertions(+), 277 deletions(-) create mode 100644 Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.otares create mode 100644 Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon.ico create mode 100644 Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon1.ico create mode 100644 Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon2.ico create mode 100644 Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon3.ico create mode 100644 Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon4.ico create mode 100644 Source/packages/php4delphi Delphi 10.tvsconfig diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj index 4d406d5..8e2a16e 100644 --- a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj +++ b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.dproj @@ -1,106 +1,169 @@ - - - {94D8351C-D7FA-4AB4-B4FA-8A463EB52A65} - MultithreadSample.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - 00400000 - false - x86 - MultithreadSample.exe - false - false - false - false - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
frmMain
-
- - - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - MultithreadSample.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 2057 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - -
+ + + {94D8351C-D7FA-4AB4-B4FA-8A463EB52A65} + MultithreadSample.dpr + Debug + DCC32 + 18.2 + VCL + True + Win32 + 1 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + MultithreadSample + 2057 + 00400000 + false + x86 + MultithreadSample.exe + false + false + false + false + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + true + $(BDS)\bin\default_app.manifest + MultithreadSample_Icon4.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + 1033 + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) + Debug + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + MultithreadSample_Icon4.ico + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + true + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + DEBUG;$(DCC_Define) + + + true + true + + + + MainSource + + +
frmMain
+
+ + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + MultithreadSample.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2057 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + False + + + 12 + + +
diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.otares b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.otares new file mode 100644 index 0000000000000000000000000000000000000000..743599575b02e97248bade49ed2e3eabafe25a0a GIT binary patch literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& literal 0 HcmV?d00001 diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample.res index c791b86b17d95defb4193c5c4f343c6fc35628c0..8afa5b2c3cd86b7e1c5d983078f9c252305bac54 100644 GIT binary patch literal 4172 zcmbuBPi))B6~>>lZXp}l!s#LCAqOte!=?ZwN<+y~ASZB=T|nr%Ycx)JOeu24CMuCy zlJXz41$0V$Tws9!yzOCIpod-p?6H7PJv2Ngm*$iL3j_t$xdm8YXTKSWl5MP!U_)t! zGjHC!?>BFTl!%B76e){>=BdlRP>!#_XF-qIw6s_{*%ur%@6jE)kNP9}Jz72blzxYP z5B0}rtLtBj-+oV|<`*%_`wcxxqym;BQxkm-!vf-^6jMMUZ6jJh1LBArlAs8V1MOpz zLpF6#955)NPw1DJTl(L|oP<0bXM}hG=7w5kgT{!cEGg|^oRdpFG+i3fNNW+IR!+pa z2cHXsEGWnH65*aI>uS$v$}sI6P(4IZKx~79%$6% zfn^9rj=GPL7#6iswU!9>x5}ow*Jl!hmX`?x-e*dk^Kq>Z_lS=F^LJWYT%<~+ zLKiPyq)V4B(dEmR>B^NWWSS;jy?T}I-n~m38yj@<=1uB!IyCud2b0xSY70xWvTU=a`(5E2L~ zz@pQDL4k$g?Q zL4rYoL4rYoK_4eD)bebtQfMhU@tFcuK)A&=$8HmR0g(B{JyD|?ghN5SM;x&`ZZiY zPt_Gt?{xJhfAn)AL&y9T;ubIIlmEH8H};1EW0%KC5QS@Iy=t2V5533_!tFKl?$*av z+cc8Y4SjbIg?!CC;E8$T`uodWH%a)gKR7TDAWYWGaU5Ptyd6Gt6KfcFag;-E>0e8}LbgfpKGFE4dRWR1>Z1idk+iuqWaC)*?L`H0X6s+&LF~7bQk9lo#qg$I< z3h`P&bw*vy?@otK0_%17e8fW^`97E~pfsfG)9lXV%XIhPo(AcG)>Mm54@TG)sIrDR zGluRE#*K0ts?$|fZ$-ml6k4~UFpZ-@GM_Lz0j;X7KJ$^$xQ{IVmLF_If8sbIt!Ag$ zZ#i|x@jOxY#oTk?hTCIz8^XVt8%J^E@g#}j_1N19QtqYWSbNl_ORoLsnvvakZgj5F zc$}oYP((tQ7l_aBmzVW3yDo{IfBRA@?`qU^f`>ZJv~4*sIy-NBfwl4%a7q zmk(yCHH?AkubFPr3wM!|c)nP}7zgW~TJM@E+(E+4=_>W9j0|c}>f03U1kU z+vl7!p9%Y~$jDEXUp-%%HS4V1@3>ae??77geXGqIzU4L?$8I#5qQhJz{Sz17K3~~! z8=}$X%xbcJ$8sE}ZuQ-cXZfv;@3@ZJ;;j8H%GLV$+I7)dZF#FLt8MeT=V`Y(81g)pCwKv#U+YR{-d_{_@^vXa$*v=veq(~#!zbZwX zTANr|2olKI2`M(;%srnd2?==K&d&U9cjmjL^+O&g-XG4aF+u>o`=9;j$j8-O-3D0ZZQfqh&{zAg+J-WIB1WX$A!uF(P$)1)5yZYf-Eg9$@22DtgNia>guYjudmC_&W>ztZOP{5rfh6% zNc*>K_kTQ%>7(RrGrf7<$p>Ytg#Lx}L&<)+tV_QKl z=!Kx57j!0ZbVqk|NANgM;!0dSD=St>t|U@6Dd(Q$F$#mipfD&5i3EefpfD&53PWPT zpfD&53WLIs=rAY@3WLI+Fla@CL*dZi;2VP~DGY0{7%T=$zA`LEaifrt)L_Xr@X&A! z7K0_*0*Aq2a2Om0N45$MgTY`h7@~CshrwVlcz*Fdw2(T(A91!fx&sxp3+uAg)Gja; ziWUkKm)%-A?adf?P^ z*c=Y0ULI|5&;y6VgM$~#<7Sh?;;=XnPQm;HU~x7&iyXmW;bxGBGjUiv`jIU0HN+{P z!BAnSFjN>S3>Aj_oM3PmDhw3{hk-N<*27R?s4!F*NXG};)O?OBD literal 0 HcmV?d00001 diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon1.ico b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..43bf0027de8e8ca4a91dc7cc72d11c86ba4bbbf9 GIT binary patch literal 1718 zcmbu9u}d965QoR`0*6>=V`Y(81g)pCwKv#U+YR{-d_{_@^vXa$*v=veq(~#!zbZwX zTANr|2olKI2`M(;%srnd2?==K&d&U9cjmjL^+O&g-XG4aF+u>o`=9;j$j8-O-3D0ZZQfqh&{zAg+J-WIB1WX$A!uF(P$)1)5yZYf-Eg9$@22DtgNia>guYjudmC_&W>ztZOP{5rfh6% zNc*>K_kTQ%>7(RrGrf7<$p>Ytg#Lx}L&<)+tV_QKl z=!Kx57j!0ZbVqk|NANgM;!0dSD=St>t|U@6Dd(Q$F$#mipfD&5i3EefpfD&53PWPT zpfD&53WLIs=rAY@3WLI+Fla@CL*dZi;2VP~DGY0{7%T=$zA`LEaifrt)L_Xr@X&A! z7K0_*0*Aq2a2Om0N45$MgTY`h7@~CshrwVlcz*Fdw2(T(A91!fx&sxp3+uAg)Gja; ziWUkKm)%-A?adf?P^ z*c=Y0ULI|5&;y6VgM$~#<7Sh?;;=XnPQm;HU~x7&iyXmW;bxGBGjUiv`jIU0HN+{P z!BAnSFjN>S3>Aj_oM3PmDhw3{hk-N<*27R?s4!F*NXG};)O?OBD literal 0 HcmV?d00001 diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon2.ico b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon2.ico new file mode 100644 index 0000000000000000000000000000000000000000..43bf0027de8e8ca4a91dc7cc72d11c86ba4bbbf9 GIT binary patch literal 1718 zcmbu9u}d965QoR`0*6>=V`Y(81g)pCwKv#U+YR{-d_{_@^vXa$*v=veq(~#!zbZwX zTANr|2olKI2`M(;%srnd2?==K&d&U9cjmjL^+O&g-XG4aF+u>o`=9;j$j8-O-3D0ZZQfqh&{zAg+J-WIB1WX$A!uF(P$)1)5yZYf-Eg9$@22DtgNia>guYjudmC_&W>ztZOP{5rfh6% zNc*>K_kTQ%>7(RrGrf7<$p>Ytg#Lx}L&<)+tV_QKl z=!Kx57j!0ZbVqk|NANgM;!0dSD=St>t|U@6Dd(Q$F$#mipfD&5i3EefpfD&53PWPT zpfD&53WLIs=rAY@3WLI+Fla@CL*dZi;2VP~DGY0{7%T=$zA`LEaifrt)L_Xr@X&A! z7K0_*0*Aq2a2Om0N45$MgTY`h7@~CshrwVlcz*Fdw2(T(A91!fx&sxp3+uAg)Gja; ziWUkKm)%-A?adf?P^ z*c=Y0ULI|5&;y6VgM$~#<7Sh?;;=XnPQm;HU~x7&iyXmW;bxGBGjUiv`jIU0HN+{P z!BAnSFjN>S3>Aj_oM3PmDhw3{hk-N<*27R?s4!F*NXG};)O?OBD literal 0 HcmV?d00001 diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon3.ico b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon3.ico new file mode 100644 index 0000000000000000000000000000000000000000..43bf0027de8e8ca4a91dc7cc72d11c86ba4bbbf9 GIT binary patch literal 1718 zcmbu9u}d965QoR`0*6>=V`Y(81g)pCwKv#U+YR{-d_{_@^vXa$*v=veq(~#!zbZwX zTANr|2olKI2`M(;%srnd2?==K&d&U9cjmjL^+O&g-XG4aF+u>o`=9;j$j8-O-3D0ZZQfqh&{zAg+J-WIB1WX$A!uF(P$)1)5yZYf-Eg9$@22DtgNia>guYjudmC_&W>ztZOP{5rfh6% zNc*>K_kTQ%>7(RrGrf7<$p>Ytg#Lx}L&<)+tV_QKl z=!Kx57j!0ZbVqk|NANgM;!0dSD=St>t|U@6Dd(Q$F$#mipfD&5i3EefpfD&53PWPT zpfD&53WLIs=rAY@3WLI+Fla@CL*dZi;2VP~DGY0{7%T=$zA`LEaifrt)L_Xr@X&A! z7K0_*0*Aq2a2Om0N45$MgTY`h7@~CshrwVlcz*Fdw2(T(A91!fx&sxp3+uAg)Gja; ziWUkKm)%-A?adf?P^ z*c=Y0ULI|5&;y6VgM$~#<7Sh?;;=XnPQm;HU~x7&iyXmW;bxGBGjUiv`jIU0HN+{P z!BAnSFjN>S3>Aj_oM3PmDhw3{hk-N<*27R?s4!F*NXG};)O?OBD literal 0 HcmV?d00001 diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon4.ico b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Multithread simple/MultithreadSample_Icon4.ico new file mode 100644 index 0000000000000000000000000000000000000000..43bf0027de8e8ca4a91dc7cc72d11c86ba4bbbf9 GIT binary patch literal 1718 zcmbu9u}d965QoR`0*6>=V`Y(81g)pCwKv#U+YR{-d_{_@^vXa$*v=veq(~#!zbZwX zTANr|2olKI2`M(;%srnd2?==K&d&U9cjmjL^+O&g-XG4aF+u>o`=9;j$j8-O-3D0ZZQfqh&{zAg+J-WIB1WX$A!uF(P$)1)5yZYf-Eg9$@22DtgNia>guYjudmC_&W>ztZOP{5rfh6% zNc*>K_kTQ%>7(RrGrf7<$p>Ytg#Lx}L&<)+tV_QKl z=!Kx57j!0ZbVqk|NANgM;!0dSD=St>t|U@6Dd(Q$F$#mipfD&5i3EefpfD&53PWPT zpfD&53WLIs=rAY@3WLI+Fla@CL*dZi;2VP~DGY0{7%T=$zA`LEaifrt)L_Xr@X&A! z7K0_*0*Aq2a2Om0N45$MgTY`h7@~CshrwVlcz*Fdw2(T(A91!fx&sxp3+uAg)Gja; ziWUkKm)%-A?adf?P^ z*c=Y0ULI|5&;y6VgM$~#<7Sh?;;=XnPQm;HU~x7&iyXmW;bxGBGjUiv`jIU0HN+{P z!BAnSFjN>S3>Aj_oM3PmDhw3{hk-N<*27R?s4!F*NXG};)O?OBD literal 0 HcmV?d00001 diff --git a/Source/Demos/psvPHP/console/phpcon.dpr b/Source/Demos/psvPHP/console/phpcon.dpr index e6ab66e..1ba3210 100644 --- a/Source/Demos/psvPHP/console/phpcon.dpr +++ b/Source/Demos/psvPHP/console/phpcon.dpr @@ -19,6 +19,7 @@ uses php4delphi, zendAPI, ZENDTypes; + var php : TpsvPHP; Engine : TPHPEngine; diff --git a/Source/Demos/psvPHP/console/phpcon.dproj b/Source/Demos/psvPHP/console/phpcon.dproj index 06928a9..f329cbf 100644 --- a/Source/Demos/psvPHP/console/phpcon.dproj +++ b/Source/Demos/psvPHP/console/phpcon.dproj @@ -8,7 +8,7 @@ Console None 18.2 - Win32 + Win64
true @@ -39,11 +39,23 @@ true true + + true + Cfg_1 + true + true + true Base true + + true + Cfg_2 + true + true + true Cfg_2 @@ -116,12 +128,20 @@ 1033 CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + true DEBUG;$(DCC_Define) false + + info.php + + info.php 1033 CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= @@ -150,14 +170,9 @@ phpcon.dpr - File C:\Program Files (x86)\FastReports\LibD24\dclfrx24.bpl not found - File C:\Program Files (x86)\FastReports\LibD24\dclfrxDB24.bpl not found - File C:\Program Files (x86)\FastReports\LibD24\dclfrxe24.bpl not found - File C:\Program Files (x86)\FastReports\LibD24\dclfrxtee24.bpl not found Embarcadero C++Builder Office 2000 Servers Package Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components - BCEditor Components @@ -186,22 +201,13 @@ true - + phpcon.exe true - - - 0 - .dll;.bpl - - - 1 - .dylib - - + Contents\Resources @@ -540,7 +546,16 @@ 1 - + + + 0 + .dll;.bpl + + + 1 + .dylib + + diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index 28b154e..186c619 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -66,7 +66,7 @@ interface sapi_add_header_ex: function(header_line : zend_pchar; header_line_len : uint; duplicated : zend_bool; replace : zend_bool; TSRMLS_DC : pointer) : integer; cdecl; - php_execute_script : function (primary_file: PZendFileHandle; TSRMLS_D : pointer) : {$IFDEF CPUX64} Int64 {$ELSE} Integer{$ENDIF}; cdecl; + php_execute_script : function (primary_file: PZendFileHandle; TSRMLS_D : pointer) : longint; cdecl; php_handle_aborted_connection: procedure; cdecl; @@ -345,7 +345,7 @@ function GetSAPIGlobals : Psapi_globals_struct; begin Result := nil; if Assigned(sapi_globals_id) then - Result := __asm_fetchval(IntPtr(sapi_globals_id^), tsrmls_fetch); + Result := __fgsapi(pointer(sapi_globals_id^), tsrmls_fetch); end; function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; var @@ -354,7 +354,7 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; Result := nil; sapi_global_id := GetProcAddress(PHPLib, 'sapi_globals_id'); if Assigned(sapi_global_id) then - Result := __asm_fetchval(IntPtr(sapi_globals_id^), TSRMLS_DC); + Result := __fgsapi(pointer(sapi_globals_id^), TSRMLS_DC); end; function GetStringOf(const V: TVarData): string; @@ -407,7 +407,7 @@ function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; begin Result := nil; if Assigned(core_globals_id) then - Result := Pphp_Core_Globals(__asm_fetchval(IntPtr(core_globals_id^), TSRMLS_DC)); + Result := Pphp_Core_Globals(__fgsapi(pointer(core_globals_id^), TSRMLS_DC)); end; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 2b82542..6415459 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -69,6 +69,9 @@ interface EPHP4DelphiException = class(Exception) constructor Create(const Msg: zend_ustr); end; + EPHP4DelphiHookException = class(Exception) + constructor Create(const Msg: zend_ustr); + end; align_test = record case Integer of @@ -82,14 +85,9 @@ align_test = record function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; {$ENDIF} function Lfunc(var Func: Pointer; addr: LPCWSTR): Bool; +function HFunc(const Func: Pointer; addr: LPCWSTR): Bool; function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; -function __asm_fetchval -{$IFDEF CPUX64} -(val_id: int64; tsrmls_dc_p: pointer) -{$ELSE} -(val_id: integer; tsrmls_dc_p: pointer) -{$ENDIF} -: pointer; +function __fgsapi(sapi_globals_value:pointer; tsrmls_dc:pointer): Pointer; procedure UnloadZEND; function ZENDLoaded: boolean; @@ -294,38 +292,38 @@ procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE} // zend_constants.h var zend_get_constant : function(name: zend_pchar; name_len: uint; var result: zval; - TSRMLS_DC: Pointer): IntPtr; cdecl; + TSRMLS_DC: Pointer): integer; cdecl; zend_register_null_constant : procedure(name: zend_pchar; name_len: uint; - flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; + flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; zend_register_bool_constant : procedure(name: zend_pchar; name_len: uint; - bval: zend_bool; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; + bval: zend_bool; flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; zend_register_long_constant : procedure(name: zend_pchar; name_len: uint; - lval: Longint; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; + lval: Longint; flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; zend_register_double_constant : procedure(name: zend_pchar; name_len: uint; - dval: Double; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; + dval: Double; flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; zend_register_string_constant : procedure(name: zend_pchar; name_len: uint; - strval: zend_pchar; flags: IntPtr; module_number: IntPtr; TSRMLS_DC: Pointer); cdecl; + strval: zend_pchar; flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; zend_register_stringl_constant : procedure(name: zend_pchar; name_len: uint; - strval: zend_pchar; strlen: uint; flags: IntPtr; module_number: IntPtr; + strval: zend_pchar; strlen: uint; flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; - zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): IntPtr; cdecl; + zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): integer; cdecl; zend_register_auto_global : {$IFDEF PHP700} - function(name:Pzend_string; jit:boolean; instance_init_callback:Pointer): IntPtr; cdecl; + function(name:Pzend_string; jit:boolean; instance_init_callback:Pointer): integer; cdecl; {$ELSE} {$IFDEF PHP5} - function(name: zend_pchar; name_len: uint; jit:boolean; instance_init_callback: Pointer; TSRMLS_DC: Pointer): IntPtr; cdecl; + function(name: zend_pchar; name_len: uint; jit:boolean; instance_init_callback: Pointer; TSRMLS_DC: Pointer): integer; cdecl; zend_activate_auto_globals: procedure(TSRMLS_C: Pointer); cdecl; {$ELSE} - function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): IntPtr; cdecl; + function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): integer; cdecl; {$ENDIF} {$ENDIF} procedure REGISTER_MAIN_LONG_CONSTANT(name: zend_pchar; lval: longint; flags: integer; TSRMLS_DC: Pointer); @@ -2163,6 +2161,24 @@ function Lfunc(var Func: Pointer; addr: LPCWSTR): BOOL; Result := False; end; end; +function HFunc(const Func: Pointer; addr: LPCWSTR): BOOL; +var fr: FARPROC; +begin + Result := True; + + fr := GetProcAddress(PHPLib, addr); + if (Func = nil) or (fr = nil) then + begin + {$IFNDEF QUIET_LOAD} + raise EPHP4DelphiHookException.Create(addr); + {$ENDIF} + Result := False; + end else + begin + if ppointer(fr)^ <> Func then + ppointer(fr)^ := Func; + end; +end; procedure zend_copy_constant(c: zend_constant); begin c.name := zend_strndup(c.name, c.name_len - 1); @@ -3083,11 +3099,7 @@ function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS begin Params[i]^ := p^^; if i <> number then - {$IFDEF CPUX64} p^ := ppzval( integer(p^) + sizeof(ppzval) ); - {$ELSE} - inc(integer(p^), sizeof(ppzval)); - {$ENDIF} end; efree(p); @@ -3116,6 +3128,10 @@ constructor EPHP4DelphiException.Create(const Msg: zend_ustr); begin inherited Create('Unable to link '+ Msg+' function'); end; +constructor EPHP4DelphiHookException.Create(const Msg: zend_ustr); +begin + inherited Create('Unable to hook '+ Msg+' function'); +end; {procedure zenderror(Error : zend_pchar); begin @@ -3245,25 +3261,11 @@ function zend_register_functions(functions : {$IFDEF PHP7}P_zend_function_entry{ end; -function __asm_fetchval(val_id: IntPtr; tsrmls_dc_p: pointer) -: pointer; assembler; register; -{$IFDEF CPUX64} -asm - mov rcx, val_id - mov rdx, dword64 ptr tsrmls_dc_p - mov rax, dword64 ptr [rdx] - mov rcx, dword64 ptr [rax+rcx*8-8] - mov Result, rcx -end; -{$ELSE} -asm - mov ecx, val_id - mov edx, dword ptr tsrmls_dc_p - mov eax, dword ptr [edx] - mov ecx, dword ptr [eax+ecx*4-4] - mov Result, ecx +function __fgsapi(sapi_globals_value:pointer; tsrmls_dc:pointer): Pointer; +type P = ^IntPtr; +begin + Result := ppointer( P(tsrmls_dc)^ + IntPtr(sapi_globals_value)*Sizeof(Pointer) - Sizeof(Pointer) )^; end; -{$ENDIF} function GetGlobalResource(resource_name: AnsiString) : pointer; var @@ -3274,7 +3276,7 @@ function GetGlobalResource(resource_name: AnsiString) : pointer; global_id := GetProcAddress(PHPLib, zend_pchar(resource_name)); if Assigned(global_id) then begin - Result := __asm_fetchval(IntPtr(global_id^), tsrmls_fetch); + Result := __fgsapi(pointer(global_id^), tsrmls_fetch); end; except Result := nil; @@ -3290,7 +3292,7 @@ function GetGlobalResourceDC(resource_name: AnsiString;TSRMLS_DC:pointer) : poin global_id := GetProcAddress(PHPLib, zend_pchar(resource_name)); if Assigned(global_id) then begin - Result := __asm_fetchval(IntPtr(global_id^), TSRMLS_DC); + Result := Pointer( __fgsapi(pointer(global_id^), TSRMLS_DC) ); end; except Result := nil; diff --git a/Source/hzend_types.pas b/Source/hzend_types.pas index 573b976..c2e76e9 100644 --- a/Source/hzend_types.pas +++ b/Source/hzend_types.pas @@ -3045,7 +3045,6 @@ Tsmart_str = record zend_long_to_str:function(num:zend_long):Pzend_string; cdecl; ZvalGetPChar:function(z:pzval):zend_pchar; cdecl; -ZvalSetPChar:procedure(z:pzval; p:zend_pchar; l, b:integer); cdecl; read_property22:function(elem:pzval; name:zend_pchar; flags:Integer):pzval; cdecl; isset_property:function(_object:pzval; property_name:zend_pchar):Integer; cdecl; diff --git a/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local b/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local index 9b88d43..dbd6596 100644 --- a/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local +++ b/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local @@ -6,6 +6,6 @@ 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - + diff --git a/Source/packages/php4delphi Delphi 10.tvsconfig b/Source/packages/php4delphi Delphi 10.tvsconfig new file mode 100644 index 0000000..d430780 --- /dev/null +++ b/Source/packages/php4delphi Delphi 10.tvsconfig @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Source/php4DelphiD2010.identcache b/Source/php4DelphiD2010.identcache index a7374d782c74209272df63f52365e47f88bf526f..4f6504a0b4d282d4dec9190c7477d605440ffac2 100644 GIT binary patch literal 1204 zcmb`H$qs@r6h-+2zr>X*93lY~6EwsjB&HjN7pVc-bTGlM7tpvUxM;P@w>Y`)zLSnD z%W_;BojEX$0=OfOq_TucaJ0d~mkFXdon%nZ9HS$VEQN03b&~^J$28^*nN0 z0sJ4RcT^QM)lGF-?L8;ls+^fFr)keEV&2=$HULGCsChhHOz4LpBR5DzgdZ`>RG`WE z0-Ugz)hf!>&GvF?Evr;uQuQjE>+;$go@&|`%jAkqLZnbvTUP>SHF6F1{lgD4;QSL>A%d6y literal 1252 zcmb`{%L;-(6b4`)p(kn8D(E7b8dOLZgqV$&Lr&<-Fc-p}KCNgm+UAr?7a#xOoPS1+ z*#XIop~CUrAzv~A51 z)_Jw_-FR(NK7#6w`E?|FxY%Hb0OKf*CBH(h6M9c&VVlT)4UCJ~LYwZ`i2k)&)Gkecxhhw~jWLkMkf z0(Z-dg^WFcDCz{0t%W0RQ&)nn^`c^pt~p$lGnDn0v#MOf>|7Vt6TWW>>H`l^s|i-P zDeV7Fd75XuG==FxCmicU-rWvP(v~YZP+Q0H9{UTqb$S?n8%y#de`+NYV7vSj)>_75 Y`gJ3m=t_PYRzfHl8b$vpPa4hr0{b`y3IG5A literal 856 zcmb`^y$ZrG6o%pM-iwoy;7>@c6;ul9B4V54W>1VMs%i?aM8hX0aaNQL2)m&a&yC6WWKLJc==oZ zNp28ijHVrPqdbDMPPz%5_=^_DJIdNJJEYSg+diL@YHP%$_uV-s)gh%Y9}v&H4rV;r Z7LgS#s{3B6Gz^2iZk#Mz;mRiVdIGmK6R7|I diff --git a/Source/php4DelphiR2010.stat b/Source/php4DelphiR2010.stat index 02de922..92d1072 100644 --- a/Source/php4DelphiR2010.stat +++ b/Source/php4DelphiR2010.stat @@ -1,9 +1,9 @@ [Stats] -EditorSecs=4128 +EditorSecs=4262 DesignerSecs=1 InspectorSecs=3 -CompileSecs=112868 -OtherSecs=370 +CompileSecs=138371 +OtherSecs=477 StartTime=29.07.4016 22:02:01 RealKeys=0 EffectiveKeys=0 diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index e55b8ae..12e8976 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -94,9 +94,6 @@ TpsvCustomPHP = class(TPHPComponent) FRequestType : TPHPRequestType; FOnReadResult : TPHPReadResultEvent; FContentType: zend_ustr; - {$IFDEF sCPUX64} - FCode: zend_ustr; - {$ENDIF} FVirtualStream : TStringStream; procedure SetVariables(Value : TPHPVariables); procedure SetHeaders(Value : TPHPHeaders); @@ -218,6 +215,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) FOnScriptError : TPHPErrorEvent; FOnLogMessage : TPHPLogMessage; FWaitForShutdown : boolean; + RegNumFunc : Cardinal; FHash : TStringList; FLibraryModule : Tzend_module_entry; FLibraryEntryTable : array of zend_function_entry; @@ -226,7 +224,6 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) function GetConstantCount: integer; function GetEngineActive : boolean; protected - MyFuncs: TStringList; TSRMLS_D : pppointer; procedure StartupPHP; virtual; procedure PrepareEngine; virtual; @@ -246,7 +243,7 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) public constructor Create(AOwner : TComponent); override; destructor Destroy; override; - procedure AddFunction(FN: zend_ustr; Func: Pointer); + procedure AddFunction(FN: zend_pchar; Func: Pointer); procedure AddModule(Module_entry: Pzend_module_entry); procedure StartupEngine; virtual; procedure ShutdownEngine; virtual; @@ -698,7 +695,6 @@ procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; begin Exit; end; - php_register_variable('PHP_SELF', '_', nil, p); php_register_variable('REMOTE_ADDR', zend_pchar(GetLocalIP()), val, p); php_register_variable('IP_ADDRESS', zend_pchar(GetLocalIP()), val, p); @@ -1032,9 +1028,6 @@ function TpsvCustomPHP.Execute : zend_ustr; {$IFDEF PHP5} ZendStream : TZendStream; {$ENDIF} - {$IFDEF sCPUX64} - z: pzval; - {$ENDIF} begin if not EngineActive then @@ -1069,7 +1062,7 @@ function TpsvCustomPHP.Execute : zend_ustr; StartupRequest; ZeroMemory(@file_handle, sizeof(zend_file_handle)); - {$IFNDEF sCPUX64} + if FUseMapping then begin {$IFDEF PHP5} @@ -1102,10 +1095,6 @@ function TpsvCustomPHP.Execute : zend_ustr; {$ENDIF} end else - {$ENDIF} - {$IFDEF CPUX64} - if not FUseMapping then - {$ENDIF} begin file_handle._type := ZEND_HANDLE_FILENAME; file_handle.filename := zend_pchar(FFileName); @@ -1115,18 +1104,6 @@ function TpsvCustomPHP.Execute : zend_ustr; try begin - //ShowMessage('php_execute_script'); - {$IFDEF CPUX64} - if FUseMapping then - begin - ShowMessage('eval'); - z := ALLOC_ZVAL; - INIT_PZVAL(z); - z^._type := IS_STRING; - zend_eval_string(zend_pchar(FCode), z, 'SAPI execution', TSRMLS_D); - end - else - {$ENDIF} PHPAPI.php_execute_script(@file_handle, TSRMLS_D); end except @@ -1184,19 +1161,12 @@ function TpsvCustomPHP.RunCode(Acode : zend_ustr) : zend_ustr; if Pos('', [ACode]); end; - {$IFDEF CPUX64} - FCode := Acode; - {$ELSE} if not CreateVirtualFile(ACode) then begin Result := ''; Exit; end; - {$ENDIF} Result := Execute; - {$IFNDEF CPUX64} - CloseVirtualFile; - {$ENDIF} finally FUseMapping := false; end; @@ -1497,7 +1467,6 @@ constructor TPHPEngine.Create(AOwner: TComponent); InitializeCriticalSection(FLock); PHPEngine := Self; - MyFuncs := TStringList.Create; end; destructor TPHPEngine.Destroy; @@ -1506,7 +1475,6 @@ destructor TPHPEngine.Destroy; FEngineActive := false; FConstants.Free; FHash.Free; - MyFuncs.Free; DeleteCriticalSection(FLock); if (PHPEngine = Self) then PHPEngine := nil; @@ -1616,7 +1584,7 @@ procedure TPHPEngine.PrepareIniEntry; if FHandleErrors then begin - ppointer(GetProcAddress(PHPLib, 'zend_error_cb'))^ := @delphi_error_cb; + HFunc(@delphi_error_cb, 'zend_error_cb'); end; {$IFNDEF PHP540} if FSafeMode then @@ -1692,14 +1660,14 @@ procedure TPHPEngine.PrepareEngine; FLibraryModule.module_startup_func := @minit; FLibraryModule.module_shutdown_func := @mshutdown; FLibraryModule.info_func := @php_info_library; - FLibraryModule.version := '8.0 ds'; FLibraryModule.request_shutdown_func := @rshutdown; FLibraryModule.request_startup_func := @rinit; FLibraryModule.module_started := 0; FLibraryModule._type := MODULE_PERSISTENT; - FLibraryModule.handle := nil; + + FLibraryModule.Handle := nil; FLibraryModule.module_number := 0; FLibraryModule.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); end; @@ -1815,60 +1783,6 @@ procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); end; end; -procedure TPHPEngine.RefreshLibrary; -var - cnt, offset : integer; - HashName : zend_ustr; -begin - SetLength(FLibraryEntryTable, FHash.Count + MyFuncs.Count + 5); - - PHP_FUNCTION(FLibraryEntryTable[0], 'delphi_date', @delphi_date); - - FLibraryEntryTable[1].fname := 'delphi_get_author'; - FLibraryEntryTable[1].handler := @delphi_get_author; - FLibraryEntryTable[1].arg_info := nil; - - FLibraryEntryTable[2].fname := 'delphi_str_date'; - FLibraryEntryTable[2].handler := @delphi_str_date; - FLibraryEntryTable[2].arg_info := nil; - - PHP_FUNCTION(FLibraryEntryTable[3], 'InputBox', @delphi_input_box); - - for cnt := 0 to FHash.Count - 1 do - begin - HashName := FHash[cnt]; - - {$IFNDEF COMPILER_VC9} - FLibraryEntryTable[cnt+4].fname := strdup(zend_pchar(HashName)); - {$ELSE} - FLibraryEntryTable[cnt+4].fname := DupStr(zend_pchar(HashName)); - {$ENDIF} - - FLibraryEntryTable[cnt+4].handler := @DispatchRequest; - FLibraryEntryTable[cnt+4].arg_info := nil; - end; - - offset := FHash.Count + 4; - for cnt := 0 to MyFuncs.Count - 1 do - begin - HashName := MyFuncs[cnt]; - {$IFNDEF COMPILER_VC9} - FLibraryEntryTable[cnt+offset].fname := strdup(zend_pchar(HashName)); - {$ELSE} - FLibraryEntryTable[cnt+offset].fname := DupStr(zend_pchar(HashName)); - {$ENDIF} - - FLibraryEntryTable[cnt+offset].handler := MyFuncs.Objects[ cnt ]; - FLibraryEntryTable[cnt+offset].arg_info := nil; - end; - - - FLibraryEntryTable[FHash.Count+MyFuncs.Count+4].fname := nil; - FLibraryEntryTable[FHash.Count+MyFuncs.Count+4].handler := nil; - FLibraryEntryTable[FHash.Count+MyFuncs.Count+4].arg_info := nil; - - FLibraryModule.functions := @FLibraryEntryTable[0]; -end; procedure TPHPEngine.StartupEngine; var i : integer; @@ -1909,7 +1823,6 @@ procedure TPHPEngine.StartupEngine; RefreshLibrary; - php_module_startup(@delphi_sapi_module, @FLibraryModule, 1); TSRMLS_D := ts_resource_ex(0, nil); @@ -2048,10 +1961,14 @@ procedure TPHPEngine.RemoveRequest; end; end; -procedure TPHPEngine.AddFunction(FN: zend_ustr; Func: Pointer); +procedure TPHPEngine.AddFunction(FN: zend_pchar; Func: Pointer); begin - if MyFuncs.IndexOf(FN) = -1 then - MyFuncs.AddObject(FN, TObject(Func)); + inc(RegNumFunc); + SetLength(FLibraryEntryTable, RegNumFunc + 1); + FLibraryEntryTable[RegNumFunc - 1].fname := FN; + //FLibraryEntryTable[RegNumFunc - 1].num_args := 0; + FLibraryEntryTable[RegNumFunc - 1].arg_info := nil; + FLibraryEntryTable[RegNumFunc - 1].handler := Func; end; procedure TPHPEngine.AddModule(Module_entry: Pzend_module_entry); @@ -2060,6 +1977,19 @@ procedure TPHPEngine.AddModule(Module_entry: Pzend_module_entry); FAddMods[High(FAddMods)] := Module_entry; end; +procedure TPHPEngine.RefreshLibrary; +var i: integer; +begin + Self.AddFunction('delphi_date', @delphi_date); + Self.AddFunction('delphi_get_author', @delphi_get_author); + Self.AddFunction('delphi_str_date', @delphi_str_date); + Self.AddFunction('InputBox', @delphi_input_box); + + for i := 0 to FHash.Count - 1 do + Self.AddFunction(zend_pchar(zend_ustr(FHash[i])), @DispatchRequest); + FLibraryModule.functions := @FLibraryEntryTable[0]; +end; + procedure TPHPEngine.AddRequest; var x: Pzend_module_entry; diff --git a/Source/phpAbout.dfm b/Source/phpAbout.dfm index b2826e6..88d0aa1 100644 --- a/Source/phpAbout.dfm +++ b/Source/phpAbout.dfm @@ -1205,7 +1205,7 @@ object dlgAbout: TdlgAbout Alignment = taCenter Anchors = [] AutoSize = False - Caption = 'Copyright (c) 2002-2019 Serhiy Perevoznyk, Andrew Zenin'#13#10'All Rights Reserved' + Caption = 'Copyright (c) 2002-2020 Serhiy Perevoznyk, Lew Zienin, Nikita Ganzikov'#13#10'All Rights Reserved' end object labVersion: TLabel Left = 4 diff --git a/readme.txt b/readme.txt index ead92f3..5281792 100644 --- a/readme.txt +++ b/readme.txt @@ -437,7 +437,11 @@ serge_perevoznyk@hotmail.com http://users.telenet.be/ws36637 http://delphi32.blogspot.com -Andrew Zenin +Lew Zienin +Poland +levzenin@pm.me + +Nikita Ganzikov Ukraine -kashaket@protonmail.com +pig-l@mail.ru From 362b72b79ee2aa091a983381cef52e6858f547e0 Mon Sep 17 00:00:00 2001 From: Lev Zenin Date: Thu, 20 Feb 2020 08:24:57 +0200 Subject: [PATCH 45/54] Updated structs --- Source/Demos/psvPHP/console/phpcon.dpr | 2 +- Source/Demos/psvPHP/console/phpcon.dproj | 2 +- Source/ZendTypes.pas | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Source/Demos/psvPHP/console/phpcon.dpr b/Source/Demos/psvPHP/console/phpcon.dpr index 1ba3210..0886d78 100644 --- a/Source/Demos/psvPHP/console/phpcon.dpr +++ b/Source/Demos/psvPHP/console/phpcon.dpr @@ -55,7 +55,7 @@ begin php := TpsvPHP.Create(nil); if ParamCount = 1 then begin - php.FileName := ParamStr(1); + php.FileName := zend_ustr(ParamStr(1)); write(php.Execute); end else diff --git a/Source/Demos/psvPHP/console/phpcon.dproj b/Source/Demos/psvPHP/console/phpcon.dproj index f329cbf..caf51d6 100644 --- a/Source/Demos/psvPHP/console/phpcon.dproj +++ b/Source/Demos/psvPHP/console/phpcon.dproj @@ -8,7 +8,7 @@ Console None 18.2 - Win64 + Win32 true diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index 252446a..dcc97c5 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -1233,9 +1233,13 @@ Tzend_module_entry = record {$IFDEF PHP5} {$IFDEF PHP520} globals_size : size_t; + {$IFDEF PHP540} + globals_ptr : pointer; + {$ELSE} globals_id_ptr : pointer; - globals_ctor : pointer; - globals_dtor : pointer; + {$ENDIF} + globals_ctor : procedure (global:pointer);cdecl; + globals_dtor : procedure (global:pointer);cdecl; {$ENDIF} {$ENDIF} @@ -1250,7 +1254,7 @@ Tzend_module_entry = record global_id: integer; {$ENDIF} - module_started: integer; + module_started: longint; _type: byte; handle: pointer; module_number: longint; From 6374a68de69f0e71922ad40828041023a6ccac34 Mon Sep 17 00:00:00 2001 From: lion Date: Sat, 18 Jul 2020 06:02:52 +0300 Subject: [PATCH 46/54] Update readme.txt --- readme.txt | 222 ++++------------------------------------------------- 1 file changed, 13 insertions(+), 209 deletions(-) diff --git a/readme.txt b/readme.txt index 5281792..f24d7d9 100644 --- a/readme.txt +++ b/readme.txt @@ -1,9 +1,9 @@ PHP4Delphi library PHP - Delphi interface and PHP extensions development framework -{ $Id: readme.txt,v 7.4 2/2019 delphi32 Exp $ } +{ $Id: readme.txt,v 7.4 07/2020 delphi32 Exp $ } -PHP4Delphi is a Delphi interface to PHP for Delphi 5, 6, 7, Delphi 2005 - Delphi Berlin +PHP4Delphi is a Delphi interface to PHP for Delphi {2007, ..., Berlin} PHP4Delphi consists of 3 big subprojects: @@ -29,22 +29,18 @@ More detail information available in php4Delphi manual php4Delphi.pdf This is a source-only release of php4Delphi. It includes -design-time and run-time packages for Delphi 5 through Delphi Berlin +design-time and run-time packages for Delphi 2007 through Delphi Berlin History: -7.4.1 Mar 2019 - -* Added unicode support - -7.4 Feb 2019 +7.4 Mar 2019 * Compatible with PHP 5.5.0 * Compatible with PHP 5.6.0 -* Compatible with PHP 5.6 +* Compatible with PHP 5.6.x * Compatible with Delphi 2011, XE8, Seattle, Berlin -* Added Partial Unicode Support +* Added unicode support 7.3 Jan 2019 @@ -196,215 +192,23 @@ c:\winnt or c:\winnt40 for NT/2000/XP servers How to install php4Delphi library: -1. Delphi 5.x: - -Uninstall previous installed version of php4Delphi Library from Delphi 5 IDE. -Remove previously compiled php4Delphi packages from your hard disk. - -Select PHP version you are going to use. php4Delphi supports PHP 4.x and PHP 5.x, -but not at the same time. You have to compile php4Delphi for selected target version of PHP. - -Open PHP.INC file. -If you are using PHP5: -a) Comment (remove) PHP4 directive {$DEFINE PHP4} -b) Uncomment (remove dot) directive {$DEFINE PHP5} -c) Save PHP.INC file - -If you are using PHP4: -a) Comment (remove) PHP5 directive {$DEFINE PHP5} -b) Uncomment (remove dot) directive {$DEFINE PHP4} -c) If you are using PHP version 4.2.x...4.3.0 add {$DEFINE PHP430} and remove {$DEFINE PHP433} - If you are using PHP version 4.3.3...4.3.x add {$DEFINE PHP433} and remove {$DEFINE PHP430} -d) Save PHP.INC file - -Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime -package php4DelphiR5.dpk. In "Package..." window click "Compile" button to -compile packages php4DelphiR5.dpk. -Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS -"PATH" environment variable; -for example, in the Windows\System directory). - -After compiling php4Delphi run-time package you must install design-time -package into the IDE. - -Use "File\Open..." menu item to open design-time package php4DelphiD5.dpk. -In "Package..." window click "Compile" button to compile the package -and then click "Install" button to register php4Delphi Library -components on the component palette. - - -2. Delphi 6.x: - -Uninstall previous installed version of php4Delphi Library from Delphi 6 IDE. -Remove previously compiled php4Delphi packages from your hard disk. - -Select PHP version you are going to use. php4Delphi supports PHP 4.x and PHP 5.x, -but not at the same time. You have to compile php4Delphi for selected target version of PHP. - -Open PHP.INC file. -If you are using PHP5: -a) Comment (remove) PHP4 directive {$DEFINE PHP4} -b) Uncomment (remove dot) directive {$DEFINE PHP5} -c) Save PHP.INC file - -If you are using PHP4: -a) Comment (remove) PHP5 directive {$DEFINE PHP5} -b) Uncomment (remove dot) directive {$DEFINE PHP4} -c) If you are using PHP version 4.2.x...4.3.0 add {$DEFINE PHP430} and remove {$DEFINE PHP433} - If you are using PHP version 4.3.3...4.3.x add {$DEFINE PHP433} and remove {$DEFINE PHP430} -d) Save PHP.INC file - -Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime -package php4DelphiR6.dpk. In "Package..." window click "Compile" button to -compile packages php4DelphiR6. -Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS -"PATH" environment variable; -for example, in the Windows\System directory). - -After compiling php4Delphi run-time package you must install design-time -package into the IDE. - -Use "File\Open..." menu item to open design-time package php4DelphiD6.dpk. -In "Package..." window click "Compile" button to compile the package -and then click "Install" button to register php4Delphi Library -components on the component palette. - -3. Delphi 7.x: - -Uninstall previous installed version of php4Delphi Library from Delphi 7 IDE. -Remove previously compiled php4Delphi packages from your hard disk. - -Select PHP version you are going to use. php4Delphi supports PHP 4.x and PHP 5.x, -but not at the same time. You have to compile php4Delphi for selected target version of PHP. - -Open PHP.INC file. -If you are using PHP5: -a) Comment (remove) PHP4 directive {$DEFINE PHP4} -b) Uncomment (remove dot) directive {$DEFINE PHP5} -c) Save PHP.INC file - -If you are using PHP4: -a) Comment (remove) PHP5 directive {$DEFINE PHP5} -b) Uncomment (remove dot) directive {$DEFINE PHP4} -c) If you are using PHP version 4.2.x...4.3.0 add {$DEFINE PHP430} and remove {$DEFINE PHP433} - If you are using PHP version 4.3.3...4.3.x add {$DEFINE PHP433} and remove {$DEFINE PHP430} -d) Save PHP.INC file - -Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime -package php4DelphiR7.dpk. In "Package..." window click "Compile" button to -compile packages php4DelphiR7.dpk. -Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS -"PATH" environment variable; -for example, in the Windows\System directory). - -After compiling php4Delphi run-time package you must install design-time -package into the IDE. - -Use "File\Open..." menu item to open design-time package php4DelphiD7.dpk -In "Package..." window click "Compile" button to compile the package -and then click "Install" button to register php4Delphi Library -components on the component palette. - - -4. Delphi 2005: - -Uninstall previous installed version of php4Delphi Library from Delphi 2005 IDE. -Remove previously compiled php4Delphi packages from your hard disk. - -Select PHP version you are going to use. php4Delphi supports PHP 4.x and PHP 5.x, -but not at the same time. You have to compile php4Delphi for selected target version of PHP. - -Open PHP.INC file. -If you are using PHP5: -a) Comment (remove) PHP4 directive {$DEFINE PHP4} -b) Uncomment (remove dot) directive {$DEFINE PHP5} -c) Save PHP.INC file - -If you are using PHP4: -a) Comment (remove) PHP5 directive {$DEFINE PHP5} -b) Uncomment (remove dot) directive {$DEFINE PHP4} -c) If you are using PHP version 4.2.x...4.3.0 add {$DEFINE PHP430} and remove {$DEFINE PHP433} - If you are using PHP version 4.3.3...4.3.x add {$DEFINE PHP433} and remove {$DEFINE PHP430} -d) Save PHP.INC file - -Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime -package php4DelphiR2005.dpk. In "Package..." window click "Compile" button to -compile packages php4DelphiR2005.dpk. -Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS -"PATH" environment variable; -for example, in the Windows\System directory). - -After compiling php4Delphi run-time package you must install design-time -package into the IDE. - -Use "File\Open..." menu item to open design-time package php4DelphiD2005.dpk -In "Package..." window click "Compile" button to compile the package -and then click "Install" button to register php4Delphi Library -components on the component palette. - - - -5. Delphi 2006: - -Uninstall previous installed version of php4Delphi Library from Delphi 2006 IDE. -Remove previously compiled php4Delphi packages from your hard disk. - -Select PHP version you are going to use. php4Delphi supports PHP 4.x and PHP 5.x, -but not at the same time. You have to compile php4Delphi for selected target version of PHP. - -Open PHP.INC file. -If you are using PHP5: -a) Comment (remove) PHP4 directive {$DEFINE PHP4} -b) Uncomment (remove dot) directive {$DEFINE PHP5} -c) Save PHP.INC file - -If you are using PHP4: -a) Comment (remove) PHP5 directive {$DEFINE PHP5} -b) Uncomment (remove dot) directive {$DEFINE PHP4} -c) If you are using PHP version 4.2.x...4.3.0 add {$DEFINE PHP430} and remove {$DEFINE PHP433} - If you are using PHP version 4.3.3...4.3.x add {$DEFINE PHP433} and remove {$DEFINE PHP430} -d) Save PHP.INC file - -Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime -package php4DelphiR2006.dpk. In "Package..." window click "Compile" button to -compile packages php4DelphiR2006.dpk. -Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS -"PATH" environment variable; -for example, in the Windows\System directory). - -After compiling php4Delphi run-time package you must install design-time -package into the IDE. - -Use "File\Open..." menu item to open design-time package php4DelphiD2006.dpk -In "Package..." window click "Compile" button to compile the package -and then click "Install" button to register php4Delphi Library -components on the component palette. - - -6. Delphi 2007: +Delphi 2007 & up: Uninstall previous installed version of php4Delphi Library from Delphi 2007 IDE. Remove previously compiled php4Delphi packages from your hard disk. -Select PHP version you are going to use. php4Delphi supports PHP 4.x and PHP 5.x, +Select PHP version you are going to use. php4Delphi supports PHP 5.x, but not at the same time. You have to compile php4Delphi for selected target version of PHP. Open PHP.INC file. If you are using PHP5: -a) Comment (remove) PHP4 directive {$DEFINE PHP4} -b) Uncomment (remove dot) directive {$DEFINE PHP5} +a) Uncomment (remove dot) from definition of suitable php, VC, Visual Library and architecture version +b) Uncomment (remove dot) from definition of prefered features in the feature block of the PHP.INC file c) Save PHP.INC file -If you are using PHP4: -a) Comment (remove) PHP5 directive {$DEFINE PHP5} -b) Uncomment (remove dot) directive {$DEFINE PHP4} -c) If you are using PHP version 4.2.x...4.3.0 add {$DEFINE PHP430} and remove {$DEFINE PHP433} - If you are using PHP version 4.3.3...4.3.x add {$DEFINE PHP433} and remove {$DEFINE PHP430} -d) Save PHP.INC file - Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime -package php4DelphiR2007.dpk. In "Package..." window click "Compile" button to -compile packages php4DelphiR2007.dpk. +choose suitable Runtime package php4DelphiR(Your Delphi Version).dpk; In "Package..." window click "Compile" button to +compile packages. Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS "PATH" environment variable; for example, in the Windows\System directory). @@ -412,7 +216,7 @@ for example, in the Windows\System directory). After compiling php4Delphi run-time package you must install design-time package into the IDE. -Use "File\Open..." menu item to open design-time package php4DelphiD2007.dpk +Use "File\Open..." menu item to open design-time package php4DelphiD(Your Delphi Version).dpk In "Package..." window click "Compile" button to compile the package and then click "Install" button to register php4Delphi Library components on the component palette. From d5a2f2ad760d7c908ab408bf6350963ed6498d4f Mon Sep 17 00:00:00 2001 From: levzenin Date: Sat, 18 Jul 2020 07:29:07 +0300 Subject: [PATCH 47/54] php.inc: /rework/ user-friendly --- Source/PHP.INC | 169 +- Source/PHPAPI.pas | 4 +- Source/ZENDAPI.pas | 8 +- Source/hzend_types.pas | 2 +- Source/php4delphi.pas | 3649 ++++++++++++++++++++-------------------- 5 files changed, 1922 insertions(+), 1910 deletions(-) diff --git a/Source/PHP.INC b/Source/PHP.INC index 5ee313f..09db880 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -5,101 +5,104 @@ { Author: } { Serhiy Perevoznyk } { serge_perevoznyk@hotmail.com } -{ http://users.chello.be/ws36637 } -{ http://delphi32.blogspot.com } +{ https://users.chello.be/ws36637 } +{ https://delphi32.blogspot.com } {*******************************************************} -{ $Id: PHP.INC,v 7.4 10/2009 delphi32 Exp $ } +{ $Id: PHP.INC,v 7.4 07/2020 delphi32 Exp $ } {IMPORTANT: -If you are using PHP version 5.0 please add $DEFINE PHP5 -If you are using PHP version 5.0.4 please add $DEFINE PHP504 -If you are using PHP version 5.1.0 or higher please add $DEFINE PHP510 -If you are using PHP version 5.1.1 or higher please add $DEFINE PHP511 -If you are using PHP version 5.1.2 or higher please add $DEFINE PHP512 -If you are using PHP version 5.2.0 or higher please add $DEFINE PHP520 -IF you are using PHP version 5.3.0 or higher please add $DEFINE PHP530 -IF you are using PHP version 5.4.0 or higher please add $DEFINE PHP540 -IF you are using PHP version 5.5.0 or higher please add $DEFINE PHP550 -IF you are using PHP version 5.6.0 or higher please add $DEFINE PHP560 -IF you are using PHP cersion 7.0.0 or higher please add $DEFINE PHP700 -If you are using PHP compiled via: -id, define compiler_id -VC9 COMPILER_VC9 -VC10 COMPILER_VC10 -VC11 COMPILER_VC11 -VC12 COMPILER_VC12 -VC13 COMPILER_VC13 -VC14 COMPILER_VC14 -Sorry for such complicated configuration, but PHP team does not keep -backward compatibility between PHP versions. +Define suitable PHP version, the table is represented below: +| Version | Directive | + 5.0 $DEFINE PHP5 + 5.0.4 $DEFINE PHP504 + 5.1.0 $DEFINE PHP510 + 5.1.1 $DEFINE PHP511 + 5.1.2 $DEFINE PHP512 + 5.2 $DEFINE PHP520 + 5.3 $DEFINE PHP530 + 5.4 $DEFINE PHP540 + 5.5 $DEFINE PHP550 + 5.6 $DEFINE PHP560 + 7.0 $DEFINE PHP7 + 7.1 $DEFINE PHP710 + +Define suitable visual library +| Library | Directive | + VCL $DEFINE VCL + FMX $DEFINE FMX } -{PHP5 must be defined if you are using PHP5} -{$DEFINE PHP5} - -{For PHP5 you have to define the subversion of PHP} -{$DEFINE PHP504} -{$DEFINE PHP510} -{$DEFINE PHP511} -{$DEFINE PHP512} -{$DEFINE PHP520} -{$DEFINE PHP530} -{$DEFINE PHP540} -{$DEFINE PHP550} +//Version {$DEFINE PHP560} +{$DEFINE VCL} + +//Features +{$DEFINE PHP_UNICODE} + //PHP unicode support *Enables WideString and UnicodeString +{$DEFINE REGISTER_COLOURS} + //constants for Delphi colours +{.$DEFINE QUIET_LOAD} + //Do not show errors while loading php library +{.$DEFINE PHP4DELPHI_AUTOLOAD} + //Load php library at initialization +{.$DEFINE PHP4DELPHI_AUTOUNLOAD} + // Unload php library at finalization + +//Compiler switches +{.$DEFINE php_side_handler} + //enable ability to define own error handler from php side ~NON_TC +{.$DEFINE COMPILER_php7pv} + // use macroses from PHP sources patch + // https://github.com/resistancelion/no-name-engine/tree/master/php-src +{.$DEFINE PHP_DEBUG} + //use debug libraries (php7debug, f.e) + + + + + + + + + + + + + + +//E N D +{$WARN UNIT_DEPRECATED OFF} +{$IFDEF PHP_UNICODE} {$DEFINE UNICODE} {$ENDIF} + +{$IFDEF PHP710} {$DEFINE PHP700} {$ENDIF} +{$IFDEF PHP700} {$DEFINE PHP7} {$ENDIF} + +{$IFDEF PHP7} {$DEFINE PHP560} {$ENDIF} +{$IFDEF PHP560} {$DEFINE PHP550} {$ENDIF} +{$IFDEF PHP550} {$DEFINE PHP540} {$ENDIF} +{$IFDEF PHP540} {$DEFINE PHP530} {$ENDIF} {$IFDEF PHP530} + {$DEFINE PHP520} {$DEFINE ZEND_WIN32} {$DEFINE PHP_COMPILER_ID} {$ENDIF} -{$DEFINE soulengine_build} -{.$DEFINE PHP7} -{.$DEFINE CUTTED_PHP7dll} - {$IFDEF PHP7} - {$DEFINE COMPILER_VC14} - {$DEFINE PHP560} - {$DEFINE PHP700} - {$ENDIF} -{$IFDEF PHP560} - {$DEFINE PHP530} - {$DEFINE PHP540} - {$DEFINE PHP550} - {$DEFINE ZEND_WIN32} - {$DEFINE PHP_COMPILER_ID} -{$ENDIF} -//Warning! You must select one of the compilers -//Look at the version of PHP you have installed -//I DO recommend to use php-5.6.40-Win32-VC11-x86, specially if you are using -//php4delphi component with php5ts.dll. If you are building PHP extensions, -//you have to define the right compiler, otherwise you would have incompatibility -//problems - +{$IFDEF PHP520} {$DEFINE PHP512} {$ENDIF} +{$IFDEF PHP512} {$DEFINE PHP511} {$ENDIF} +{$IFDEF PHP511} {$DEFINE PHP510} {$ENDIF} +{$IFDEF PHP510} {$DEFINE PHP504} {$ENDIF} +{$IFDEF PHP504} {$DEFINE PHP5} {$ENDIF} {$IFDEF PHP_COMPILER_ID} {$DEFINE COMPILER_VC9} {$IFNDEF PHP7} {$IFDEF PHP550} {$DEFINE COMPILER_VC11} {$ENDIF} - {$ENDIF} + {$ELSE} + {$DEFINE COMPILER_VC14} + {$ENDIF} {$ENDIF} -{$WARN UNIT_DEPRECATED OFF} - -{.$DEFINE QUIET_LOAD} //Do not show error while loading php4ts.dll or php5ts.dll (depends from php version) - -{.$DEFINE PHP4DELPHI_AUTOLOAD} //Load php4ts.dll or php5ts.dll at initialization -{.$DEFINE PHP4DELPHI_AUTOUNLOAD} // Unload php4ts.dll or php5ts.dll at finalization - -{.$DEFINE PHP_DEBUG} - -{$DEFINE REGISTER_COLORS} //register php constants for colors - {$IFNDEF LINUX} - {$DEFINE ZTS} {zts support} -{$ENDIF} - -{$IF Defined(COMPILER_VC11) and Defined(PHP560) or Defined(PHP7)} - {$DEFINE PHP_UNICODE} -{$ELSEIF Defined(COMPILER_VC12) or Defined(COMPILER_VC13) or Defined(COMPILER_VC14) or Defined(COMPILER_VC15)} - {$DEFINE PHP_UNICODE} + {$DEFINE ZTS} {zend thread safety support} {$ENDIF} {$IFNDEF VER80} {Delphi 1.0} @@ -205,6 +208,14 @@ backward compatibility between PHP versions. {$WARNINGS OFF} {$ENDIF} -{$IFDEF MSWINDOWS} -{$DEFINE WINDOWS} +{$IFDEF MSWINDOWS} {$DEFINE WINDOWS} {$ENDIF} +{$IFDEF FPC} + {$IFDEF FMX} {$UNDEF FMX} {$ENDIF} + {$IFDEF VCL} {$UNDEF VCL} {$ENDIF} + {$DEFINE LCL} +{$ELSE} + {$IFDEF LCL} + {$UNDEF LCL} + {$DEFINE VCL} + {$ENDIF} {$ENDIF} diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index 186c619..23b8426 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -177,7 +177,7 @@ function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct; overload; -{$IFNDEF CUTTED_PHP7dll} +{$IFNDEF COMPILER_php7pv} php_log_err: procedure (err_msg : zend_pchar; TSRMLS_DC : pointer); cdecl; {$ENDIF} php_html_puts: procedure (str : zend_pchar; str_len : integer; TSRMLS_DC : pointer); cdecl; @@ -587,7 +587,7 @@ function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; LFunc(@php_body_write, 'php_body_write' ); LFunc(@php_header_write, 'php_header_write'); {$ENDIF} - {$IFNDEF CUTTED_PHP7dll} + {$IFNDEF COMPILER_php7pv} LFunc(@php_log_err, 'php_log_err'); {$ENDIF} LFunc(@php_html_puts, 'php_html_puts'); diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 6415459..192f6ff 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -592,7 +592,7 @@ procedure dispose_pzval_array(Params: pzval_array); add_property_stringl_ex : function(arg: pzval; key: zend_pchar; key_len: uint; str: zend_pchar; len: uint; duplicate: integer; TSRMLS_DC: Pointer): integer; cdecl; add_property_zval_ex : function(arg: pzval; key: zend_pchar; key_len: uint; value: pzval; TSRMLS_DC: Pointer): integer; cdecl; - {$IFDEF CUTTED_PHP7dll} + {$IFDEF COMPILER_php7pv} call_user_function : procedure(func:pzval; argv:pzval; argc:integer);cdecl; {$ELSE} call_user_function : function(function_table: PHashTable; object_pp: pzval; @@ -2399,7 +2399,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$IFDEF PHP7} LFunc(@_zend_hash_add_or_update, '_zend_hash_add_or_update@@16'); LFunc(@_zend_hash_add, '_zend_hash_add@@12'); - {$IFDEF CUTTED_PHP7dll} + {$IFDEF COMPILER_php7pv} LFunc(@zend_hash_index_findZval,'zend_hash_index_findZval'); LFunc(@zend_symtable_findTest,'zend_symtable_findTest'); LFunc(@zend_hash_index_existsZval,'zend_hash_index_existsZval'); @@ -2809,8 +2809,8 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; // -- add_property_zval_ex LFunc(@add_property_zval_ex, 'add_property_zval_ex'); - LFunc(@call_user_function, {$IFDEF CUTTED_PHP7dll}'__call_function'{$ELSE}'call_user_function'{$ENDIF}); - {$IFNDEF CUTTED_PHP7dll} + LFunc(@call_user_function, {$IFDEF COMPILER_php7pv}'__call_function'{$ELSE}'call_user_function'{$ENDIF}); + {$IFNDEF COMPILER_php7pv} LFunc(@call_user_function_ex, 'call_user_function_ex'); {$ENDIF} // -- add_assoc_long_ex diff --git a/Source/hzend_types.pas b/Source/hzend_types.pas index c2e76e9..325f3a6 100644 --- a/Source/hzend_types.pas +++ b/Source/hzend_types.pas @@ -2,7 +2,7 @@ interface -uses Winapi.Windows; +uses {$IFDEF FPC}Winapi.Windows{$ELSE}Windows{$ENDIF}; var _TestCreate:Pointer; diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index 12e8976..d1fa8cf 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -1,386 +1,386 @@ -{*******************************************************} -{ PHP4Delphi } -{ PHP - Delphi interface } -{ } -{ Developers: } -{ Serhiy Perevoznyk } -{ serge_perevoznyk@hotmail.com } -{ } -{ Toby Allen (Documentation) } -{ tobyphp@toflidium.com } -{ } -{ http://users.telenet.be/ws36637 } -{ http://delphi32.blogspot.com } -{*******************************************************} -{$I PHP.INC} -{$ifdef fpc} - {$mode delphi} -{$endif} -{ $Id: php4delphi.pas,v 7.4 02/2019 delphi32 Exp $ } - -// Important: -// Please check PHP version you are using and change php.inc file -// See php.inc for more details - -{ -You can download the latest version of PHP from -http://www.php.net/downloads.php -You have to download and install PHP separately. -It is not included in the package. - -For more information on the PHP Group and the PHP project, -please see . -} -unit php4delphi; - -interface - -uses - Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, - PHPCommon, WinApi.WinSock, - ZendTypes, PHPTypes, PHPAPI, ZENDAPI, - DelphiFunctions, phpFunctions, strUtils, varUtils, - {$IFDEF PHP_UNICODE}WideStrUtils, {$ENDIF} - {$IFDEF soulengine_build} VCL.Dialogs, {$ENDIF} - System.UITypes; - -type - - IPHPEngine = interface (IUnknown) - ['{484AE2CA-755A-437C-9B60-E3735973D0A9}'] - procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); - function GetEngineActive : boolean; - end; - TPHPMemoryStream = class(TMemoryStream) - public - constructor Create; - procedure SetInitialSize(ASize : integer); - end; - {-- PHP Events --} - TPHPLogMessage = procedure (Sender : TObject; AText : zend_ustr) of object; - TPHPErrorEvent = procedure (Sender: TObject; AText: zend_ustr; - AType: integer; AFileName: zend_ustr; ALineNo: integer) of object; - TPHPReadPostEvent = procedure(Sender : TObject; Stream : TStream) of object; - TPHPReadResultEvent = procedure(Sender : TObject; Stream : TStream) of object; - - { TpsvCustomPHP } - TpsvCustomPHP = class(TPHPComponent) - private - FHeaders : TPHPHeaders; - FMaxExecutionTime : integer; - FExecuteMethod : TPHPExecuteMethod; - FSessionActive : boolean; - FOnRequestStartup : TNotifyEvent; - FOnRequestShutdown : TNotifyEvent; - FAfterExecute : TNotifyEvent; - FBeforeExecute : TNotifyEvent; - FTerminated : boolean; - FVariables : TPHPVariables; - FBuffer : TPHPMemoryStream; - FOnLogMessage : TPHPLogMessage; - FOnScriptError : TPHPErrorEvent; - FFileName : zend_ustr; - {$IFDEF PHP4} - FWriterHandle : THandle; - FVirtualReadHandle : THandle; - FVirtualWriteHandle : THandle; - FVirtualCode : zend_ustr; - {$ENDIF} - FUseDelimiters : boolean; - FUseMapping : boolean; - FPostStream : TMemoryStream; - FOnReadPost : TPHPReadPostEvent; - FRequestType : TPHPRequestType; - FOnReadResult : TPHPReadResultEvent; - FContentType: zend_ustr; - FVirtualStream : TStringStream; - procedure SetVariables(Value : TPHPVariables); - procedure SetHeaders(Value : TPHPHeaders); - function GetVariableCount: integer; - protected - - procedure ClearBuffer; - procedure ClearHeaders; - procedure PrepareResult; virtual; - procedure PrepareVariables; virtual; - function RunTime : boolean; - function GetThreadSafeResourceManager : pointer; - function CreateVirtualFile(A_code: zend_ustr) : boolean; - procedure CloseVirtualFile; - {$IFDEF PHP4} - property VirtualCode : string read FVirtualCode; - {$ENDIF} - function GetEngine : IPHPEngine; - public - TSRMLS_D : pointer; - Thread: TThread; - {fixed} - procedure StartupRequest; virtual; - procedure ShutdownRequest; virtual; - {/fixed} - - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - function EngineActive : boolean; - function Execute : zend_ustr; overload; - function Execute(AFileName : zend_ustr) : zend_ustr; overload; - function RunCode(ACode : zend_ustr) : zend_ustr; overload; - function RunCode(ACode : TStrings) : string; overload; - function VariableByName(AName : zend_ustr) : TPHPVariable; - property PostStream : TMemoryStream read FPostStream; - property ExecuteMethod : TPHPExecuteMethod read FExecuteMethod write FExecuteMethod default emServer; - property FileName : zend_ustr read FFileName write FFileName; - property Variables : TPHPVariables read FVariables write SetVariables; - property VariableCount : integer read GetVariableCount; - property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; - property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; - property OnRequestStartup : TNotifyEvent read FOnRequestStartup write FOnRequestStartup; - property OnRequestShutdown : TNotifyEvent read FOnRequestShutdown write FOnRequestShutdown; - property BeforeExecute : TNotifyEvent read FBeforeExecute write FBeforeExecute; - property AfterExecute : TNotifyEvent read FAfterExecute write FAfterExecute; - property ThreadSafeResourceManager : pointer read GetThreadSafeResourceManager; - property SessionActive : boolean read FSessionActive; - property UseDelimiters : boolean read FUseDelimiters write FUseDelimiters default true; - property MaxExecutionTime : integer read FMaxExecutionTime write FMaxExecutionTime default 0; - property Headers : TPHPHeaders read FHeaders write SetHeaders; - property OnReadPost : TPHPReadPostEvent read FOnReadPost write FOnReadPost; - property RequestType : TPHPRequestType read FRequestType write FRequestType default prtGet; - property ResultBuffer : TPHPMemoryStream read FBuffer; - property OnReadResult : TPHPReadResultEvent read FOnReadResult write FOnReadResult; - property ContentType : zend_ustr read FContentType write FContentType; - end; - - TpsvPHP = class(TpsvCustomPHP) - published - property About; - property FileName; - property Variables; - property OnLogMessage; - property OnScriptError; - property OnRequestStartup; - property OnRequestShutdown; - property OnReadPost; - property BeforeExecute; - property AfterExecute; - property UseDelimiters; - property MaxExecutionTime; - property RequestType; - property OnReadResult; - property ContentType; - end; - - TCustomPHPLibrary = class(TPHPComponent) - private - FExecutor : TpsvCustomPHP; - FLibraryName : zend_ustr; - FFunctions : TPHPFunctions; - FLocked: boolean; - procedure SetFunctions(const Value : TPHPFunctions); - procedure SetExecutor(AValue : TpsvCustomPHP); - procedure SetLibraryName(AValue : zend_ustr); - protected - procedure RegisterLibrary; virtual; - procedure UnregisterLibrary; virtual; - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - procedure Refresh; virtual; - property Executor : TpsvCustomPHP read FExecutor write SetExecutor; - property LibraryName : zend_ustr read FLibraryName write SetLibraryName; - property Functions : TPHPFunctions read FFunctions write SetFunctions; - property Locked : boolean read FLocked write FLocked; - end; - { TPHPEngine } - TPHPEngineInitEvent = procedure(Sender:TObject;TSRMLS_DC:Pointer) of object; - TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) - private - FINIPath : zend_ustr; - FOnEngineStartup : TNotifyEvent; - FAddMods : TArray; - FOnEngineShutdown : TNotifyEvent; - FEngineActive : boolean; - FHandleErrors : boolean; - {$IFNDEF PHP540} - FSafeMode : boolean; - FSafeModeGid : boolean; - {$ENDIF} - FRegisterGlobals : boolean; - FHTMLErrors : boolean; - FMaxInputTime : integer; - FConstants : TphpConstants; - FDLLFolder : zend_ustr; - FReportDLLError : boolean; - FLock: TRTLCriticalSection; - FOnScriptError : TPHPErrorEvent; - FOnLogMessage : TPHPLogMessage; - FWaitForShutdown : boolean; - RegNumFunc : Cardinal; - FHash : TStringList; - FLibraryModule : Tzend_module_entry; - FLibraryEntryTable : array of zend_function_entry; - FRequestCount : integer; - procedure SetConstants(Value : TPHPConstants); - function GetConstantCount: integer; - function GetEngineActive : boolean; - protected - TSRMLS_D : pppointer; - procedure StartupPHP; virtual; - procedure PrepareEngine; virtual; - procedure PrepareIniEntry; virtual; - procedure RegisterConstants; virtual; - procedure RegisterInternalConstants(TSRMLS_DC : pointer); virtual; - procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); virtual; - property RequestCount : integer read FRequestCount; - procedure HandleError (Sender : TObject; AText : string; AType : Integer; AFileName : string; ALineNo : integer); - procedure HandleLogMessage(Sender : TObject; AText : string); - procedure RegisterLibrary(ALib : TCustomPHPLibrary); - procedure RefreshLibrary; - procedure UnlockLibraries; - procedure RemoveRequest; - procedure AddRequest; - public - constructor Create(AOwner : TComponent); override; - destructor Destroy; override; - procedure AddFunction(FN: zend_pchar; Func: Pointer); - procedure AddModule(Module_entry: Pzend_module_entry); - procedure StartupEngine; virtual; - procedure ShutdownEngine; virtual; - procedure LockEngine; virtual; - procedure UnlockEngine; virtual; - procedure PrepareForShutdown; virtual; - property EngineActive : boolean read GetEngineActive; - property ConstantCount : integer read GetConstantCount; - property WaitForShutdown : boolean read FWaitForShutdown; - procedure ShutdownAndWaitFor; virtual; - property LibraryEntry : Tzend_module_entry read FLibraryModule; - published - property HandleErrors : boolean read FHandleErrors write FHandleErrors default true; - property OnEngineStartup : TNotifyEvent read FOnEngineStartup write FOnEngineStartup; - property OnEngineShutdown : TNotifyEvent read FOnEngineShutdown write FOnEngineShutdown; - property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; - property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; - property IniPath : zend_ustr read FIniPath write FIniPath; - {$IFNDEF PHP540} - property SafeMode : boolean read FSafeMode write FSafeMode default false; - property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; - {$ENDIF} - property RegisterGlobals : boolean read FRegisterGlobals write FRegisterGlobals default true; - property HTMLErrors : boolean read FHTMLErrors write FHTMLErrors default false; - property MaxInputTime : integer read FMaxInputTime write FMaxInputTime default 0; - property Constants : TPHPConstants read FConstants write SetConstants; - property DLLFolder : zend_ustr read FDLLFolder write FDLLFolder; - property ReportDLLError : boolean read FReportDLLError write FReportDLLError; - end; - - TPHPLibrarian = class - private - FLibraries : TList; - public - constructor Create; virtual; - destructor Destroy; override; - procedure AddLibrary(ALibrary : TCustomPHPLibrary); - procedure RemoveLibrary(ALibrary : TCustomPHPLibrary); - function Count : integer; - function GetLibrary(Index : integer) : TCustomPHPLibrary; - property Libraries : TList read FLibraries write FLibraries; - end; -{$IFDEF REGISTER_COLORS} -const - Colors: array[0..41] of TIdentMapEntry = ( - (Value: clBlack; Name: 'clBlack'), - (Value: clMaroon; Name: 'clMaroon'), - (Value: clGreen; Name: 'clGreen'), - (Value: clOlive; Name: 'clOlive'), - (Value: clNavy; Name: 'clNavy'), - (Value: clPurple; Name: 'clPurple'), - (Value: clTeal; Name: 'clTeal'), - (Value: clGray; Name: 'clGray'), - (Value: clSilver; Name: 'clSilver'), - (Value: clRed; Name: 'clRed'), - (Value: clLime; Name: 'clLime'), - (Value: clYellow; Name: 'clYellow'), - (Value: clBlue; Name: 'clBlue'), - (Value: clFuchsia; Name: 'clFuchsia'), - (Value: clAqua; Name: 'clAqua'), - (Value: clWhite; Name: 'clWhite'), - (Value: clScrollBar; Name: 'clScrollBar'), - (Value: clBackground; Name: 'clBackground'), - (Value: clActiveCaption; Name: 'clActiveCaption'), - (Value: clInactiveCaption; Name: 'clInactiveCaption'), - (Value: clMenu; Name: 'clMenu'), - (Value: clWindow; Name: 'clWindow'), - (Value: clWindowFrame; Name: 'clWindowFrame'), - (Value: clMenuText; Name: 'clMenuText'), - (Value: clWindowText; Name: 'clWindowText'), - (Value: clCaptionText; Name: 'clCaptionText'), - (Value: clActiveBorder; Name: 'clActiveBorder'), - (Value: clInactiveBorder; Name: 'clInactiveBorder'), - (Value: clAppWorkSpace; Name: 'clAppWorkSpace'), - (Value: clHighlight; Name: 'clHighlight'), - (Value: clHighlightText; Name: 'clHighlightText'), - (Value: clBtnFace; Name: 'clBtnFace'), - (Value: clBtnShadow; Name: 'clBtnShadow'), - (Value: clGrayText; Name: 'clGrayText'), - (Value: clBtnText; Name: 'clBtnText'), - (Value: clInactiveCaptionText; Name: 'clInactiveCaptionText'), - (Value: clBtnHighlight; Name: 'clBtnHighlight'), - (Value: cl3DDkShadow; Name: 'cl3DDkShadow'), - (Value: cl3DLight; Name: 'cl3DLight'), - (Value: clInfoText; Name: 'clInfoText'), - (Value: clInfoBk; Name: 'clInfoBk'), - (Value: clNone; Name: 'clNone')); -{$ENDIF} -var - Librarian : TPHPLibrarian = nil; - delphi_sapi_module : sapi_module_struct; - PHPEngine : TPHPEngine = nil; - {$IFDEF soulengine_build} - log_handler_php: string; - fatal_handler_php: string; - phpmd: TpsvPHP; - {$ENDIF} -implementation - -function AddSlashes(const S: zend_ustr): zend_ustr; -begin - Result := StringReplace(S, chr(8), '8', [rfReplaceAll]); - Result := StringReplace(S, '\', '\\', [rfReplaceAll]); - Result := StringReplace(Result, '''', '\''', [rfReplaceAll]); - Result := StringReplace(Result, '. +} +unit php4delphi; + +interface + +uses + Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, + PHPCommon, WinApi.WinSock, + ZendTypes, PHPTypes, PHPAPI, ZENDAPI, + DelphiFunctions, phpFunctions, strUtils, varUtils, + {$IFDEF PHP_UNICODE}WideStrUtils, {$ENDIF} + {$IFDEF php_side_handler} {$IFDEF FMX}FMX.Dialogs{$ELSE}VCL.Dialogs{$ENDIF}, {$ENDIF} + System.UITypes; + +type + + IPHPEngine = interface (IUnknown) + ['{484AE2CA-755A-437C-9B60-E3735973D0A9}'] + procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); + function GetEngineActive : boolean; + end; + TPHPMemoryStream = class(TMemoryStream) + public + constructor Create; + procedure SetInitialSize(ASize : integer); + end; + {-- PHP Events --} + TPHPLogMessage = procedure (Sender : TObject; AText : zend_ustr) of object; + TPHPErrorEvent = procedure (Sender: TObject; AText: zend_ustr; + AType: integer; AFileName: zend_ustr; ALineNo: integer) of object; + TPHPReadPostEvent = procedure(Sender : TObject; Stream : TStream) of object; + TPHPReadResultEvent = procedure(Sender : TObject; Stream : TStream) of object; + + { TpsvCustomPHP } + TpsvCustomPHP = class(TPHPComponent) + private + FHeaders : TPHPHeaders; + FMaxExecutionTime : integer; + FExecuteMethod : TPHPExecuteMethod; + FSessionActive : boolean; + FOnRequestStartup : TNotifyEvent; + FOnRequestShutdown : TNotifyEvent; + FAfterExecute : TNotifyEvent; + FBeforeExecute : TNotifyEvent; + FTerminated : boolean; + FVariables : TPHPVariables; + FBuffer : TPHPMemoryStream; + FOnLogMessage : TPHPLogMessage; + FOnScriptError : TPHPErrorEvent; + FFileName : zend_ustr; + {$IFDEF PHP4} + FWriterHandle : THandle; + FVirtualReadHandle : THandle; + FVirtualWriteHandle : THandle; + FVirtualCode : zend_ustr; + {$ENDIF} + FUseDelimiters : boolean; + FUseMapping : boolean; + FPostStream : TMemoryStream; + FOnReadPost : TPHPReadPostEvent; + FRequestType : TPHPRequestType; + FOnReadResult : TPHPReadResultEvent; + FContentType: zend_ustr; + FVirtualStream : TStringStream; + procedure SetVariables(Value : TPHPVariables); + procedure SetHeaders(Value : TPHPHeaders); + function GetVariableCount: integer; + protected + + procedure ClearBuffer; + procedure ClearHeaders; + procedure PrepareResult; virtual; + procedure PrepareVariables; virtual; + function RunTime : boolean; + function GetThreadSafeResourceManager : pointer; + function CreateVirtualFile(A_code: zend_ustr) : boolean; + procedure CloseVirtualFile; + {$IFDEF PHP4} + property VirtualCode : string read FVirtualCode; + {$ENDIF} + function GetEngine : IPHPEngine; + public + TSRMLS_D : pointer; + Thread: TThread; + {fixed} + procedure StartupRequest; virtual; + procedure ShutdownRequest; virtual; + {/fixed} + + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + function EngineActive : boolean; + function Execute : zend_ustr; overload; + function Execute(AFileName : zend_ustr) : zend_ustr; overload; + function RunCode(ACode : zend_ustr) : zend_ustr; overload; + function RunCode(ACode : TStrings) : string; overload; + function VariableByName(AName : zend_ustr) : TPHPVariable; + property PostStream : TMemoryStream read FPostStream; + property ExecuteMethod : TPHPExecuteMethod read FExecuteMethod write FExecuteMethod default emServer; + property FileName : zend_ustr read FFileName write FFileName; + property Variables : TPHPVariables read FVariables write SetVariables; + property VariableCount : integer read GetVariableCount; + property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; + property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; + property OnRequestStartup : TNotifyEvent read FOnRequestStartup write FOnRequestStartup; + property OnRequestShutdown : TNotifyEvent read FOnRequestShutdown write FOnRequestShutdown; + property BeforeExecute : TNotifyEvent read FBeforeExecute write FBeforeExecute; + property AfterExecute : TNotifyEvent read FAfterExecute write FAfterExecute; + property ThreadSafeResourceManager : pointer read GetThreadSafeResourceManager; + property SessionActive : boolean read FSessionActive; + property UseDelimiters : boolean read FUseDelimiters write FUseDelimiters default true; + property MaxExecutionTime : integer read FMaxExecutionTime write FMaxExecutionTime default 0; + property Headers : TPHPHeaders read FHeaders write SetHeaders; + property OnReadPost : TPHPReadPostEvent read FOnReadPost write FOnReadPost; + property RequestType : TPHPRequestType read FRequestType write FRequestType default prtGet; + property ResultBuffer : TPHPMemoryStream read FBuffer; + property OnReadResult : TPHPReadResultEvent read FOnReadResult write FOnReadResult; + property ContentType : zend_ustr read FContentType write FContentType; + end; + + TpsvPHP = class(TpsvCustomPHP) + published + property About; + property FileName; + property Variables; + property OnLogMessage; + property OnScriptError; + property OnRequestStartup; + property OnRequestShutdown; + property OnReadPost; + property BeforeExecute; + property AfterExecute; + property UseDelimiters; + property MaxExecutionTime; + property RequestType; + property OnReadResult; + property ContentType; + end; + + TCustomPHPLibrary = class(TPHPComponent) + private + FExecutor : TpsvCustomPHP; + FLibraryName : zend_ustr; + FFunctions : TPHPFunctions; + FLocked: boolean; + procedure SetFunctions(const Value : TPHPFunctions); + procedure SetExecutor(AValue : TpsvCustomPHP); + procedure SetLibraryName(AValue : zend_ustr); + protected + procedure RegisterLibrary; virtual; + procedure UnregisterLibrary; virtual; + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + procedure Refresh; virtual; + property Executor : TpsvCustomPHP read FExecutor write SetExecutor; + property LibraryName : zend_ustr read FLibraryName write SetLibraryName; + property Functions : TPHPFunctions read FFunctions write SetFunctions; + property Locked : boolean read FLocked write FLocked; + end; + { TPHPEngine } + TPHPEngineInitEvent = procedure(Sender:TObject;TSRMLS_DC:Pointer) of object; + TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) + private + FINIPath : zend_ustr; + FOnEngineStartup : TNotifyEvent; + FAddMods : TArray; + FOnEngineShutdown : TNotifyEvent; + FEngineActive : boolean; + FHandleErrors : boolean; + {$IFNDEF PHP540} + FSafeMode : boolean; + FSafeModeGid : boolean; + {$ENDIF} + FRegisterGlobals : boolean; + FHTMLErrors : boolean; + FMaxInputTime : integer; + FConstants : TphpConstants; + FDLLFolder : zend_ustr; + FReportDLLError : boolean; + FLock: TRTLCriticalSection; + FOnScriptError : TPHPErrorEvent; + FOnLogMessage : TPHPLogMessage; + FWaitForShutdown : boolean; + RegNumFunc : Cardinal; + FHash : TStringList; + FLibraryModule : Tzend_module_entry; + FLibraryEntryTable : array of zend_function_entry; + FRequestCount : integer; + procedure SetConstants(Value : TPHPConstants); + function GetConstantCount: integer; + function GetEngineActive : boolean; + protected + TSRMLS_D : pppointer; + procedure StartupPHP; virtual; + procedure PrepareEngine; virtual; + procedure PrepareIniEntry; virtual; + procedure RegisterConstants; virtual; + procedure RegisterInternalConstants(TSRMLS_DC : pointer); virtual; + procedure HandleRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); virtual; + property RequestCount : integer read FRequestCount; + procedure HandleError (Sender : TObject; AText : string; AType : Integer; AFileName : string; ALineNo : integer); + procedure HandleLogMessage(Sender : TObject; AText : string); + procedure RegisterLibrary(ALib : TCustomPHPLibrary); + procedure RefreshLibrary; + procedure UnlockLibraries; + procedure RemoveRequest; + procedure AddRequest; + public + constructor Create(AOwner : TComponent); override; + destructor Destroy; override; + procedure AddFunction(FN: zend_pchar; Func: Pointer); + procedure AddModule(Module_entry: Pzend_module_entry); + procedure StartupEngine; virtual; + procedure ShutdownEngine; virtual; + procedure LockEngine; virtual; + procedure UnlockEngine; virtual; + procedure PrepareForShutdown; virtual; + property EngineActive : boolean read GetEngineActive; + property ConstantCount : integer read GetConstantCount; + property WaitForShutdown : boolean read FWaitForShutdown; + procedure ShutdownAndWaitFor; virtual; + property LibraryEntry : Tzend_module_entry read FLibraryModule; + published + property HandleErrors : boolean read FHandleErrors write FHandleErrors default true; + property OnEngineStartup : TNotifyEvent read FOnEngineStartup write FOnEngineStartup; + property OnEngineShutdown : TNotifyEvent read FOnEngineShutdown write FOnEngineShutdown; + property OnScriptError : TPHPErrorEvent read FOnScriptError write FOnScriptError; + property OnLogMessage : TPHPLogMessage read FOnLogMessage write FOnLogMessage; + property IniPath : zend_ustr read FIniPath write FIniPath; + {$IFNDEF PHP540} + property SafeMode : boolean read FSafeMode write FSafeMode default false; + property SafeModeGid : boolean read FSafeModeGid write FSafeModeGid default false; + {$ENDIF} + property RegisterGlobals : boolean read FRegisterGlobals write FRegisterGlobals default true; + property HTMLErrors : boolean read FHTMLErrors write FHTMLErrors default false; + property MaxInputTime : integer read FMaxInputTime write FMaxInputTime default 0; + property Constants : TPHPConstants read FConstants write SetConstants; + property DLLFolder : zend_ustr read FDLLFolder write FDLLFolder; + property ReportDLLError : boolean read FReportDLLError write FReportDLLError; + end; + + TPHPLibrarian = class + private + FLibraries : TList; + public + constructor Create; virtual; + destructor Destroy; override; + procedure AddLibrary(ALibrary : TCustomPHPLibrary); + procedure RemoveLibrary(ALibrary : TCustomPHPLibrary); + function Count : integer; + function GetLibrary(Index : integer) : TCustomPHPLibrary; + property Libraries : TList read FLibraries write FLibraries; + end; +{$IFDEF REGISTER_COLOURS} +const + Colors: array[0..41] of TIdentMapEntry = ( + (Value: clBlack; Name: 'clBlack'), + (Value: clMaroon; Name: 'clMaroon'), + (Value: clGreen; Name: 'clGreen'), + (Value: clOlive; Name: 'clOlive'), + (Value: clNavy; Name: 'clNavy'), + (Value: clPurple; Name: 'clPurple'), + (Value: clTeal; Name: 'clTeal'), + (Value: clGray; Name: 'clGray'), + (Value: clSilver; Name: 'clSilver'), + (Value: clRed; Name: 'clRed'), + (Value: clLime; Name: 'clLime'), + (Value: clYellow; Name: 'clYellow'), + (Value: clBlue; Name: 'clBlue'), + (Value: clFuchsia; Name: 'clFuchsia'), + (Value: clAqua; Name: 'clAqua'), + (Value: clWhite; Name: 'clWhite'), + (Value: clScrollBar; Name: 'clScrollBar'), + (Value: clBackground; Name: 'clBackground'), + (Value: clActiveCaption; Name: 'clActiveCaption'), + (Value: clInactiveCaption; Name: 'clInactiveCaption'), + (Value: clMenu; Name: 'clMenu'), + (Value: clWindow; Name: 'clWindow'), + (Value: clWindowFrame; Name: 'clWindowFrame'), + (Value: clMenuText; Name: 'clMenuText'), + (Value: clWindowText; Name: 'clWindowText'), + (Value: clCaptionText; Name: 'clCaptionText'), + (Value: clActiveBorder; Name: 'clActiveBorder'), + (Value: clInactiveBorder; Name: 'clInactiveBorder'), + (Value: clAppWorkSpace; Name: 'clAppWorkSpace'), + (Value: clHighlight; Name: 'clHighlight'), + (Value: clHighlightText; Name: 'clHighlightText'), + (Value: clBtnFace; Name: 'clBtnFace'), + (Value: clBtnShadow; Name: 'clBtnShadow'), + (Value: clGrayText; Name: 'clGrayText'), + (Value: clBtnText; Name: 'clBtnText'), + (Value: clInactiveCaptionText; Name: 'clInactiveCaptionText'), + (Value: clBtnHighlight; Name: 'clBtnHighlight'), + (Value: cl3DDkShadow; Name: 'cl3DDkShadow'), + (Value: cl3DLight; Name: 'cl3DLight'), + (Value: clInfoText; Name: 'clInfoText'), + (Value: clInfoBk; Name: 'clInfoBk'), + (Value: clNone; Name: 'clNone')); +{$ENDIF} +var + Librarian : TPHPLibrarian = nil; + delphi_sapi_module : sapi_module_struct; + PHPEngine : TPHPEngine = nil; + {$IFDEF php_side_handler} + log_handler_php: string; + fatal_handler_php: string; + phpmd: TpsvPHP; + {$ENDIF} +implementation + +function AddSlashes(const S: zend_ustr): zend_ustr; +begin + Result := StringReplace(S, chr(8), '8', [rfReplaceAll]); + Result := StringReplace(S, '\', '\\', [rfReplaceAll]); + Result := StringReplace(Result, '''', '\''', [rfReplaceAll]); + Result := StringReplace(Result, ' AValue then begin @@ -394,357 +394,358 @@ procedure TCustomPHPLibrary.SetExecutor(AValue: TpsvCustomPHP); end; end; end; - -procedure TCustomPHPLibrary.SetFunctions(const Value: TPHPFunctions); -begin - FFunctions.Assign(Value); -end; - -procedure TCustomPHPLibrary.SetLibraryName(AValue: zend_ustr); -begin - if FLibraryName <> AValue then - begin - FLibraryName := AValue; - end; -end; - -procedure TCustomPHPLibrary.UnregisterLibrary; -begin - if Assigned(Librarian) then - Librarian.RemoveLibrary(Self); -end; - - -procedure InitLibrarian; -begin - Librarian := TPHPLibrarian.Create; -end; - -procedure UninitLibrarian; -begin - if Assigned(Librarian) then - try - Librarian.Free; - finally - Librarian := nil; - end; -end; - -{ TPHPLibrarian } - -procedure TPHPLibrarian.AddLibrary(ALibrary: TCustomPHPLibrary); -begin - if FLibraries.IndexOf(ALibrary) = -1 then - FLibraries.Add(ALibrary); -end; - -function TPHPLibrarian.Count: integer; -begin - Result := FLibraries.Count; -end; - -constructor TPHPLibrarian.Create; -begin - inherited; - FLibraries := TList.Create; -end; - -destructor TPHPLibrarian.Destroy; -begin - FLibraries.Free; - inherited; -end; - -function TPHPLibrarian.GetLibrary(Index: integer): TCustomPHPLibrary; -begin - Result := TCustomPHPLibrary(FLibraries[Index]); -end; - -procedure TPHPLibrarian.RemoveLibrary(ALibrary: TCustomPHPLibrary); -begin - FLibraries.Remove(ALibrary); -end; -{ TPHPMemoryStream } - -constructor TPHPMemoryStream.Create; -begin - inherited; -end; - -procedure TPHPMemoryStream.SetInitialSize(ASize: integer); -begin - Capacity := ASize; -end; -{ Startup functions } -function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RegisterInternalClasses(TSRMLS_DC); - RESULT := SUCCESS; -end; - -function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - RESULT := SUCCESS; -end; - -{Request initialization} -function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -{Request shutdown} -function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SUCCESS; -end; - -{$IFDEF PHP5} - -{PHP 5 only} -function delphi_stream_reader (handle : pointer; buf : zend_pchar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; -var - MS : TMemoryStream; -begin - MS := TMemoryStream(handle); - if MS = nil then - result := 0 - else - try - result := MS.Read(buf^, len); - except - result := 0; - end; -end; - -{PHP 5 only} -procedure delphi_stream_closer(handle : pointer; TSRMLS_DC : pointer); cdecl; -var - MS : TMemoryStream; -begin - MS := TMemoryStream(handle); - if MS <> nil then - try - MS.Clear; - except - end; -end; - -{$IFDEF PHP530} -function delphi_stream_fsizer(handle : pointer; TSRMLS_DC : pointer) : size_t; cdecl; -var - MS : TMemoryStream; -begin - MS := TMemoryStream(handle); - if MS <> nil then - try - result := MS.Size; - except - Result := 0; - end - else - Result := 0; -end; -{$ELSE} -{$IFDEF PHP510} - -{ PHP 5.10 and higher } -function delphi_stream_teller(handle : pointer; TSRMLS_DC : pointer) : longint; cdecl; -var - MS : TMemoryStream; -begin - MS := TMemoryStream(handle); - if MS <> nil then - try - result := MS.Size; - except - Result := 0; - end - else - Result := 0; -end; -{$ENDIF} -{$ENDIF} -{$ENDIF} -{ PHP Info functions } -procedure php_info_library(zend_module : Pointer; TSRMLS_DC : pointer); cdecl; -begin -end; - -function php_delphi_startup(sapi_module : Psapi_module_struct) : integer; cdecl; -begin - Result := SUCCESS; -end; - -function php_delphi_deactivate(p : pointer) : integer; cdecl; -begin - result := SUCCESS; -end; - -procedure php_delphi_flush(p : pointer); cdecl; -begin -end; - -function php_delphi_ub_write(str : pointer; len : uint; p : pointer) : integer; cdecl; -var - php : TpsvPHP; - gl : psapi_globals_struct; -begin - Result := 0; - gl := GetSAPIGlobals; - if Assigned(gl) then - begin - php := TpsvPHP(gl^.server_context); - if Assigned(php) then - begin - try - result := php.FBuffer.Write(str^, len); - except - end; - end; - end; -end; -function php_delphi_header_handler(sapi_header : psapi_header_struct; sapi_headers : psapi_headers_struct; TSRMLS_DC : pointer) : integer; cdecl; -begin - Result := SAPI_HEADER_ADD; -end; -function php_delphi_send_header(p1, TSRMLS_DC : pointer) : integer; cdecl; -var - php : TpsvPHP; - gl : psapi_globals_struct; -begin - gl := GetSAPIGlobals; - php := TpsvPHP(gl^.server_context); - if Assigned(p1) and Assigned(php) then - begin - with php.Headers.Add do - Header := String(Psapi_header_struct(p1)^.header); - end; - Result := SAPI_HEADER_SENT_SUCCESSFULLY; -end; - -function php_delphi_read_cookies(p1 : pointer) : pointer; cdecl; -begin - result := nil; -end; -function php_delphi_read_post(buf : zend_pchar; len : uint; TSRMLS_DC : pointer) : integer; cdecl; -var - gl : psapi_globals_struct; - php : TpsvPHP; -begin - gl := GetSAPIGlobals; - if gl = nil then - begin - Result := 0; - Exit; - end; - - php := TpsvPHP(gl^.server_context); - - if PHP = nil then - begin - Result := 0; - Exit; - end; - - if php.PostStream = nil then - begin - Result := 0; - Exit; - end; - - if php.PostStream.Size = 0 then - begin - Result := 0; - Exit; - end; - - Result := php.PostStream.Read(buf^, len); -end; -function GetLocalIP: String; -const WSVer = $101; -var - wsaData: TWSAData; - P: PHostEnt; - Buf: array [0..127] of Char; -begin - Result := ''; - if WSAStartup(WSVer, wsaData) = 0 then begin - if GetHostName(@Buf, 128) = 0 then begin - P := GetHostByName(@Buf); - if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); - end; - WSACleanup; - end; -end; - -procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; -var - php : TpsvPHP; - gl : psapi_globals_struct; - cnt : integer; - varcnt : integer; -begin - gl := GetSAPIGlobals; - if gl = nil then - Exit; - - php := TpsvPHP(gl^.server_context); - - if PHP = nil then - begin - Exit; - end; - php_register_variable('PHP_SELF', '_', nil, p); - php_register_variable('REMOTE_ADDR', zend_pchar(GetLocalIP()), val, p); - php_register_variable('IP_ADDRESS', zend_pchar(GetLocalIP()), val, p); - {if php.RequestType = prtPost then - php_register_variable('REQUEST_METHOD', 'POST', val, p) - else - php_register_variable('REQUEST_METHOD', 'GET', val, p);} - - varcnt := PHP.Variables.Count; - if varcnt > 0 then - begin - for cnt := 0 to varcnt - 1 do - begin - php_register_variable(zend_pchar(php.Variables[cnt].Name), - zend_pchar(php.Variables[cnt].Value), val, p); - end; - end; -end; -function wvsprintfA(Output: zend_pchar; Format: zend_pchar; arglist: zend_pchar): Integer; stdcall; external 'user32.dll'; -{$IFDEF PHP4} -function WriterProc(Parameter : Pointer) : integer; -var - n : integer; - php : TpsvCustomPHP; - buf : zend_pchar; - k : cardinal; -begin - try - php := TPsvCustomPHP(Parameter); - Buf := zend_pchar(php.FVirtualCode); - k := length(php.FVirtualCode); - repeat - n := _write(php.FVirtualWriteHandle, Buf, k); - if (n <= 0) then - break - else - begin - inc(Buf, n); - dec(K, n); - end; - until (n <= 0); - Close(php.FVirtualWriteHandle); - php.FVirtualWriteHandle := 0; - finally - Result := 0; - ExitThread(0); - end; -end; -{$ENDIF} - {$IFDEF soulengine_build} + +procedure TCustomPHPLibrary.SetFunctions(const Value: TPHPFunctions); +begin + FFunctions.Assign(Value); +end; + +procedure TCustomPHPLibrary.SetLibraryName(AValue: zend_ustr); +begin + if FLibraryName <> AValue then + begin + FLibraryName := AValue; + end; +end; + +procedure TCustomPHPLibrary.UnregisterLibrary; +begin + if Assigned(Librarian) then + Librarian.RemoveLibrary(Self); +end; + + +procedure InitLibrarian; +begin + Librarian := TPHPLibrarian.Create; +end; + +procedure UninitLibrarian; +begin + if Assigned(Librarian) then + try + Librarian.Free; + finally + Librarian := nil; + end; +end; + +{ TPHPLibrarian } + +procedure TPHPLibrarian.AddLibrary(ALibrary: TCustomPHPLibrary); +begin + if FLibraries.IndexOf(ALibrary) = -1 then + FLibraries.Add(ALibrary); +end; + +function TPHPLibrarian.Count: integer; +begin + Result := FLibraries.Count; +end; + +constructor TPHPLibrarian.Create; +begin + inherited; + FLibraries := TList.Create; +end; + +destructor TPHPLibrarian.Destroy; +begin + FLibraries.Free; + inherited; +end; + +function TPHPLibrarian.GetLibrary(Index: integer): TCustomPHPLibrary; +begin + Result := TCustomPHPLibrary(FLibraries[Index]); +end; + +procedure TPHPLibrarian.RemoveLibrary(ALibrary: TCustomPHPLibrary); +begin + FLibraries.Remove(ALibrary); +end; +{ TPHPMemoryStream } + +constructor TPHPMemoryStream.Create; +begin + inherited; +end; + +procedure TPHPMemoryStream.SetInitialSize(ASize: integer); +begin + Capacity := ASize; +end; +{ Startup functions } +function minit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RegisterInternalClasses(TSRMLS_DC); + RESULT := SUCCESS; +end; + +function mshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + RESULT := SUCCESS; +end; + +{Request initialization} +function rinit (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +{Request shutdown} +function rshutdown (_type : integer; module_number : integer; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SUCCESS; +end; + +{$IFDEF PHP5} + +{PHP 5 only} +function delphi_stream_reader (handle : pointer; buf : zend_pchar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS = nil then + result := 0 + else + try + result := MS.Read(buf^, len); + except + result := 0; + end; +end; + +{PHP 5 only} +procedure delphi_stream_closer(handle : pointer; TSRMLS_DC : pointer); cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + MS.Clear; + except + end; +end; + +{$IFDEF PHP530} +function delphi_stream_fsizer(handle : pointer; TSRMLS_DC : pointer) : size_t; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + result := MS.Size; + except + Result := 0; + end + else + Result := 0; +end; +{$ELSE} +{$IFDEF PHP510} + +{ PHP 5.10 and higher } +function delphi_stream_teller(handle : pointer; TSRMLS_DC : pointer) : longint; cdecl; +var + MS : TMemoryStream; +begin + MS := TMemoryStream(handle); + if MS <> nil then + try + result := MS.Size; + except + Result := 0; + end + else + Result := 0; +end; +{$ENDIF} +{$ENDIF} +{$ENDIF} +{ PHP Info functions } +procedure php_info_library(zend_module : Pointer; TSRMLS_DC : pointer); cdecl; +begin +end; + +function php_delphi_startup(sapi_module : Psapi_module_struct) : integer; cdecl; +begin + Result := SUCCESS; +end; + +function php_delphi_deactivate(p : pointer) : integer; cdecl; +begin + result := SUCCESS; +end; + +procedure php_delphi_flush(p : pointer); cdecl; +begin +end; + +function php_delphi_ub_write(str : pointer; len : uint; p : pointer) : integer; cdecl; +var + php : TpsvPHP; + gl : psapi_globals_struct; +begin + Result := 0; + gl := GetSAPIGlobals; + if Assigned(gl) then + begin + php := TpsvPHP(gl^.server_context); + if Assigned(php) then + begin + try + result := php.FBuffer.Write(str^, len); + except + end; + end; + end; +end; +function php_delphi_header_handler(sapi_header : psapi_header_struct; sapi_headers : psapi_headers_struct; TSRMLS_DC : pointer) : integer; cdecl; +begin + Result := SAPI_HEADER_ADD; +end; +function php_delphi_send_header(p1, TSRMLS_DC : pointer) : integer; cdecl; +var + php : TpsvPHP; + gl : psapi_globals_struct; +begin + gl := GetSAPIGlobals; + php := TpsvPHP(gl^.server_context); + if Assigned(p1) and Assigned(php) then + begin + with php.Headers.Add do + Header := String(Psapi_header_struct(p1)^.header); + end; + Result := SAPI_HEADER_SENT_SUCCESSFULLY; +end; + +function php_delphi_read_cookies(p1 : pointer) : pointer; cdecl; +begin + result := nil; +end; +function php_delphi_read_post(buf : zend_pchar; len : uint; TSRMLS_DC : pointer) : integer; cdecl; +var + gl : psapi_globals_struct; + php : TpsvPHP; +begin + gl := GetSAPIGlobals; + if gl = nil then + begin + Result := 0; + Exit; + end; + + php := TpsvPHP(gl^.server_context); + + if PHP = nil then + begin + Result := 0; + Exit; + end; + + if php.PostStream = nil then + begin + Result := 0; + Exit; + end; + + if php.PostStream.Size = 0 then + begin + Result := 0; + Exit; + end; + + Result := php.PostStream.Read(buf^, len); +end; +function GetLocalIP: String; +const WSVer = $101; +var + wsaData: TWSAData; + P: PHostEnt; + Buf: array [0..127] of Char; +begin + Result := ''; + if WSAStartup(WSVer, wsaData) = 0 then begin + if GetHostName(@Buf, 128) = 0 then begin + P := GetHostByName(@Buf); + if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); + end; + WSACleanup; + end; +end; + +procedure php_delphi_register_variables(val : pzval; p : pointer); cdecl; +var + php : TpsvPHP; + gl : psapi_globals_struct; + cnt : integer; + varcnt : integer; +begin + gl := GetSAPIGlobals; + if gl = nil then + Exit; + + php := TpsvPHP(gl^.server_context); + + if PHP = nil then + begin + Exit; + end; + php_register_variable('PHP_SELF', '_', nil, p); + php_register_variable('REMOTE_ADDR', zend_pchar(GetLocalIP()), val, p); + php_register_variable('IP_ADDRESS', zend_pchar(GetLocalIP()), val, p); + {if php.RequestType = prtPost then + php_register_variable('REQUEST_METHOD', 'POST', val, p) + else + php_register_variable('REQUEST_METHOD', 'GET', val, p);} + + varcnt := PHP.Variables.Count; + if varcnt > 0 then + begin + for cnt := 0 to varcnt - 1 do + begin + php_register_variable(zend_pchar(php.Variables[cnt].Name), + zend_pchar(php.Variables[cnt].Value), val, p); + end; + end; +end; +function wvsprintfA(Output: zend_pchar; Format: zend_pchar; arglist: zend_pchar): Integer; stdcall; external 'user32.dll'; +{$IFDEF PHP4} +function WriterProc(Parameter : Pointer) : integer; +var + n : integer; + php : TpsvCustomPHP; + buf : zend_pchar; + k : cardinal; +begin + try + php := TPsvCustomPHP(Parameter); + Buf := zend_pchar(php.FVirtualCode); + k := length(php.FVirtualCode); + repeat + n := _write(php.FVirtualWriteHandle, Buf, k); + if (n <= 0) then + break + else + begin + inc(Buf, n); + dec(K, n); + end; + until (n <= 0); + Close(php.FVirtualWriteHandle); + php.FVirtualWriteHandle := 0; + finally + Result := 0; + ExitThread(0); + end; +end; +{$ENDIF} + +{$IFDEF php_side_handler} procedure delphi_error_cb(AType: Integer; const AFname: zend_pchar; const ALineNo: UINT; const AFormat: zend_pchar; args: zend_pchar) cdecl; var @@ -800,9 +801,9 @@ procedure delphi_error_cb(AType: Integer; const AFname: zend_pchar; const ALineN MessageDlg(LText, mtError, [mbOk], 0) end; end; -end; -{$ELSE} -procedure delphi_error_cb(_type : integer; const error_filename : zend_pchar; +end; +{$ELSE} +procedure delphi_error_cb(_type : integer; const error_filename : zend_pchar; const error_lineno : uint; const _format : zend_pchar; args : zend_pchar); cdecl; var buffer : array[0..1023] of zend_uchar; @@ -862,7 +863,7 @@ procedure delphi_error_cb(_type : integer; const error_filename : zend_pchar; else error_type_str := 'Unknown error'; end; - {$IFDEF CUTTED_PHP7dll} + {$IFDEF COMPILER_php7pv} ShowMessage( Format ('PHP4DELPHI %s: %s in %s on line %d', [error_type_str, buffer, error_filename, error_lineno])); @@ -875,27 +876,27 @@ procedure delphi_error_cb(_type : integer; const error_filename : zend_pchar; end; if PHPLoaded then _zend_bailout(error_filename, error_lineno); -end; -{$ENDIF} -{$IFDEF soulengine_build} -function php_delphi_log_message(msg : zend_pchar) : integer; cdecl; -var - php : TpsvPHP; - gl : psapi_globals_struct; - S: zend_ustr; -begin - Result := 0; - gl := GetSAPIGlobals; - if gl = nil then - Exit; - - php := TpsvPHP(gl^.server_context); - if Assigned(PHPEngine) then - begin - if Assigned(PHPEngine.OnLogMessage) then - phpEngine.HandleLogMessage(php, msg) - else - if log_handler_php <> '' then +end; +{$ENDIF} +{$IFDEF php_side_handler} +function php_delphi_log_message(msg : zend_pchar) : integer; cdecl; +var + php : TpsvPHP; + gl : psapi_globals_struct; + S: zend_ustr; +begin + Result := 0; + gl := GetSAPIGlobals; + if gl = nil then + Exit; + + php := TpsvPHP(gl^.server_context); + if Assigned(PHPEngine) then + begin + if Assigned(PHPEngine.OnLogMessage) then + phpEngine.HandleLogMessage(php, msg) + else + if log_handler_php <> '' then begin S := zend_ustr(fatal_handler_php + '(' + '''' + AddSlashes(msg) + '''' + ');' + ' ?>'); @@ -905,15 +906,15 @@ function php_delphi_log_message(msg : zend_pchar) : integer; cdecl; phpmd.RunCode(S); S := ''; - end - else - MessageBoxA(0, MSG, 'PHP4Delphi', MB_OK) - end - else - MessageBoxA(0, msg, 'PHP4Delphi', MB_OK); -end; -{$ELSE} -function php_delphi_log_message(msg : Pchar) : integer; cdecl; + end + else + MessageBoxA(0, MSG, 'PHP4Delphi', MB_OK) + end + else + MessageBoxA(0, msg, 'PHP4Delphi', MB_OK); +end; +{$ELSE} +function php_delphi_log_message(msg : Pchar) : integer; cdecl; var php : TpsvPHP; gl : psapi_globals_struct; @@ -932,1083 +933,1083 @@ function php_delphi_log_message(msg : Pchar) : integer; cdecl; else MessageBox(0, msg, 'PHP4Delphi', MB_OK); result := 0; -end; -{$ENDIF} -{ Request sender/dispatcher } - -{$IFDEF PHP510} -procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ELSE} -procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; - return_value_used : integer; TSRMLS_DC : pointer); cdecl; -{$ENDIF} -var - php : TpsvPHP; - gl : psapi_globals_struct; - Lib : IPHPEngine; -{$IFNDEF PHP510} - return_value_ptr : ppzval; -{$ENDIF} -begin - {$IFNDEF PHP510} - return_value_ptr := nil; - {$ENDIF} - ZVALVAL(return_value); - gl := GetSAPIGlobals; - if gl = nil then - Exit; - php := TpsvPHP(gl^.server_context); - if Assigned(php) then - begin - try - Lib := php.GetEngine; - if lib <> nil then - Lib.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); - except - ZVALVAL(return_value); - end; - end; -end; - -{ TpsvCustomPHP } - -constructor TpsvCustomPHP.Create(AOwner: TComponent); -begin - inherited; - FMaxExecutionTime := 0; - FExecuteMethod := emServer; - FSessionActive := false; - FVariables := TPHPVariables.Create(Self); - FHeaders := TPHPHeaders.Create(Self); - FUseDelimiters := true; - FRequestType := prtGet; - FBuffer := TPHPMemoryStream.Create; - {$IFDEF PHP4} - FVirtualCode := ''; - {$ELSE} - FVirtualStream := TStringStream.Create; - {$ENDIF} -end; - -destructor TpsvCustomPHP.Destroy; -begin - FVariables.Free; - FHeaders.Free; - FSessionActive := False; - FBuffer.Free; - {$IFDEF PHP4} - FVirtualCode := ''; - {$ELSE} - if FVirtualStream <> nil then - FreeAndNil(FVirtualStream); - {$ENDIF} - if Assigned(FPostStream) then - FreeAndNil(FPostStream); - inherited; -end; - -procedure TpsvCustomPHP.ClearBuffer; -begin - FBuffer.Clear; -end; - -procedure TpsvCustomPHP.ClearHeaders; -begin - FHeaders.Clear; -end; - - -function TpsvCustomPHP.Execute : zend_ustr; -var - file_handle : zend_file_handle; - {$IFDEF PHP4} - thread_id : cardinal; - {$ENDIF} - {$IFDEF PHP5} - ZendStream : TZendStream; - {$ENDIF} -begin - - if not EngineActive then - begin - Result := ''; - Exit; - end; - - if PHPEngine.WaitForShutdown then - begin - Result := ''; - Exit; - end; - - PHPEngine.AddRequest; - - try - ClearHeaders; - ClearBuffer; - - if Assigned(FBeforeExecute) then - FBeforeExecute(Self); - - - - FTerminated := false; - if not FUseMapping then - begin - if not FileExists(FFileName) then - raise Exception.CreateFmt('File %s does not exists', [FFileName]); - end; - StartupRequest; - - ZeroMemory(@file_handle, sizeof(zend_file_handle)); - - if FUseMapping then - begin - {$IFDEF PHP5} - ZeroMemory(@ZendStream, sizeof(ZendStream)); - ZendStream.reader := delphi_stream_reader; - ZendStream.closer := delphi_stream_closer; - {$IFDEF PHP530} - ZendStream.fsizer := delphi_stream_fsizer; - {$ELSE} - {$IFDEF PHP510} - ZendStream.fteller := delphi_stream_teller; - {$ENDIF} - ZendStream.interactive := 0; - {$ENDIF} - ZendStream.handle := FVirtualStream; - - file_handle._type := ZEND_HANDLE_STREAM; - file_handle.opened_path := nil; - file_handle.filename := '-'; - file_handle.free_filename := 0; - file_handle.handle.stream := ZendStream; - {$ELSE} - {for PHP4 only} - file_handle._type := ZEND_HANDLE_FD; - file_handle.opened_path := nil; - file_handle.filename := '-'; - file_handle.free_filename := 0; - file_handle.handle.fd := FVirtualReadHandle; - FWriterHandle := BeginThread(nil, 8192, @WriterProc, Self, 0, thread_id); - {$ENDIF} - end - else - begin - file_handle._type := ZEND_HANDLE_FILENAME; - file_handle.filename := zend_pchar(FFileName); - file_handle.opened_path := nil; - file_handle.free_filename := 0; - end; - - try - begin - PHPAPI.php_execute_script(@file_handle, TSRMLS_D); - end - except - FBuffer.Clear; - try - ts_free_thread; - except - - end; - end; - - PrepareResult; - - - if Assigned(FAfterExecute) then - FAfterExecute(Self); - - //ShutdownRequest; - - FBuffer.Position := 0; - if Assigned(FOnReadResult) then - begin - FOnReadResult(Self, FBuffer); - Result := ''; - end - else - begin - SetLength(Result, FBuffer.Size); - FBuffer.Read(Result[1], FBuffer.Size); - end; - FBuffer.Clear; - {$IFDEF PHP4} - FVirtualCode := ''; - {$ENDIF} - finally - PHPEngine.RemoveRequest; - end; -end; - -function TpsvCustomPHP.RunCode(Acode : zend_ustr) : zend_ustr; -begin - if not EngineActive then - begin - Result := ''; - Exit; - end; - - ClearHeaders; - ClearBuffer; - FUseMapping := true; - - try - if FUseDelimiters then - begin - if Pos('', [ACode]); - end; - if not CreateVirtualFile(ACode) then - begin - Result := ''; - Exit; - end; - Result := Execute; - finally - FUseMapping := false; - end; -end; - - -function TpsvCustomPHP.RunCode(ACode: TStrings): string; -begin - if Assigned(ACode) then - Result := RunCode(ACode.Text); -end; - - -procedure TpsvCustomPHP.SetVariables(Value: TPHPVariables); -begin - FVariables.Assign(Value); -end; - -procedure TpsvCustomPHP.SetHeaders(Value : TPHPHeaders); -begin - FHeaders.Assign(Value); -end; - - - -function TpsvCustomPHP.Execute(AFileName: zend_ustr): zend_ustr; -begin - FFileName := AFileName; - Result := Execute; -end; - -procedure TpsvCustomPHP.PrepareResult; -var - ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; - data: ^ppzval; - cnt : integer; - variable : pzval; -begin - if FVariables.Count = 0 then - Exit; - - if FExecuteMethod = emServer then - ht := GetSymbolsTable - else - ht := GetTrackHash('_GET'); - if Assigned(ht) then - begin - for cnt := 0 to FVariables.Count - 1 do - begin - new(data); - try - if zend_hash_find(ht, zend_pchar(FVariables[cnt].Name), - strlen(zend_pchar(FVariables[cnt].Name)) + 1, data) = SUCCESS then - begin - variable := data^^; - convert_to_string(variable); - FVariables[cnt].Value := Z_STRVAL(variable); - end; - finally - freemem(data); - end; - end; - end; -end; - -function TpsvCustomPHP.VariableByName(AName: zend_ustr): TPHPVariable; -begin - Result := FVariables.ByName(AName); -end; - -{Indicates activity of PHP Engine} -function TpsvCustomPHP.EngineActive : boolean; -begin - if Assigned(PHPEngine) then - Result := PHPEngine.EngineActive - else - Result := false; -end; - -procedure TpsvCustomPHP.StartupRequest; -var - gl : psapi_globals_struct; - TimeStr : string; -begin - if not EngineActive then - raise EDelphiErrorEx.Create('PHP engine is not active '); - - if FSessionActive then - Exit; - - TSRMLS_D := tsrmls_fetch; - - gl := GetSAPIGlobals; - gl^.server_context := Self; - //ShowMessage('TpsvCustomPHP.StartupRequest -- RegisterGlobals'); - if PHPEngine.RegisterGlobals then - GetPHPGlobals(TSRMLS_D)^.register_globals := true; - //ShowMessage('TpsvCustomPHP.StartupRequest -- Try'); - try - //ShowMessage('TpsvCustomPHP.StartupRequest -- FOnReadPost'); - if Assigned(FOnReadPost) then - FOnReadPost(Self, FPostStream); - //ShowMessage('TpsvCustomPHP.StartupRequest -- zend_alter_ini_entry'); - zend_alter_ini_entry('max_execution_time', 19, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_RUNTIME); - //ShowMessage('TpsvCustomPHP.StartupRequest -- php_request_startup'); - php_request_startup(TSRMLS_D); - //ShowMessage('TpsvCustomPHP.StartupRequest -- FOnRequestStartup'); - if Assigned(FOnRequestStartup) then - FOnRequestStartup(Self); - //ShowMessage('TpsvCustomPHP.StartupRequest --'); - FSessionActive := true; - except - FSessionActive := false; - end; -end; - -function TpsvCustomPHP.RunTime: boolean; -begin - Result := not (csDesigning in ComponentState); -end; - -function TpsvCustomPHP.GetThreadSafeResourceManager: pointer; -begin - Result := TSRMLS_D; -end; - -function TpsvCustomPHP.GetVariableCount: integer; -begin - Result := FVariables.Count; -end; - - -procedure TpsvCustomPHP.ShutdownRequest; -var - gl : psapi_globals_struct; -begin - if not FSessionActive then - Exit; - try - - if not FTerminated then - begin - try - php_request_shutdown(nil); - except - end; - gl := GetSAPIGlobals; - gl^.server_context := nil; - end; - - - if Assigned(FOnRequestShutdown) then - FOnRequestShutdown(Self); - - finally - FSessionActive := false; - end; - -end; - -procedure TpsvCustomPHP.PrepareVariables; -var - ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; - data: ^ppzval; - cnt : integer; - {$IFDEF PHP5} - EG : pzend_executor_globals; - {$ENDIF} -begin - {$IFDEF PHP4} - ht := GetSymbolsTable; - {$ELSE} - begin - EG := GetExecutorGlobals; - if Assigned(EG) then - ht := @EG.symbol_table - else - ht := nil; - end; - {$ENDIF} - - if Assigned(ht) then - begin - for cnt := 0 to FVariables.Count - 1 do - begin - new(data); - try - if zend_hash_find(ht, zend_pchar(FVariables[cnt].Name), - strlen(zend_pchar(FVariables[cnt].Name)) + 1, data) = SUCCESS then - begin - {$IFDEF PHP7} - if (data^^^.u1.v._type = IS_STRING) then - {$ELSE} - if (data^^^._type = IS_STRING) then - {$ENDIF} - begin - efree(data^^^.value.str.val); - ZVAL_STRING(data^^, zend_pchar(FVariables[cnt].Value), true); - end - else - begin - ZVAL_STRING(data^^, zend_pchar(FVariables[cnt].Value), true); - end; - end; - finally - freemem(data); - end; - end; - end; -end; - -procedure TpsvCustomPHP.CloseVirtualFile; -begin - {$IFDEF PHP4} - if FWriterHandle <> 0 then - begin - WaitForSingleObject(FWriterHandle, INFINITE); - CloseHandle(FWriterHandle); - FWriterHandle := 0; - end; - {$ELSE} - FVirtualStream.Clear; - {$ENDIF} -end; - -function TpsvCustomPHP.CreateVirtualFile(A_code : zend_ustr): boolean; -var -{$IFDEF PHP4} -_handles : array[0..1] of THandle; -{$ENDIF} -sc:PUTF8Char; -begin - - Result := false; - {$IFDEF PHP4} - if ACode = '' then - begin - FVirtualReadHandle := 0; - FVirtualWriteHandle := 0; - Exit; {empty buffer was provided} - end; - - FVirtualCode := A_code; - - if pipe(@_handles, 4096, 0) = -1 then - begin - FVirtualReadHandle := 0; - FVirtualWriteHandle := 0; - FVirtualCode := ''; - Exit; - end; - - FVirtualReadHandle := _handles[0]; - FVirtualWriteHandle := _handles[1]; - Result := true; - {$ELSE} - if A_code = '' then - Exit; - try - FVirtualStream.Clear; - FVirtualStream.WriteString(A_code); - FVirtualStream.Seek(0, TSeekOrigin.soBeginning); +end; +{$ENDIF} +{ Request sender/dispatcher } + +{$IFDEF PHP510} +procedure DispatchRequest(ht : integer; return_value : pzval; return_value_ptr : ppzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ELSE} +procedure DispatchRequest(ht : integer; return_value : pzval; this_ptr : pzval; + return_value_used : integer; TSRMLS_DC : pointer); cdecl; +{$ENDIF} +var + php : TpsvPHP; + gl : psapi_globals_struct; + Lib : IPHPEngine; +{$IFNDEF PHP510} + return_value_ptr : ppzval; +{$ENDIF} +begin + {$IFNDEF PHP510} + return_value_ptr := nil; + {$ENDIF} + ZVALVAL(return_value); + gl := GetSAPIGlobals; + if gl = nil then + Exit; + php := TpsvPHP(gl^.server_context); + if Assigned(php) then + begin + try + Lib := php.GetEngine; + if lib <> nil then + Lib.HandleRequest(ht, return_value, return_value_ptr, this_ptr, return_value_used, TSRMLS_DC); + except + ZVALVAL(return_value); + end; + end; +end; + +{ TpsvCustomPHP } + +constructor TpsvCustomPHP.Create(AOwner: TComponent); +begin + inherited; + FMaxExecutionTime := 0; + FExecuteMethod := emServer; + FSessionActive := false; + FVariables := TPHPVariables.Create(Self); + FHeaders := TPHPHeaders.Create(Self); + FUseDelimiters := true; + FRequestType := prtGet; + FBuffer := TPHPMemoryStream.Create; + {$IFDEF PHP4} + FVirtualCode := ''; + {$ELSE} + FVirtualStream := TStringStream.Create; + {$ENDIF} +end; + +destructor TpsvCustomPHP.Destroy; +begin + FVariables.Free; + FHeaders.Free; + FSessionActive := False; + FBuffer.Free; + {$IFDEF PHP4} + FVirtualCode := ''; + {$ELSE} + if FVirtualStream <> nil then + FreeAndNil(FVirtualStream); + {$ENDIF} + if Assigned(FPostStream) then + FreeAndNil(FPostStream); + inherited; +end; + +procedure TpsvCustomPHP.ClearBuffer; +begin + FBuffer.Clear; +end; + +procedure TpsvCustomPHP.ClearHeaders; +begin + FHeaders.Clear; +end; + + +function TpsvCustomPHP.Execute : zend_ustr; +var + file_handle : zend_file_handle; + {$IFDEF PHP4} + thread_id : cardinal; + {$ENDIF} + {$IFDEF PHP5} + ZendStream : TZendStream; + {$ENDIF} +begin + + if not EngineActive then + begin + Result := ''; + Exit; + end; + + if PHPEngine.WaitForShutdown then + begin + Result := ''; + Exit; + end; + + PHPEngine.AddRequest; + + try + ClearHeaders; + ClearBuffer; + + if Assigned(FBeforeExecute) then + FBeforeExecute(Self); + + + + FTerminated := false; + if not FUseMapping then + begin + if not FileExists(FFileName) then + raise Exception.CreateFmt('File %s does not exists', [FFileName]); + end; + StartupRequest; + + ZeroMemory(@file_handle, sizeof(zend_file_handle)); + + if FUseMapping then + begin + {$IFDEF PHP5} + ZeroMemory(@ZendStream, sizeof(ZendStream)); + ZendStream.reader := delphi_stream_reader; + ZendStream.closer := delphi_stream_closer; + {$IFDEF PHP530} + ZendStream.fsizer := delphi_stream_fsizer; + {$ELSE} + {$IFDEF PHP510} + ZendStream.fteller := delphi_stream_teller; + {$ENDIF} + ZendStream.interactive := 0; + {$ENDIF} + ZendStream.handle := FVirtualStream; + + file_handle._type := ZEND_HANDLE_STREAM; + file_handle.opened_path := nil; + file_handle.filename := '-'; + file_handle.free_filename := 0; + file_handle.handle.stream := ZendStream; + {$ELSE} + {for PHP4 only} + file_handle._type := ZEND_HANDLE_FD; + file_handle.opened_path := nil; + file_handle.filename := '-'; + file_handle.free_filename := 0; + file_handle.handle.fd := FVirtualReadHandle; + FWriterHandle := BeginThread(nil, 8192, @WriterProc, Self, 0, thread_id); + {$ENDIF} + end + else + begin + file_handle._type := ZEND_HANDLE_FILENAME; + file_handle.filename := zend_pchar(FFileName); + file_handle.opened_path := nil; + file_handle.free_filename := 0; + end; + + try + begin + PHPAPI.php_execute_script(@file_handle, TSRMLS_D); + end + except + FBuffer.Clear; + try + ts_free_thread; + except + + end; + end; + + PrepareResult; + + + if Assigned(FAfterExecute) then + FAfterExecute(Self); + + //ShutdownRequest; + + FBuffer.Position := 0; + if Assigned(FOnReadResult) then + begin + FOnReadResult(Self, FBuffer); + Result := ''; + end + else + begin + SetLength(Result, FBuffer.Size); + FBuffer.Read(Result[1], FBuffer.Size); + end; + FBuffer.Clear; + {$IFDEF PHP4} + FVirtualCode := ''; + {$ENDIF} + finally + PHPEngine.RemoveRequest; + end; +end; + +function TpsvCustomPHP.RunCode(Acode : zend_ustr) : zend_ustr; +begin + if not EngineActive then + begin + Result := ''; + Exit; + end; + + ClearHeaders; + ClearBuffer; + FUseMapping := true; + + try + if FUseDelimiters then + begin + if Pos('', [ACode]); + end; + if not CreateVirtualFile(ACode) then + begin + Result := ''; + Exit; + end; + Result := Execute; + finally + FUseMapping := false; + end; +end; + + +function TpsvCustomPHP.RunCode(ACode: TStrings): string; +begin + if Assigned(ACode) then + Result := RunCode(ACode.Text); +end; + + +procedure TpsvCustomPHP.SetVariables(Value: TPHPVariables); +begin + FVariables.Assign(Value); +end; + +procedure TpsvCustomPHP.SetHeaders(Value : TPHPHeaders); +begin + FHeaders.Assign(Value); +end; + + + +function TpsvCustomPHP.Execute(AFileName: zend_ustr): zend_ustr; +begin + FFileName := AFileName; + Result := Execute; +end; + +procedure TpsvCustomPHP.PrepareResult; +var + ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; + data: ^ppzval; + cnt : integer; + variable : pzval; +begin + if FVariables.Count = 0 then + Exit; + + if FExecuteMethod = emServer then + ht := GetSymbolsTable + else + ht := GetTrackHash('_GET'); + if Assigned(ht) then + begin + for cnt := 0 to FVariables.Count - 1 do + begin + new(data); + try + if zend_hash_find(ht, zend_pchar(FVariables[cnt].Name), + strlen(zend_pchar(FVariables[cnt].Name)) + 1, data) = SUCCESS then + begin + variable := data^^; + convert_to_string(variable); + FVariables[cnt].Value := Z_STRVAL(variable); + end; + finally + freemem(data); + end; + end; + end; +end; + +function TpsvCustomPHP.VariableByName(AName: zend_ustr): TPHPVariable; +begin + Result := FVariables.ByName(AName); +end; + +{Indicates activity of PHP Engine} +function TpsvCustomPHP.EngineActive : boolean; +begin + if Assigned(PHPEngine) then + Result := PHPEngine.EngineActive + else + Result := false; +end; + +procedure TpsvCustomPHP.StartupRequest; +var + gl : psapi_globals_struct; + TimeStr : string; +begin + if not EngineActive then + raise EDelphiErrorEx.Create('PHP engine is not active '); + + if FSessionActive then + Exit; + + TSRMLS_D := tsrmls_fetch; + + gl := GetSAPIGlobals; + gl^.server_context := Self; + //ShowMessage('TpsvCustomPHP.StartupRequest -- RegisterGlobals'); + if PHPEngine.RegisterGlobals then + GetPHPGlobals(TSRMLS_D)^.register_globals := true; + //ShowMessage('TpsvCustomPHP.StartupRequest -- Try'); + try + //ShowMessage('TpsvCustomPHP.StartupRequest -- FOnReadPost'); + if Assigned(FOnReadPost) then + FOnReadPost(Self, FPostStream); + //ShowMessage('TpsvCustomPHP.StartupRequest -- zend_alter_ini_entry'); + zend_alter_ini_entry('max_execution_time', 19, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_RUNTIME); + //ShowMessage('TpsvCustomPHP.StartupRequest -- php_request_startup'); + php_request_startup(TSRMLS_D); + //ShowMessage('TpsvCustomPHP.StartupRequest -- FOnRequestStartup'); + if Assigned(FOnRequestStartup) then + FOnRequestStartup(Self); + //ShowMessage('TpsvCustomPHP.StartupRequest --'); + FSessionActive := true; + except + FSessionActive := false; + end; +end; + +function TpsvCustomPHP.RunTime: boolean; +begin + Result := not (csDesigning in ComponentState); +end; + +function TpsvCustomPHP.GetThreadSafeResourceManager: pointer; +begin + Result := TSRMLS_D; +end; + +function TpsvCustomPHP.GetVariableCount: integer; +begin + Result := FVariables.Count; +end; + + +procedure TpsvCustomPHP.ShutdownRequest; +var + gl : psapi_globals_struct; +begin + if not FSessionActive then + Exit; + try + + if not FTerminated then + begin + try + php_request_shutdown(nil); + except + end; + gl := GetSAPIGlobals; + gl^.server_context := nil; + end; + + + if Assigned(FOnRequestShutdown) then + FOnRequestShutdown(Self); + + finally + FSessionActive := false; + end; + +end; + +procedure TpsvCustomPHP.PrepareVariables; +var + ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; + data: ^ppzval; + cnt : integer; + {$IFDEF PHP5} + EG : pzend_executor_globals; + {$ENDIF} +begin + {$IFDEF PHP4} + ht := GetSymbolsTable; + {$ELSE} + begin + EG := GetExecutorGlobals; + if Assigned(EG) then + ht := @EG.symbol_table + else + ht := nil; + end; + {$ENDIF} + + if Assigned(ht) then + begin + for cnt := 0 to FVariables.Count - 1 do + begin + new(data); + try + if zend_hash_find(ht, zend_pchar(FVariables[cnt].Name), + strlen(zend_pchar(FVariables[cnt].Name)) + 1, data) = SUCCESS then + begin + {$IFDEF PHP7} + if (data^^^.u1.v._type = IS_STRING) then + {$ELSE} + if (data^^^._type = IS_STRING) then + {$ENDIF} + begin + efree(data^^^.value.str.val); + ZVAL_STRING(data^^, zend_pchar(FVariables[cnt].Value), true); + end + else + begin + ZVAL_STRING(data^^, zend_pchar(FVariables[cnt].Value), true); + end; + end; + finally + freemem(data); + end; + end; + end; +end; + +procedure TpsvCustomPHP.CloseVirtualFile; +begin + {$IFDEF PHP4} + if FWriterHandle <> 0 then + begin + WaitForSingleObject(FWriterHandle, INFINITE); + CloseHandle(FWriterHandle); + FWriterHandle := 0; + end; + {$ELSE} + FVirtualStream.Clear; + {$ENDIF} +end; + +function TpsvCustomPHP.CreateVirtualFile(A_code : zend_ustr): boolean; +var +{$IFDEF PHP4} +_handles : array[0..1] of THandle; +{$ENDIF} +sc:PUTF8Char; +begin + + Result := false; + {$IFDEF PHP4} + if ACode = '' then + begin + FVirtualReadHandle := 0; + FVirtualWriteHandle := 0; + Exit; {empty buffer was provided} + end; + + FVirtualCode := A_code; + + if pipe(@_handles, 4096, 0) = -1 then + begin + FVirtualReadHandle := 0; + FVirtualWriteHandle := 0; + FVirtualCode := ''; + Exit; + end; + + FVirtualReadHandle := _handles[0]; + FVirtualWriteHandle := _handles[1]; + Result := true; + {$ELSE} + if A_code = '' then + Exit; + try + FVirtualStream.Clear; + FVirtualStream.WriteString(A_code); + FVirtualStream.Seek(0, TSeekOrigin.soBeginning); finally Result := True; - end; - {$ENDIF} -end; - - -function TpsvCustomPHP.GetEngine: IPHPEngine; -begin - Result := PHPEngine; -end; - -{ TPHPEngine } - - -constructor TPHPEngine.Create(AOwner: TComponent); -begin - inherited; - if Assigned(PHPEngine) then - raise Exception.Create('Only one instance of PHP engine per application'); - FEngineActive := false; - FHandleErrors := true; - {$IFNDEF PHP540} - FSafeMode := false; - FSafeModeGid := false; - {$ENDIF} - FRegisterGlobals := true; - FHTMLErrors := false; - FMaxInputTime := 0; - FWaitForShutdown := false; - FConstants := TPHPConstants.Create(Self); - FRequestCount := 0; - FHash := TStringList.Create; - FHash.Duplicates := dupError; - FHash.Sorted := true; - InitializeCriticalSection(FLock); - PHPEngine := Self; - -end; - -destructor TPHPEngine.Destroy; -begin - ShutdownAndWaitFor; - FEngineActive := false; - FConstants.Free; - FHash.Free; - DeleteCriticalSection(FLock); - if (PHPEngine = Self) then - PHPEngine := nil; - inherited; - if PHPLoaded then - UnloadPHP; -end; - -function TPHPEngine.GetConstantCount: integer; -begin - Result := FConstants.Count; -end; -{ -procedure log(i:String); -var f:TextFile; -begin + end; + {$ENDIF} +end; + + +function TpsvCustomPHP.GetEngine: IPHPEngine; +begin + Result := PHPEngine; +end; + +{ TPHPEngine } + + +constructor TPHPEngine.Create(AOwner: TComponent); +begin + inherited; + if Assigned(PHPEngine) then + raise Exception.Create('Only one instance of PHP engine per application'); + FEngineActive := false; + FHandleErrors := true; + {$IFNDEF PHP540} + FSafeMode := false; + FSafeModeGid := false; + {$ENDIF} + FRegisterGlobals := true; + FHTMLErrors := false; + FMaxInputTime := 0; + FWaitForShutdown := false; + FConstants := TPHPConstants.Create(Self); + FRequestCount := 0; + FHash := TStringList.Create; + FHash.Duplicates := dupError; + FHash.Sorted := true; + InitializeCriticalSection(FLock); + PHPEngine := Self; + +end; + +destructor TPHPEngine.Destroy; +begin + ShutdownAndWaitFor; + FEngineActive := false; + FConstants.Free; + FHash.Free; + DeleteCriticalSection(FLock); + if (PHPEngine = Self) then + PHPEngine := nil; + inherited; + if PHPLoaded then + UnloadPHP; +end; + +function TPHPEngine.GetConstantCount: integer; +begin + Result := FConstants.Count; +end; +{ +procedure log(i:String); +var f:TextFile; +begin AssignFile(f, 'log.txt'); Append(f); Write(f, #10 + #13 + i); CloseFile(f); -end; -} -procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; - return_value_ptr: ppzval; this_ptr: pzval; return_value_used: integer; - TSRMLS_DC: pointer); - -var - Params : pzval_array; - AFunction : TPHPFunction; - j : integer; - FActiveFunctionName : string; - FunctionIndex : integer; - FZendVar : TZendVariable; - FParameters : TFunctionParams; - ReturnValue : variant; -begin - FParameters := TFunctionParams.Create(nil, TFunctionParam); - - if ht > 0 then - begin - if ( not (zend_get_parameters_my(ht, Params, TSRMLS_DC) = SUCCESS )) then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - end; - - FActiveFunctionName := get_active_function_name(TSRMLS_DC); - if FHash.Find(FActiveFunctionName, FunctionIndex) then - AFunction := TPHPFunction(FHash.Objects[FunctionIndex]) - else - AFunction := nil; - - if Assigned(AFunction) then - begin - if AFunction.Collection = nil then - Exit; {library was destroyed} - - if Assigned(AFunction.OnExecute) then - begin - if AFunction.Parameters.Count <> ht then - begin - zend_wrong_param_count(TSRMLS_DC); - Exit; - end; - - FParameters.Assign(AFunction.Parameters); - if ht > 0 then - begin - for j := 0 to ht - 1 do - begin - if not IsParamTypeCorrect(FParameters[j].ParamType, Params[j]^) then - begin - zend_error(E_WARNING, zend_pchar( - {$IFDEF PHP_UNICODE}Format{$ELSE}AnsiFormat{$ENDIF} - ('Wrong parameter type for %s()', [FActiveFunctionName]))); - Exit; - end; - FParameters[j].ZendValue := (Params[j]^); - end; - end; { if ht > 0} - //log(FActiveFunctionName); - FZendVar := TZendVariable.Create; - FZendVar.AsZendVariable := return_value; - AFunction.OnExecute(Self, FParameters, ReturnValue, FZendVar, TSRMLS_DC); - if Assigned(FZendVar) then - begin - if FZendVar.ISNull then {perform variant conversion} - VariantToZend(ReturnValue, return_value); - FZendVar.Free; - end - else - VariantToZend(ReturnValue, return_value); - end; {if assigned AFunction.OnExecute} - end; - FParameters.Free; - dispose_pzval_array(Params); -end; - -procedure TPHPEngine.PrepareIniEntry; -var - p, p2 : pointer; - TimeStr : string; -begin - if not PHPLoaded then - Exit; - - if FHandleErrors then - begin - HFunc(@delphi_error_cb, 'zend_error_cb'); - end; - {$IFNDEF PHP540} - if FSafeMode then - zend_alter_ini_entry('safe_mode', 10, '1', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP) - else - {$ENDIF} - zend_alter_ini_entry('safe_mode', 10, '0', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP); - {$IFNDEF PHP540} - if FSafeModeGID then - zend_alter_ini_entry('safe_mode_gid', 14, '1', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP) - else - {$ENDIF} - zend_alter_ini_entry('safe_mode_gid', 14, '0', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP); - - zend_alter_ini_entry('register_argc_argv', 19, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - - if FRegisterGlobals then - zend_alter_ini_entry('register_globals', 17, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE) - else - zend_alter_ini_entry('register_globals', 17, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - - if FHTMLErrors then - zend_alter_ini_entry('html_errors', 12, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE) - else - zend_alter_ini_entry('html_errors', 12, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - - zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); - TimeStr := IntToStr(FMaxInputTime); - zend_alter_ini_entry('max_input_time', 15, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); -end; - -procedure TPHPEngine.PrepareEngine; -begin - delphi_sapi_module.name := 'embed'; {to solve a problem with dl()} - delphi_sapi_module.pretty_name := 'PHP for Delphi'; - delphi_sapi_module.startup := php_delphi_startup; - delphi_sapi_module.shutdown := nil; //php_module_shutdown_wrapper; - delphi_sapi_module.activate:= nil; - delphi_sapi_module.deactivate := @php_delphi_deactivate; - delphi_sapi_module.ub_write := @php_delphi_ub_write; - delphi_sapi_module.flush := @php_delphi_flush; - delphi_sapi_module.stat:= nil; - delphi_sapi_module.getenv:= nil; - delphi_sapi_module.sapi_error := @zend_error; - delphi_sapi_module.header_handler := @php_delphi_header_handler; - delphi_sapi_module.send_headers := nil; - delphi_sapi_module.send_header := @php_delphi_send_header; - delphi_sapi_module.read_post := @php_delphi_read_post; - delphi_sapi_module.read_cookies := @php_delphi_read_cookies; - delphi_sapi_module.register_server_variables := @php_delphi_register_variables; - delphi_sapi_module.log_message := @php_delphi_log_message; - if FIniPath <> '' then - delphi_sapi_module.php_ini_path_override := zend_pchar(FIniPath) - else - delphi_sapi_module.php_ini_path_override := nil; - delphi_sapi_module.block_interruptions := nil; - delphi_sapi_module.unblock_interruptions := nil; - delphi_sapi_module.default_post_reader := nil; - delphi_sapi_module.treat_data := nil; - delphi_sapi_module.executable_location := nil; - delphi_sapi_module.php_ini_ignore := 0; - - FLibraryModule.size := sizeOf(Tzend_module_entry); - FLibraryModule.zend_api := ZEND_MODULE_API_NO; - {$IFDEF PHP_DEBUG} - FLibraryModule.zend_debug := 1; - {$ELSE} - FLibraryModule.zend_debug := 0; - {$ENDIF} - FLibraryModule.zts := USING_ZTS; - FLibraryModule.name := 'php4delphi_internal'; - FLibraryModule.functions := nil; - FLibraryModule.module_startup_func := @minit; - FLibraryModule.module_shutdown_func := @mshutdown; - FLibraryModule.info_func := @php_info_library; - - FLibraryModule.request_shutdown_func := @rshutdown; - FLibraryModule.request_startup_func := @rinit; - - FLibraryModule.module_started := 0; - FLibraryModule._type := MODULE_PERSISTENT; - - FLibraryModule.Handle := nil; - FLibraryModule.module_number := 0; - FLibraryModule.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); -end; - -procedure TPHPEngine.RegisterConstants; -var - cnt : integer; - ConstantName : zend_ustr; - ConstantValue : zend_ustr; -begin - for cnt := 0 to FConstants.Count - 1 do - begin - ConstantName := FConstants[cnt].Name; - ConstantValue := FConstants[cnt].Value; - zend_register_string_constant(zend_pchar(ConstantName), - strlen(zend_pchar(ConstantName)) + 1, - zend_pchar(ConstantValue), CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); - end; - zend_register_bool_constant( zend_pchar('UTF8_SUPPORT'), 13, {$IFDEF PHP_UNICODE}TRUE{$ELSE}FALSE{$ENDIF}, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); - RegisterInternalConstants(TSRMLS_D); -end; - -procedure TPHPEngine.RegisterInternalConstants(TSRMLS_DC: pointer); -{$IFDEF REGISTER_COLORS} -var - i : integer; - ColorName : zend_ustr; -{$ENDIF} -begin - {$IFDEF REGISTER_COLORS} - for I := Low(Colors) to High(Colors) do - begin - ColorName := zend_ustr(Colors[i].Name); - zend_register_long_constant( zend_pchar(ColorName), strlen(zend_pchar(ColorName)) + 1, Colors[i].Value, - CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); - end; - {$ENDIF} -end; - - -procedure TPHPEngine.SetConstants(Value: TPHPConstants); -begin - FConstants.Assign(Value); -end; - -procedure TPHPEngine.ShutdownEngine; -begin - - if PHPEngine <> Self then - raise EDelphiErrorEx.Create('Only active engine can be stopped'); - - - if not FEngineActive then - Exit; - - try - - if @delphi_sapi_module.shutdown <> nil then - delphi_sapi_module.shutdown(@delphi_sapi_module); - sapi_shutdown; - {Shutdown PHP thread safe resource manager} - if Assigned(FOnEngineShutdown) then - FOnEngineShutdown(Self); - {$IF not Defined(PHP550) and not Defined(PHP560)} - try - tsrm_shutdown(); - except - - end; - {$ENDIF} - FHash.Clear; - finally - FEngineActive := false; - FWaitForShutdown := False; - end; -end; - -procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); -var - cnt : integer; - skip : boolean; - FN : zend_ustr; -begin - skip := false; - ALib.Refresh; - - {No functions defined, skip this library} - if ALib.Functions.Count = 0 then - Exit; - - for cnt := 0 to ALib.Functions.Count - 1 do - begin - FN := - {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} - (ALib.Functions[cnt].FunctionName); - if FHash.IndexOf(FN) > -1 then - begin - skip := true; - break; - end; - end; - - if not skip then - begin - for cnt := 0 to ALib.Functions.Count - 1 do - begin - FN := {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} - (ALib.Functions[cnt].FunctionName); - FHash.AddObject(FN, ALib.Functions[cnt]); - end; - ALib.Locked := true; - end; -end; - -procedure TPHPEngine.StartupEngine; -var - i : integer; - x: Pzend_module_entry; -begin - if PHPEngine <> Self then - begin - raise EDelphiErrorEx.Create('Only one PHP engine can be activated'); - end; - - if FEngineActive then - raise EDelphiErrorEx.Create('PHP engine already active'); - - StartupPHP; - PrepareEngine; -// ini := GetExecutorGlobals.ini_directives; - - - - if not PHPLoaded then //Peter Enz - begin - raise EDelphiErrorEx.Create('PHP engine is not loaded'); - end; - - try - FHash.Clear; - - for i := 0 to Librarian.Count -1 do - begin - RegisterLibrary(Librarian.GetLibrary(I)); - end; - - - //Start PHP thread safe resource manager - tsrm_startup(128, 1, 0 , nil); - - sapi_startup(@delphi_sapi_module); - - RefreshLibrary; - - php_module_startup(@delphi_sapi_module, @FLibraryModule, 1); - - TSRMLS_D := ts_resource_ex(0, nil); - if Length(FAddMods) > 0 then - for x in FAddMods do - begin - zend_register_module_ex(x, TSRMLS_D); - zend_startup_module_ex(x, TSRMLS_D); - end; - - - PrepareIniEntry; - RegisterConstants; - - if Assigned(FOnEngineStartup) then - FOnEngineStartup(Self); - - FEngineActive := true; - except - FEngineActive := false; - end; -end; - -procedure TPHPEngine.StartupPHP; -var - DLLName : string; -begin - if not PHPLoaded then - begin - if FDLLFolder <> '' then - DLLName := IncludeTrailingBackSlash(FDLLFolder) + PHPWin - else - DLLName := PHPWin; - LoadPHP(DLLName); - if FReportDLLError then - begin - if PHPLib = 0 then raise Exception.CreateFmt('%s not found', [DllName]); - end; - end; -end; - -procedure TPHPEngine.LockEngine; -begin - EnterCriticalSection(FLock); -end; - -procedure TPHPEngine.UnlockEngine; -begin - LeaveCriticalSection(FLock); -end; - -procedure TPHPEngine.HandleError(Sender: TObject; AText: string; - AType: Integer; AFileName: string; ALineNo: integer); -begin - LockEngine; - try - if Assigned(FOnScriptError) then - - - FOnScriptError(Sender, AText, AType, AFileName, ALineNo); - //ShowMessage( AText + #10#13 + AType.ToString + #10#13 + AFileName + #10#13 + ALineNo.ToString ); - // FOnScriptError(Sender, AText, AType, AFileName, ALineNo); - finally - UnlockEngine; - end; -end; - -procedure TPHPEngine.HandleLogMessage(Sender: TObject; AText: string); -begin - LockEngine; - try - if Assigned(FOnLogMessage) then - FOnLogMessage(Sender, AText); - finally - UnlockEngine; - end; -end; - -procedure TPHPEngine.PrepareForShutdown; -begin - LockEngine; - try - FWaitForShutdown := true; - finally - UnlockEngine; - end; -end; - -procedure TPHPEngine.ShutdownAndWaitFor; -var - cnt : integer; - AllClear : boolean; -begin - PrepareForShutdown; - - AllClear := false; - while not AllClear do - begin - cnt := FRequestCount; - if cnt <= 0 then - AllClear := true - else - Sleep(250); - end; - ShutdownEngine; -end; - -function TPHPEngine.GetEngineActive: boolean; -begin - Result := FEngineActive; -end; - -procedure TPHPEngine.UnlockLibraries; -var - cnt : integer; -begin - if Assigned(Librarian) then - begin - for cnt := 0 to Librarian.Count - 1 do - Librarian.GetLibrary(cnt).Locked := false; - end; -end; - -procedure TPHPEngine.RemoveRequest; +end; +} +procedure TPHPEngine.HandleRequest(ht: integer; return_value: pzval; + return_value_ptr: ppzval; this_ptr: pzval; return_value_used: integer; + TSRMLS_DC: pointer); + +var + Params : pzval_array; + AFunction : TPHPFunction; + j : integer; + FActiveFunctionName : string; + FunctionIndex : integer; + FZendVar : TZendVariable; + FParameters : TFunctionParams; + ReturnValue : variant; +begin + FParameters := TFunctionParams.Create(nil, TFunctionParam); + + if ht > 0 then + begin + if ( not (zend_get_parameters_my(ht, Params, TSRMLS_DC) = SUCCESS )) then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + end; + + FActiveFunctionName := get_active_function_name(TSRMLS_DC); + if FHash.Find(FActiveFunctionName, FunctionIndex) then + AFunction := TPHPFunction(FHash.Objects[FunctionIndex]) + else + AFunction := nil; + + if Assigned(AFunction) then + begin + if AFunction.Collection = nil then + Exit; {library was destroyed} + + if Assigned(AFunction.OnExecute) then + begin + if AFunction.Parameters.Count <> ht then + begin + zend_wrong_param_count(TSRMLS_DC); + Exit; + end; + + FParameters.Assign(AFunction.Parameters); + if ht > 0 then + begin + for j := 0 to ht - 1 do + begin + if not IsParamTypeCorrect(FParameters[j].ParamType, Params[j]^) then + begin + zend_error(E_WARNING, zend_pchar( + {$IFDEF PHP_UNICODE}Format{$ELSE}AnsiFormat{$ENDIF} + ('Wrong parameter type for %s()', [FActiveFunctionName]))); + Exit; + end; + FParameters[j].ZendValue := (Params[j]^); + end; + end; { if ht > 0} + //log(FActiveFunctionName); + FZendVar := TZendVariable.Create; + FZendVar.AsZendVariable := return_value; + AFunction.OnExecute(Self, FParameters, ReturnValue, FZendVar, TSRMLS_DC); + if Assigned(FZendVar) then + begin + if FZendVar.ISNull then {perform variant conversion} + VariantToZend(ReturnValue, return_value); + FZendVar.Free; + end + else + VariantToZend(ReturnValue, return_value); + end; {if assigned AFunction.OnExecute} + end; + FParameters.Free; + dispose_pzval_array(Params); +end; + +procedure TPHPEngine.PrepareIniEntry; +var + p, p2 : pointer; + TimeStr : string; +begin + if not PHPLoaded then + Exit; + + if FHandleErrors then + begin + HFunc(@delphi_error_cb, 'zend_error_cb'); + end; + {$IFNDEF PHP540} + if FSafeMode then + zend_alter_ini_entry('safe_mode', 10, '1', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP) + else + {$ENDIF} + zend_alter_ini_entry('safe_mode', 10, '0', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP); + {$IFNDEF PHP540} + if FSafeModeGID then + zend_alter_ini_entry('safe_mode_gid', 14, '1', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP) + else + {$ENDIF} + zend_alter_ini_entry('safe_mode_gid', 14, '0', 1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP); + + zend_alter_ini_entry('register_argc_argv', 19, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + + if FRegisterGlobals then + zend_alter_ini_entry('register_globals', 17, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE) + else + zend_alter_ini_entry('register_globals', 17, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + + if FHTMLErrors then + zend_alter_ini_entry('html_errors', 12, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE) + else + zend_alter_ini_entry('html_errors', 12, '0', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + + zend_alter_ini_entry('implicit_flush', 15, '1', 1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); + TimeStr := IntToStr(FMaxInputTime); + zend_alter_ini_entry('max_input_time', 15, zend_pchar(TimeStr), Length(TimeStr), ZEND_INI_SYSTEM, ZEND_INI_STAGE_ACTIVATE); +end; + +procedure TPHPEngine.PrepareEngine; +begin + delphi_sapi_module.name := 'embed'; {to solve a problem with dl()} + delphi_sapi_module.pretty_name := 'PHP for Delphi'; + delphi_sapi_module.startup := php_delphi_startup; + delphi_sapi_module.shutdown := nil; //php_module_shutdown_wrapper; + delphi_sapi_module.activate:= nil; + delphi_sapi_module.deactivate := @php_delphi_deactivate; + delphi_sapi_module.ub_write := @php_delphi_ub_write; + delphi_sapi_module.flush := @php_delphi_flush; + delphi_sapi_module.stat:= nil; + delphi_sapi_module.getenv:= nil; + delphi_sapi_module.sapi_error := @zend_error; + delphi_sapi_module.header_handler := @php_delphi_header_handler; + delphi_sapi_module.send_headers := nil; + delphi_sapi_module.send_header := @php_delphi_send_header; + delphi_sapi_module.read_post := @php_delphi_read_post; + delphi_sapi_module.read_cookies := @php_delphi_read_cookies; + delphi_sapi_module.register_server_variables := @php_delphi_register_variables; + delphi_sapi_module.log_message := @php_delphi_log_message; + if FIniPath <> '' then + delphi_sapi_module.php_ini_path_override := zend_pchar(FIniPath) + else + delphi_sapi_module.php_ini_path_override := nil; + delphi_sapi_module.block_interruptions := nil; + delphi_sapi_module.unblock_interruptions := nil; + delphi_sapi_module.default_post_reader := nil; + delphi_sapi_module.treat_data := nil; + delphi_sapi_module.executable_location := nil; + delphi_sapi_module.php_ini_ignore := 0; + + FLibraryModule.size := sizeOf(Tzend_module_entry); + FLibraryModule.zend_api := ZEND_MODULE_API_NO; + {$IFDEF PHP_DEBUG} + FLibraryModule.zend_debug := 1; + {$ELSE} + FLibraryModule.zend_debug := 0; + {$ENDIF} + FLibraryModule.zts := USING_ZTS; + FLibraryModule.name := 'php4delphi_internal'; + FLibraryModule.functions := nil; + FLibraryModule.module_startup_func := @minit; + FLibraryModule.module_shutdown_func := @mshutdown; + FLibraryModule.info_func := @php_info_library; + + FLibraryModule.request_shutdown_func := @rshutdown; + FLibraryModule.request_startup_func := @rinit; + + FLibraryModule.module_started := 0; + FLibraryModule._type := MODULE_PERSISTENT; + + FLibraryModule.Handle := nil; + FLibraryModule.module_number := 0; + FLibraryModule.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); +end; + +procedure TPHPEngine.RegisterConstants; +var + cnt : integer; + ConstantName : zend_ustr; + ConstantValue : zend_ustr; +begin + for cnt := 0 to FConstants.Count - 1 do + begin + ConstantName := FConstants[cnt].Name; + ConstantValue := FConstants[cnt].Value; + zend_register_string_constant(zend_pchar(ConstantName), + strlen(zend_pchar(ConstantName)) + 1, + zend_pchar(ConstantValue), CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); + end; + zend_register_bool_constant( zend_pchar('UTF8_SUPPORT'), 13, {$IFDEF PHP_UNICODE}TRUE{$ELSE}FALSE{$ENDIF}, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_D); + RegisterInternalConstants(TSRMLS_D); +end; + +procedure TPHPEngine.RegisterInternalConstants(TSRMLS_DC: pointer); +{$IFDEF REGISTER_COLOURS} var - x: Pzend_module_entry; - xp: function(_type : integer; module_number : integer; TSRMLS_DC : pointer):integer;cdecl; -begin - InterlockedDecrement(FRequestCount); - if Length(FAddMods) > 0 then - for x in FAddMods do - begin - xp := x^.request_shutdown_func; + i : integer; + ColorName : zend_ustr; +{$ENDIF} +begin + {$IFDEF REGISTER_COLOURS} + for I := Low(Colors) to High(Colors) do + begin + ColorName := zend_ustr(Colors[i].Name); + zend_register_long_constant( zend_pchar(ColorName), strlen(zend_pchar(ColorName)) + 1, Colors[i].Value, + CONST_PERSISTENT or CONST_CS, 0, TSRMLS_DC); + end; + {$ENDIF} +end; + + +procedure TPHPEngine.SetConstants(Value: TPHPConstants); +begin + FConstants.Assign(Value); +end; + +procedure TPHPEngine.ShutdownEngine; +begin + + if PHPEngine <> Self then + raise EDelphiErrorEx.Create('Only active engine can be stopped'); + + + if not FEngineActive then + Exit; + + try + + if @delphi_sapi_module.shutdown <> nil then + delphi_sapi_module.shutdown(@delphi_sapi_module); + sapi_shutdown; + {Shutdown PHP thread safe resource manager} + if Assigned(FOnEngineShutdown) then + FOnEngineShutdown(Self); + {$IF not Defined(PHP550) and not Defined(PHP560)} + try + tsrm_shutdown(); + except + + end; + {$ENDIF} + FHash.Clear; + finally + FEngineActive := false; + FWaitForShutdown := False; + end; +end; + +procedure TPHPEngine.RegisterLibrary(ALib : TCustomPHPLibrary); +var + cnt : integer; + skip : boolean; + FN : zend_ustr; +begin + skip := false; + ALib.Refresh; + + {No functions defined, skip this library} + if ALib.Functions.Count = 0 then + Exit; + + for cnt := 0 to ALib.Functions.Count - 1 do + begin + FN := + {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} + (ALib.Functions[cnt].FunctionName); + if FHash.IndexOf(FN) > -1 then + begin + skip := true; + break; + end; + end; + + if not skip then + begin + for cnt := 0 to ALib.Functions.Count - 1 do + begin + FN := {$IFDEF PHP_UNICODE}UTF8LowerCase{$ELSE}AnsiLowerCase{$ENDIF} + (ALib.Functions[cnt].FunctionName); + FHash.AddObject(FN, ALib.Functions[cnt]); + end; + ALib.Locked := true; + end; +end; + +procedure TPHPEngine.StartupEngine; +var + i : integer; + x: Pzend_module_entry; +begin + if PHPEngine <> Self then + begin + raise EDelphiErrorEx.Create('Only one PHP engine can be activated'); + end; + + if FEngineActive then + raise EDelphiErrorEx.Create('PHP engine already active'); + + StartupPHP; + PrepareEngine; +// ini := GetExecutorGlobals.ini_directives; + + + + if not PHPLoaded then //Peter Enz + begin + raise EDelphiErrorEx.Create('PHP engine is not loaded'); + end; + + try + FHash.Clear; + + for i := 0 to Librarian.Count -1 do + begin + RegisterLibrary(Librarian.GetLibrary(I)); + end; + + + //Start PHP thread safe resource manager + tsrm_startup(128, 1, 0 , nil); + + sapi_startup(@delphi_sapi_module); + + RefreshLibrary; + + php_module_startup(@delphi_sapi_module, @FLibraryModule, 1); + + TSRMLS_D := ts_resource_ex(0, nil); + if Length(FAddMods) > 0 then + for x in FAddMods do + begin + zend_register_module_ex(x, TSRMLS_D); + zend_startup_module_ex(x, TSRMLS_D); + end; + + + PrepareIniEntry; + RegisterConstants; + + if Assigned(FOnEngineStartup) then + FOnEngineStartup(Self); + + FEngineActive := true; + except + FEngineActive := false; + end; +end; + +procedure TPHPEngine.StartupPHP; +var + DLLName : string; +begin + if not PHPLoaded then + begin + if FDLLFolder <> '' then + DLLName := IncludeTrailingBackSlash(FDLLFolder) + PHPWin + else + DLLName := PHPWin; + LoadPHP(DLLName); + if FReportDLLError then + begin + if PHPLib = 0 then raise Exception.CreateFmt('%s not found', [DllName]); + end; + end; +end; + +procedure TPHPEngine.LockEngine; +begin + EnterCriticalSection(FLock); +end; + +procedure TPHPEngine.UnlockEngine; +begin + LeaveCriticalSection(FLock); +end; + +procedure TPHPEngine.HandleError(Sender: TObject; AText: string; + AType: Integer; AFileName: string; ALineNo: integer); +begin + LockEngine; + try + if Assigned(FOnScriptError) then + + + FOnScriptError(Sender, AText, AType, AFileName, ALineNo); + //ShowMessage( AText + #10#13 + AType.ToString + #10#13 + AFileName + #10#13 + ALineNo.ToString ); + // FOnScriptError(Sender, AText, AType, AFileName, ALineNo); + finally + UnlockEngine; + end; +end; + +procedure TPHPEngine.HandleLogMessage(Sender: TObject; AText: string); +begin + LockEngine; + try + if Assigned(FOnLogMessage) then + FOnLogMessage(Sender, AText); + finally + UnlockEngine; + end; +end; + +procedure TPHPEngine.PrepareForShutdown; +begin + LockEngine; + try + FWaitForShutdown := true; + finally + UnlockEngine; + end; +end; + +procedure TPHPEngine.ShutdownAndWaitFor; +var + cnt : integer; + AllClear : boolean; +begin + PrepareForShutdown; + + AllClear := false; + while not AllClear do + begin + cnt := FRequestCount; + if cnt <= 0 then + AllClear := true + else + Sleep(250); + end; + ShutdownEngine; +end; + +function TPHPEngine.GetEngineActive: boolean; +begin + Result := FEngineActive; +end; + +procedure TPHPEngine.UnlockLibraries; +var + cnt : integer; +begin + if Assigned(Librarian) then + begin + for cnt := 0 to Librarian.Count - 1 do + Librarian.GetLibrary(cnt).Locked := false; + end; +end; + +procedure TPHPEngine.RemoveRequest; +var + x: Pzend_module_entry; + xp: function(_type : integer; module_number : integer; TSRMLS_DC : pointer):integer;cdecl; +begin + InterlockedDecrement(FRequestCount); + if Length(FAddMods) > 0 then + for x in FAddMods do + begin + xp := x^.request_shutdown_func; if(Assigned(xp)) then - xp(x^._type, x^.module_number, TSRMLS_D); - end; -end; - -procedure TPHPEngine.AddFunction(FN: zend_pchar; Func: Pointer); -begin + xp(x^._type, x^.module_number, TSRMLS_D); + end; +end; + +procedure TPHPEngine.AddFunction(FN: zend_pchar; Func: Pointer); +begin inc(RegNumFunc); SetLength(FLibraryEntryTable, RegNumFunc + 1); FLibraryEntryTable[RegNumFunc - 1].fname := FN; //FLibraryEntryTable[RegNumFunc - 1].num_args := 0; FLibraryEntryTable[RegNumFunc - 1].arg_info := nil; - FLibraryEntryTable[RegNumFunc - 1].handler := Func; -end; - -procedure TPHPEngine.AddModule(Module_entry: Pzend_module_entry); -begin + FLibraryEntryTable[RegNumFunc - 1].handler := Func; +end; + +procedure TPHPEngine.AddModule(Module_entry: Pzend_module_entry); +begin SetLength(FAddMods, Length(FAddMods)+1); FAddMods[High(FAddMods)] := Module_entry; -end; - -procedure TPHPEngine.RefreshLibrary; -var i: integer; -begin +end; + +procedure TPHPEngine.RefreshLibrary; +var i: integer; +begin Self.AddFunction('delphi_date', @delphi_date); Self.AddFunction('delphi_get_author', @delphi_get_author); Self.AddFunction('delphi_str_date', @delphi_str_date); Self.AddFunction('InputBox', @delphi_input_box); - for i := 0 to FHash.Count - 1 do + for i := 0 to FHash.Count - 1 do Self.AddFunction(zend_pchar(zend_ustr(FHash[i])), @DispatchRequest); FLibraryModule.functions := @FLibraryEntryTable[0]; -end; - -procedure TPHPEngine.AddRequest; +end; + +procedure TPHPEngine.AddRequest; var - x: Pzend_module_entry; - xp: function(_type : integer; module_number : integer; TSRMLS_DC : pointer):integer;cdecl; -begin - InterlockedIncrement(FRequestCount); - if Length(FAddMods) > 0 then - for x in FAddMods do - begin - xp := x^.request_startup_func; + x: Pzend_module_entry; + xp: function(_type : integer; module_number : integer; TSRMLS_DC : pointer):integer;cdecl; +begin + InterlockedIncrement(FRequestCount); + if Length(FAddMods) > 0 then + for x in FAddMods do + begin + xp := x^.request_startup_func; if(Assigned(xp)) then - xp(x^._type, x^.module_number, TSRMLS_D); - end; -end; - -initialization - InitLibrarian; - -finalization - UnInitLibrarian; - -end. + xp(x^._type, x^.module_number, TSRMLS_D); + end; +end; + +initialization + InitLibrarian; + +finalization + UnInitLibrarian; + +end. From 67658bd28e6567a7a152c0f7aaa2f19663465485 Mon Sep 17 00:00:00 2001 From: lion Date: Sat, 18 Jul 2020 18:05:41 +0300 Subject: [PATCH 48/54] returned D2010 support --- .gitignore | 3 +- Source/AutomaticConversion.log | 1 - Source/DelphiFunctions.pas | 4 +- .../Delphi Class 2/delphi_class2.dpr | 24 +- .../Extensions/css/css.dpr | 4 +- .../Extensions/php class/php_class.dpr | 16 -- .../Extensions/skeleton/skeleton.dpr | 3 - .../psvPHP/Components/Unit1.pas | 13 - .../psvPHP/sample1/frm_phpDemo.pas | 5 - Source/Demos/Bonus/JpegConverter/php_jpeg.dpr | 3 - Source/Demos/Bonus/PHPEncoder/phpencoder.dpr | 3 - .../Demos/Bonus/phpRegistry/php_registry.dpr | 38 +-- .../Delphi Class 2/delphi_class2.dpr | 27 +- Source/Demos/Extensions/css/css.dpr | 4 +- .../Demos/Extensions/php class/php_class.dpr | 18 +- Source/Demos/Extensions/skeleton/skeleton.dpr | 3 - Source/Demos/psvPHP/Components/Unit1.pas | 13 - Source/Demos/psvPHP/console/phpcon.dpr | 2 +- Source/Demos/psvPHP/sample1/Unit1.pas | 5 - Source/Demos/psvPHP/sample1/frm_phpDemo.pas | 5 - Source/PHP.INC | 54 +++- Source/PHP4DelphiD2006.dpk | 6 +- Source/PHP4DelphiD2006.dproj.local | 2 - Source/PHP4DelphiD2006.stat | 10 - Source/PHPAPI.pas | 69 +++-- Source/PHPCommon.pas | 42 ++- Source/ZENDAPI.pas | 215 ++++++++++----- Source/ZendTypes.pas | 85 +++--- ...p4delphi Delphi 10 Seattle.groupproj.local | 12 - ...4delphi Delphi 10.1 Berlin.groupproj.local | 11 - ...p4delphi Delphi 10.2 Tokyo.groupproj.local | 13 - .../php4delphi Delphi 2010.groupproj.local | 23 -- .../php4delphi Delphi 2011.groupproj.local | 22 -- Source/packages/php4delphi Delphi 5.bpg | 23 ++ Source/packages/php4delphi Delphi 7.bpg | 23 ++ .../php4delphi Delphi XE1.groupproj.local | 14 - .../php4delphi Delphi XE2.groupproj.local | 15 -- .../php4delphi Delphi XE3.groupproj.local | 16 -- .../php4delphi Delphi XE4.groupproj.local | 17 -- .../php4delphi Delphi XE5.groupproj.local | 18 -- .../php4delphi Delphi XE6.groupproj.local | 19 -- .../php4delphi Delphi XE7.groupproj.local | 20 -- .../php4delphi Delphi XE8.groupproj.local | 21 -- Source/php4App.dproj.local | 2 - Source/php4App.identcache | Bin 47 -> 0 bytes Source/php4App.stat | 10 - Source/php4AppUnit.pas | 6 +- Source/php4Applications/PHP 4.4.6/php4App.dll | Bin 130560 -> 0 bytes .../php4Applications/PHP 5.2.11/php4App.dll | Bin 134656 -> 0 bytes Source/php4Applications/PHP 5.3.0/php4App.dll | Bin 135168 -> 0 bytes Source/php4Applications/PHP4/php4App.dll | Bin 49152 -> 0 bytes Source/php4Applications/PHP511/php4App.dll | Bin 119808 -> 0 bytes Source/php4Applications/PHP512/php4App.dll | Bin 37888 -> 0 bytes Source/php4DelphiD2005.dpk | 6 +- Source/php4DelphiD2005.dproj.local | 2 - Source/php4DelphiD2005.stat | 10 - Source/php4DelphiD2007.dpk | 6 +- Source/php4DelphiD2007.dproj.local | 2 - Source/php4DelphiD2007.stat | 10 - Source/php4DelphiD2009.dpk | 15 +- Source/php4DelphiD2009.dproj | 254 +++++++++--------- Source/php4DelphiD2009.dproj.local | 2 - Source/php4DelphiD2009.stat | 10 - Source/php4DelphiD2010.dpk | 18 +- Source/php4DelphiD2010.dproj.local | 6 - Source/php4DelphiD2010.identcache | Bin 1204 -> 0 bytes Source/php4DelphiD2010.stat | 10 - Source/php4DelphiD5.dproj.local | 2 - Source/php4DelphiD5.stat | 10 - Source/php4DelphiD6.dpk | 7 +- Source/php4DelphiD6.dproj.local | 2 - Source/php4DelphiD6.stat | 10 - Source/php4DelphiD7.cfg | 40 +++ Source/php4DelphiD7.dof | 136 ++++++++++ Source/php4DelphiD7.dproj.local | 2 - Source/php4DelphiD7.stat | 10 - Source/php4DelphiR2005.dpk | 8 +- Source/php4DelphiR2005.dproj.local | 2 - Source/php4DelphiR2005.stat | 10 - Source/php4DelphiR2006.dpk | 7 +- Source/php4DelphiR2006.dproj.local | 2 - Source/php4DelphiR2006.stat | 10 - Source/php4DelphiR2007.dpk | 7 +- Source/php4DelphiR2007.dproj.local | 2 - Source/php4DelphiR2007.stat | 10 - Source/php4DelphiR2009.dpk | 16 +- Source/php4DelphiR2009.dproj | 249 +++++++++-------- Source/php4DelphiR2009.dproj.local | 2 - Source/php4DelphiR2009.res | Bin 4396 -> 5056 bytes Source/php4DelphiR2009.stat | 10 - Source/php4DelphiR2010.dproj.local | 6 - Source/php4DelphiR2010.identcache | Bin 823 -> 0 bytes Source/php4DelphiR2010.stat | 10 - Source/php4DelphiR5.dpk | 5 +- Source/php4DelphiR5.dproj.local | 2 - Source/php4DelphiR5.identcache | Bin 556 -> 0 bytes Source/php4DelphiR5.stat | 10 - Source/php4DelphiR6.dpk | 11 +- Source/php4DelphiR6.dproj.local | 2 - Source/php4DelphiR6.stat | 10 - Source/php4DelphiR7.cfg | 40 +++ Source/php4DelphiR7.dof | 136 ++++++++++ Source/php4DelphiR7.dpk | 1 - Source/php4DelphiR7.dproj.local | 2 - Source/php4DelphiR7.identcache | Bin 856 -> 0 bytes Source/php4DelphiR7.stat | 10 - Source/php4delphi.pas | 59 +++- Source/phpClass.pas | 20 ++ Source/phpModules.pas | 26 +- php4Delphi.pdf | Bin 221817 -> 0 bytes 110 files changed, 1125 insertions(+), 1092 deletions(-) delete mode 100644 Source/AutomaticConversion.log delete mode 100644 Source/PHP4DelphiD2006.dproj.local delete mode 100644 Source/PHP4DelphiD2006.stat delete mode 100644 Source/packages/php4delphi Delphi 10 Seattle.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi 2010.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi 2011.groupproj.local create mode 100644 Source/packages/php4delphi Delphi 5.bpg create mode 100644 Source/packages/php4delphi Delphi 7.bpg delete mode 100644 Source/packages/php4delphi Delphi XE1.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi XE2.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi XE3.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi XE4.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi XE5.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi XE6.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi XE7.groupproj.local delete mode 100644 Source/packages/php4delphi Delphi XE8.groupproj.local delete mode 100644 Source/php4App.dproj.local delete mode 100644 Source/php4App.identcache delete mode 100644 Source/php4App.stat delete mode 100644 Source/php4Applications/PHP 4.4.6/php4App.dll delete mode 100644 Source/php4Applications/PHP 5.2.11/php4App.dll delete mode 100644 Source/php4Applications/PHP 5.3.0/php4App.dll delete mode 100644 Source/php4Applications/PHP4/php4App.dll delete mode 100644 Source/php4Applications/PHP511/php4App.dll delete mode 100644 Source/php4Applications/PHP512/php4App.dll delete mode 100644 Source/php4DelphiD2005.dproj.local delete mode 100644 Source/php4DelphiD2005.stat delete mode 100644 Source/php4DelphiD2007.dproj.local delete mode 100644 Source/php4DelphiD2007.stat delete mode 100644 Source/php4DelphiD2009.dproj.local delete mode 100644 Source/php4DelphiD2009.stat delete mode 100644 Source/php4DelphiD2010.dproj.local delete mode 100644 Source/php4DelphiD2010.identcache delete mode 100644 Source/php4DelphiD2010.stat delete mode 100644 Source/php4DelphiD5.dproj.local delete mode 100644 Source/php4DelphiD5.stat delete mode 100644 Source/php4DelphiD6.dproj.local delete mode 100644 Source/php4DelphiD6.stat create mode 100644 Source/php4DelphiD7.cfg create mode 100644 Source/php4DelphiD7.dof delete mode 100644 Source/php4DelphiD7.dproj.local delete mode 100644 Source/php4DelphiD7.stat delete mode 100644 Source/php4DelphiR2005.dproj.local delete mode 100644 Source/php4DelphiR2005.stat delete mode 100644 Source/php4DelphiR2006.dproj.local delete mode 100644 Source/php4DelphiR2006.stat delete mode 100644 Source/php4DelphiR2007.dproj.local delete mode 100644 Source/php4DelphiR2007.stat delete mode 100644 Source/php4DelphiR2009.dproj.local delete mode 100644 Source/php4DelphiR2009.stat delete mode 100644 Source/php4DelphiR2010.dproj.local delete mode 100644 Source/php4DelphiR2010.identcache delete mode 100644 Source/php4DelphiR2010.stat delete mode 100644 Source/php4DelphiR5.dproj.local delete mode 100644 Source/php4DelphiR5.identcache delete mode 100644 Source/php4DelphiR5.stat delete mode 100644 Source/php4DelphiR6.dproj.local delete mode 100644 Source/php4DelphiR6.stat create mode 100644 Source/php4DelphiR7.cfg create mode 100644 Source/php4DelphiR7.dof delete mode 100644 Source/php4DelphiR7.dproj.local delete mode 100644 Source/php4DelphiR7.identcache delete mode 100644 Source/php4DelphiR7.stat delete mode 100644 php4Delphi.pdf diff --git a/.gitignore b/.gitignore index 294f54a..1d9c846 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ __history/ - __recovery/ *.dcu *.local @@ -7,3 +6,5 @@ __recovery/ *.identcache *.stat *.res +*.~pas +*.~dcu \ No newline at end of file diff --git a/Source/AutomaticConversion.log b/Source/AutomaticConversion.log deleted file mode 100644 index e660758..0000000 --- a/Source/AutomaticConversion.log +++ /dev/null @@ -1 +0,0 @@ - Fatal: Перетворення перервано. diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index 74bbcc3..11163b2 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -17,9 +17,7 @@ interface uses SysUtils, Classes, - VCL.Controls, - ZendTypes, ZendAPI, PHPTypes, PHPAPI, VCL.Dialogs, typinfo, - VCL.Forms, VCL.stdctrls; + ZendTypes, ZendAPI, PHPTypes, PHPAPI, typinfo; {$ifdef fpc} {$mode delphi} diff --git a/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr index 1035333..9879358 100644 --- a/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr +++ b/Source/Demos Delphi 2009 (WideString support)/Extensions/Delphi Class 2/delphi_class2.dpr @@ -59,43 +59,24 @@ begin DelphiTable[4].fname := 'delphi_extract_file_ext'; DelphiTable[4].handler := @delphi_extract_file_ext; - {$IFDEF PHP4} - DelphiTable[4].func_arg_types := nil; - {$ELSE} DelphiTable[4].arg_info := nil; - {$ENDIF} DelphiTable[5].fname := 'delphi_show_message'; DelphiTable[5].handler := @delphi_show_message; - {$IFDEF PHP4} - DelphiTable[5].func_arg_types := nil; - {$ELSE} DelphiTable[5].arg_info := nil; - {$ENDIF} DelphiTable[6].fname := 'register_delphi_object'; delphitable[6].handler := @register_delphi_object; - {$IFDEF PHP4} - DelphiTable[6].func_arg_types := nil; - {$ELSE} DelphiTable[6].arg_info := nil; - {$ENDIF} DelphiTable[7].fname := 'delphi_get_author'; DelphiTable[7].handler := @delphi_get_author; - {$IFDEF PHP4} - DelphiTable[7].func_arg_types := nil; - {$ELSE} DelphiTable[7].arg_info := nil; - {$ENDIF} + DelphiTable[8].fname := 'delphi_str_date'; DelphiTable[8].handler := @delphi_str_date; - {$IFDEF PHP4} - DelphiTable[8].func_arg_types := nil; - {$ELSE} DelphiTable[8].arg_info := nil; - {$ENDIF} PHP_FUNCTION(DelphiTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); @@ -122,9 +103,6 @@ begin ModuleEntry.request_startup_func := @rinit; ModuleEntry.request_shutdown_func := @rshutdown; ModuleEntry.info_func := @php_info_module; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} ModuleEntry.functions := @DelphiTable[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr index 209efd7..52aae8e 100644 --- a/Source/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr +++ b/Source/Demos Delphi 2009 (WideString support)/Extensions/css/css.dpr @@ -114,9 +114,7 @@ begin ModuleEntry.info_func := @php_info_module; module_entry_table[0].fname := 'delphi_css'; module_entry_table[0].handler := @delphi_css; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr index 1fbe696..fe9c521 100644 --- a/Source/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr +++ b/Source/Demos Delphi 2009 (WideString support)/Extensions/php class/php_class.dpr @@ -100,25 +100,12 @@ begin properties[0] := 'name'; properties[1] := 'tool'; properties[2] := 'height'; - {$IFDEF PHP4} - _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); - {$ELSE} object_init(return_value, ce, TSRMLS_DC ); - {$ENDIF} - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1); - {$ELSE} add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1, TSRMLS_DC); - {$ENDIF} - {$IFDEF PHP4} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); - {$ELSE} add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); - {$ENDIF} end; @@ -143,9 +130,6 @@ begin ModuleEntry.info_func := @php_info_module; module_entry_table[0].fname := 'get_demo_class'; module_entry_table[0].handler := @get_demo_class; - {$IFDEF PHP4} - module_entry_table[0].func_arg_types := nil; - {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr index db76d9f..a2c7c38 100644 --- a/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr +++ b/Source/Demos Delphi 2009 (WideString support)/Extensions/skeleton/skeleton.dpr @@ -102,9 +102,6 @@ begin ModuleEntry.info_func := @php_info_module; Module_entry_table[0].fname := 'confirm_extname_compiled'; Module_entry_table[0].handler := @confirm_extname_compiled; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas index d0afb70..5a9e4e9 100644 --- a/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas +++ b/Source/Demos Delphi 2009 (WideString support)/psvPHP/Components/Unit1.pas @@ -86,18 +86,6 @@ procedure TfrmTest.FormCreate(Sender: TObject); memScript.Lines.Clear; with memScript.Lines do begin - {$IFDEF PHP4} - Add('$btnClose = register_delphi_component("btnClose");'); - Add('$frmTest = register_delphi_component("frmTest");'); - Add('$btnClose->Caption = "&Exit";'); - Add('$frmTest->Caption = "PHP4Delphi demo";'); - Add('$btnClose->Top = 150;'); - Add('$btnClose->Font->Size = 10;'); - Add('$btnClose->Cursor = -21;'); - Add('$frmTest->Color = clGreen;'); - Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); - Add('delphi_show_message($st);'); - {$ELSE} Add('$btnClose = register_delphi_component("btnClose");'); Add('$frmTest = register_delphi_component("frmTest");'); Add('$btnClose->Caption = "&Exit";'); @@ -108,7 +96,6 @@ procedure TfrmTest.FormCreate(Sender: TObject); Add('$frmTest->Color = clGreen;'); Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); Add('delphi_show_message($st);'); - {$ENDIF} end; PHPEngine.StartupEngine; end; diff --git a/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas index 6cff647..38f0f7f 100644 --- a/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas +++ b/Source/Demos Delphi 2009 (WideString support)/psvPHP/sample1/frm_phpDemo.pas @@ -118,13 +118,8 @@ procedure TfrmPHPDemo.DisplayResultInBrowser(AStr: AnsiString); AStr := StringReplace(AStr, 'src="?=PHPE9568F34-D428-11d2-A769-00AA001ACF42"', 'src="res://'+ParamStr(0)+'/php"', [rfReplaceAll, rfIgnoreCase]); - {$IFDEF PHP4} - AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', - 'src="res://'+ ParamStr(0) + '/zend1"', [rfReplaceAll, rfIgnoreCase]); - {$ELSE} AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', 'src="res://'+ ParamStr(0) + '/zend2"', [rfReplaceAll, rfIgnoreCase]); - {$ENDIF} Stream := StringToOleStream(AStr); StreamInit := Webbrowser1.Document as IPersistStreamInit; diff --git a/Source/Demos/Bonus/JpegConverter/php_jpeg.dpr b/Source/Demos/Bonus/JpegConverter/php_jpeg.dpr index 2ef4892..4ab728d 100644 --- a/Source/Demos/Bonus/JpegConverter/php_jpeg.dpr +++ b/Source/Demos/Bonus/JpegConverter/php_jpeg.dpr @@ -266,9 +266,6 @@ begin Module_entry_table[2].fname := 'sign_jpeg'; Module_entry_table[2].handler := @sign_jpeg; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; diff --git a/Source/Demos/Bonus/PHPEncoder/phpencoder.dpr b/Source/Demos/Bonus/PHPEncoder/phpencoder.dpr index 0f03996..93396ad 100644 --- a/Source/Demos/Bonus/PHPEncoder/phpencoder.dpr +++ b/Source/Demos/Bonus/PHPEncoder/phpencoder.dpr @@ -85,9 +85,6 @@ begin Module_entry_table[0].fname := 'ex_dec'; Module_entry_table[0].handler := @ex_dec; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos/Bonus/phpRegistry/php_registry.dpr b/Source/Demos/Bonus/phpRegistry/php_registry.dpr index ef0bd03..39319e2 100644 --- a/Source/Demos/Bonus/phpRegistry/php_registry.dpr +++ b/Source/Demos/Bonus/phpRegistry/php_registry.dpr @@ -562,75 +562,39 @@ begin module_entry_table[0].fname := 'regcreatekey'; module_entry_table[0].handler := @php_regcreatekey; - {$IFDEF PHP4} - module_entry_table[0].func_arg_types := nil; - {$ENDIF} module_entry_table[1].fname := 'regdeleteentry'; module_entry_table[1].handler := @php_regdeleteentry; - {$IFDEF PHP4} - module_entry_table[1].func_arg_types := nil; - {$ENDIF} module_entry_table[2].fname := 'regdeletekeytree'; - module_entry_table[2].handler := @php_regdeletekeytree; - {$IFDEF PHP4} - module_entry_table[2].func_arg_types := nil; - {$ENDIF} + module_entry_table[2].handler := p_regdeletekeytree; module_entry_table[3].fname := 'reghassubkeys'; module_entry_table[3].handler := @php_reghassubkeys; - {$IFDEF PHP4} - module_entry_table[3].func_arg_types := nil; - {$ENDIF} module_entry_table[4].fname := 'regkeyexists'; module_entry_table[4].handler := @php_regkeyexists; - {$IFDEF PHP4} - module_entry_table[4].func_arg_types := nil; - {$ENDIF} module_entry_table[5].fname := 'regreadbool'; module_entry_table[5].handler := @php_regreadbool; - {$IFDEF PHP4} - module_entry_table[5].func_arg_types := nil; - {$ENDIF} module_entry_table[6].fname := 'regreadinteger'; module_entry_table[6].handler := @php_regreadinteger; - {$IFDEF PHP4} - module_entry_table[6].func_arg_types := nil; - {$ENDIF} module_entry_table[7].fname := 'regreadstring'; module_entry_table[7].handler := @php_regreadstring; - {$IFDEF PHP4} - module_entry_table[7].func_arg_types := nil; - {$ENDIF} module_entry_table[8].fname := 'regwritebool'; module_entry_table[8].handler := @php_regwritebool; - {$IFDEF PHP4} - module_entry_table[8].func_arg_types := nil; - {$ENDIF} module_entry_table[9].fname := 'regwriteinteger'; module_entry_table[9].handler := @php_regwriteinteger; - {$IFDEF PHP4} - module_entry_table[9].func_arg_types := nil; - {$ENDIF} module_entry_table[10].fname := 'regwritestring'; module_entry_table[10].handler := @php_regwritestring; - {$IFDEF PHP4} - module_entry_table[10].func_arg_types := nil; - {$ENDIF} module_entry_table[11].fname := nil; module_entry_table[11].handler := nil; - {$IFDEF PHP4} - module_entry_table[11].func_arg_types := nil; - {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; diff --git a/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr index 6972d25..cb67916 100644 --- a/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr +++ b/Source/Demos/Extensions/Delphi Class 2/delphi_class2.dpr @@ -59,43 +59,23 @@ begin DelphiTable[4].fname := 'delphi_extract_file_ext'; DelphiTable[4].handler := @delphi_extract_file_ext; - {$IFDEF PHP4} - DelphiTable[4].func_arg_types := nil; - {$ELSE} DelphiTable[4].arg_info := nil; - {$ENDIF} DelphiTable[5].fname := 'delphi_show_message'; - DelphiTable[5].handler := @delphi_show_message; - {$IFDEF PHP4} - DelphiTable[5].func_arg_types := nil; - {$ELSE} + DelphiTable[5].handler := @delphi_show_message;} DelphiTable[5].arg_info := nil; - {$ENDIF} DelphiTable[6].fname := 'register_delphi_object'; delphitable[6].handler := @register_delphi_object; - {$IFDEF PHP4} - DelphiTable[6].func_arg_types := nil; - {$ELSE} DelphiTable[6].arg_info := nil; - {$ENDIF} DelphiTable[7].fname := 'delphi_get_author'; DelphiTable[7].handler := @delphi_get_author; - {$IFDEF PHP4} - DelphiTable[7].func_arg_types := nil; - {$ELSE} - DelphiTable[7].arg_info := nil; - {$ENDIF} + DelphiTable[7].arg_info := nil;} DelphiTable[8].fname := 'delphi_str_date'; DelphiTable[8].handler := @delphi_str_date; - {$IFDEF PHP4} - DelphiTable[8].func_arg_types := nil; - {$ELSE} DelphiTable[8].arg_info := nil; - {$ENDIF} PHP_FUNCTION(DelphiTable[9], 'delphi_get_system_directory', @delphi_get_system_directory); @@ -122,9 +102,6 @@ begin ModuleEntry.request_startup_func := @rinit; ModuleEntry.request_shutdown_func := @rshutdown; ModuleEntry.info_func := @php_info_module; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} ModuleEntry.functions := @DelphiTable[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos/Extensions/css/css.dpr b/Source/Demos/Extensions/css/css.dpr index 79f0d5a..0b04986 100644 --- a/Source/Demos/Extensions/css/css.dpr +++ b/Source/Demos/Extensions/css/css.dpr @@ -104,9 +104,7 @@ begin ModuleEntry.info_func := @php_info_module; module_entry_table[0].fname := 'delphi_css'; module_entry_table[0].handler := @delphi_css; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos/Extensions/php class/php_class.dpr b/Source/Demos/Extensions/php class/php_class.dpr index c0938e1..8333ffc 100644 --- a/Source/Demos/Extensions/php class/php_class.dpr +++ b/Source/Demos/Extensions/php class/php_class.dpr @@ -100,25 +100,11 @@ begin properties[0] := 'name'; properties[1] := 'tool'; properties[2] := 'height'; - {$IFDEF PHP4} - _object_init_ex(return_value, ce, nil, 0, TSRMLS_DC ); - {$ELSE} object_init(return_value, ce, TSRMLS_DC ); - {$ENDIF} - - {$IFDEF PHP4} - add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1); - add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1); - {$ELSE} add_property_string_ex(return_value, properties[0], strlen(properties[0]) + 1, 'Serhiy', 1, TSRMLS_DC); add_property_string_ex(return_value, properties[1], strlen(properties[1]) + 1, 'Delphi', 1, TSRMLS_DC); - {$ENDIF} - {$IFDEF PHP4} - add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185); - {$ELSE} add_property_long_ex(return_value, properties[2], strlen(properties[2]) + 1, 185, TSRMLS_DC); - {$ENDIF} end; @@ -143,9 +129,7 @@ begin ModuleEntry.info_func := @php_info_module; module_entry_table[0].fname := 'get_demo_class'; module_entry_table[0].handler := @get_demo_class; - {$IFDEF PHP4} - module_entry_table[0].func_arg_types := nil; - {$ENDIF} + ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos/Extensions/skeleton/skeleton.dpr b/Source/Demos/Extensions/skeleton/skeleton.dpr index e951a0c..4bebef7 100644 --- a/Source/Demos/Extensions/skeleton/skeleton.dpr +++ b/Source/Demos/Extensions/skeleton/skeleton.dpr @@ -103,9 +103,6 @@ begin ModuleEntry.info_func := @php_info_module; Module_entry_table[0].fname := 'confirm_extname_compiled'; Module_entry_table[0].handler := @confirm_extname_compiled; - {$IFDEF PHP4} - Module_entry_table[0].func_arg_types := nil; - {$ENDIF} ModuleEntry.functions := @module_entry_table[0]; ModuleEntry._type := MODULE_PERSISTENT; {$IFDEF PHP530} diff --git a/Source/Demos/psvPHP/Components/Unit1.pas b/Source/Demos/psvPHP/Components/Unit1.pas index d0afb70..5a9e4e9 100644 --- a/Source/Demos/psvPHP/Components/Unit1.pas +++ b/Source/Demos/psvPHP/Components/Unit1.pas @@ -86,18 +86,6 @@ procedure TfrmTest.FormCreate(Sender: TObject); memScript.Lines.Clear; with memScript.Lines do begin - {$IFDEF PHP4} - Add('$btnClose = register_delphi_component("btnClose");'); - Add('$frmTest = register_delphi_component("frmTest");'); - Add('$btnClose->Caption = "&Exit";'); - Add('$frmTest->Caption = "PHP4Delphi demo";'); - Add('$btnClose->Top = 150;'); - Add('$btnClose->Font->Size = 10;'); - Add('$btnClose->Cursor = -21;'); - Add('$frmTest->Color = clGreen;'); - Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); - Add('delphi_show_message($st);'); - {$ELSE} Add('$btnClose = register_delphi_component("btnClose");'); Add('$frmTest = register_delphi_component("frmTest");'); Add('$btnClose->Caption = "&Exit";'); @@ -108,7 +96,6 @@ procedure TfrmTest.FormCreate(Sender: TObject); Add('$frmTest->Color = clGreen;'); Add('$st = delphi_input_box("InputBox", "Type your message", "Done");'); Add('delphi_show_message($st);'); - {$ENDIF} end; PHPEngine.StartupEngine; end; diff --git a/Source/Demos/psvPHP/console/phpcon.dpr b/Source/Demos/psvPHP/console/phpcon.dpr index 0886d78..dd42a80 100644 --- a/Source/Demos/psvPHP/console/phpcon.dpr +++ b/Source/Demos/psvPHP/console/phpcon.dpr @@ -32,7 +32,7 @@ var begin if zend_parse_method_parameters(1, TSRMLS_DC, this_ptr, 'z', @Text) = 0 then begin - ShowMessage(WideString(Z_RawStr(Text))); + ShowMessage(Z_STRVAL(Text)); end; end; procedure grc(ht: integer; return_value: pzval; diff --git a/Source/Demos/psvPHP/sample1/Unit1.pas b/Source/Demos/psvPHP/sample1/Unit1.pas index 53d68ce..7b7281e 100644 --- a/Source/Demos/psvPHP/sample1/Unit1.pas +++ b/Source/Demos/psvPHP/sample1/Unit1.pas @@ -110,13 +110,8 @@ procedure TfrmPHPDemo.DisplayResultInBrowser(AStr: string); AStr := StringReplace(AStr, 'src="?=PHPE9568F34-D428-11d2-A769-00AA001ACF42"', 'src="res://'+ParamStr(0)+'/php"', [rfReplaceAll, rfIgnoreCase]); - {$IFDEF PHP4} - AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', - 'src="res://'+ ParamStr(0) + '/zend1"', [rfReplaceAll, rfIgnoreCase]); - {$ELSE} AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', 'src="res://'+ ParamStr(0) + '/zend2"', [rfReplaceAll, rfIgnoreCase]); - {$ENDIF} Stream := StringToOleStream(AStr); StreamInit := Webbrowser1.Document as IPersistStreamInit; diff --git a/Source/Demos/psvPHP/sample1/frm_phpDemo.pas b/Source/Demos/psvPHP/sample1/frm_phpDemo.pas index 4593e8e..98e98f3 100644 --- a/Source/Demos/psvPHP/sample1/frm_phpDemo.pas +++ b/Source/Demos/psvPHP/sample1/frm_phpDemo.pas @@ -117,13 +117,8 @@ procedure TfrmPHPDemo.DisplayResultInBrowser(AStr: string); AStr := StringReplace(AStr, 'src="?=PHPE9568F34-D428-11d2-A769-00AA001ACF42"', 'src="res://'+ParamStr(0)+'/php"', [rfReplaceAll, rfIgnoreCase]); - {$IFDEF PHP4} - AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', - 'src="res://'+ ParamStr(0) + '/zend1"', [rfReplaceAll, rfIgnoreCase]); - {$ELSE} AStr := StringReplace(AStr, 'src="?=PHPE9568F35-D428-11d2-A769-00AA001ACF42"', 'src="res://'+ ParamStr(0) + '/zend2"', [rfReplaceAll, rfIgnoreCase]); - {$ENDIF} Stream := StringToOleStream(AStr); StreamInit := Webbrowser1.Document as IPersistStreamInit; diff --git a/Source/PHP.INC b/Source/PHP.INC index 09db880..d7fa89c 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -35,13 +35,19 @@ Define suitable visual library //Version {$DEFINE PHP560} + //PHP Version +{$DEFINE ZTS} + //Thread Safe mode (php7ts, e.g) {$DEFINE VCL} - + //visual library - Kylix, VCL, FMX for Delphi and LCL, fpGUI for Lazarus + //Features {$DEFINE PHP_UNICODE} //PHP unicode support *Enables WideString and UnicodeString -{$DEFINE REGISTER_COLOURS} +{.$DEFINE REGISTER_COLOURS} //constants for Delphi colours +{.$DEFINE php_side_handler} + //enable ability to define own error handler from php side ~NON_TC {.$DEFINE QUIET_LOAD} //Do not show errors while loading php library {.$DEFINE PHP4DELPHI_AUTOLOAD} @@ -50,8 +56,6 @@ Define suitable visual library // Unload php library at finalization //Compiler switches -{.$DEFINE php_side_handler} - //enable ability to define own error handler from php side ~NON_TC {.$DEFINE COMPILER_php7pv} // use macroses from PHP sources patch // https://github.com/resistancelion/no-name-engine/tree/master/php-src @@ -70,7 +74,6 @@ Define suitable visual library - //E N D {$WARN UNIT_DEPRECATED OFF} {$IFDEF PHP_UNICODE} {$DEFINE UNICODE} {$ENDIF} @@ -101,9 +104,23 @@ Define suitable visual library {$ENDIF} {$ENDIF} -{$IFNDEF LINUX} - {$DEFINE ZTS} {zend thread safety support} -{$ENDIF} + +{$ifdef FPC} + {$DEFINE VERSION1} + {$DEFINE VERSION2} + {$DEFINE VERSION3} + {$DEFINE VERSION4} + {$DEFINE VERSION5} + {$DEFINE VERSION6} + {$DEFINE VERSION7} + {$DEFINE VERSION8} + {$DEFINE VERSION9} + {$DEFINE VERSION10} + {$DEFINE VERSION11} + {$DEFINE VERSION12} + {$DEFINE VERSION13} + {$DEFINE VERSION14} +{$endif} {$IFNDEF VER80} {Delphi 1.0} {$DEFINE VERSION2} {Delphi 2.0 and BCB 1 or higher} @@ -179,6 +196,17 @@ Define suitable visual library {$ENDIF} {$ENDIF} +{$IFNDEF VER180} + {$DEFINE OLD_PATHS} +{$ENDIF} + +{$IFDEF VERSION12} + {$DEFINE WSTR} +{$ELSE} + {$IFDEF PHP_UNICODE} {$UNDEF PHP_UNICODE} {$ENDIF} +{$ENDIF} + + {$IFDEF VERSION6} {$WARN SYMBOL_PLATFORM OFF} {$IFDEF VERSION7} @@ -214,8 +242,10 @@ Define suitable visual library {$IFDEF VCL} {$UNDEF VCL} {$ENDIF} {$DEFINE LCL} {$ELSE} - {$IFDEF LCL} - {$UNDEF LCL} - {$DEFINE VCL} - {$ENDIF} + {$UNDEF LCL} + {$IFDEF WINDOWS} + {$DEFINE VCL} + {$ELSE} + {$DEFINE KYLIX} + {$ENDIF} {$ENDIF} diff --git a/Source/PHP4DelphiD2006.dpk b/Source/PHP4DelphiD2006.dpk index 35082b9..2ff391a 100644 --- a/Source/PHP4DelphiD2006.dpk +++ b/Source/PHP4DelphiD2006.dpk @@ -30,7 +30,7 @@ package php4DelphiD2006; {$DESIGNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl, designide, @@ -38,11 +38,11 @@ rrequires vclx, php4DelphiR2006; -ocontains +contains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpWeb in 'phpWeb.pas', phpAbout in 'phpAbout.pas' {dlgAbout}; -d. +end. diff --git a/Source/PHP4DelphiD2006.dproj.local b/Source/PHP4DelphiD2006.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/PHP4DelphiD2006.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/PHP4DelphiD2006.stat b/Source/PHP4DelphiD2006.stat deleted file mode 100644 index 2539032..0000000 --- a/Source/PHP4DelphiD2006.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=4 -StartTime=21.09.2018 3:07:34 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index 23b8426..d26fec7 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -22,7 +22,6 @@ interface uses {Windows} SysUtils, - VCL.Dialogs, {$IFDEF FPC} dynlibs {$ELSE} @@ -122,8 +121,8 @@ interface php_ob_handler_used: function (handler_name : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; {$IF not Defined(PHP540) and not Defined(PHP550) and not Defined(PHP560)} php_ob_init_conflict: function (handler_new : zend_pchar; handler_set : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; - {$ENDIF} - {$ENDIF} + {$ifend} + {$endif} //php_output.h @@ -237,7 +236,7 @@ function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals; procedure PHP_FUNCTION(var AFunction : zend_function_entry; AName : zend_pchar; AHandler : pointer); -function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; +function LoadPHP(const LibraryPath: zend_ustr = PHPlp) : boolean; procedure UnloadPHP; @@ -274,7 +273,7 @@ function ValueToFloat(Value : zend_ustr) : extended; {$ELSE} php_body_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; php_header_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; -{$ENDIF} +{$ifend} php_header: function(TSRMLS_D: pointer) : integer; cdecl; php_setcookie: function (name : zend_pchar; name_len : integer; value : zend_pchar; value_len: integer; @@ -433,13 +432,13 @@ procedure php_end_implicit_flush(TSRMLS_D : pointer); {$ENDIF} -function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; +function LoadPHP(const LibraryPath: zend_ustr = PHPlp) : boolean; begin Result := false; if not PHPLoaded then begin - if not LoadZend(DllFileName) then + if not LoadZend(LibraryPath) then Exit; end; @@ -509,29 +508,29 @@ function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; {$ELSE} LFunc(@php_start_ob_buffer, 'php_start_ob_buffer'); - php_start_ob_buffer_named, 'php_start_ob_buffer_named'); + LFunc(@php_start_ob_buffer_named, 'php_start_ob_buffer_named'); - php_end_ob_buffer, 'php_end_ob_buffer'); + LFunc(@php_end_ob_buffer, 'php_end_ob_buffer'); - php_end_ob_buffers, 'php_end_ob_buffers'); + LFunc(@php_end_ob_buffers, 'php_end_ob_buffers'); - php_ob_get_buffer, 'php_ob_get_buffer'); + LFunc(@php_ob_get_buffer, 'php_ob_get_buffer'); - php_ob_get_length, 'php_ob_get_length'); + LFunc(@php_ob_get_length, 'php_ob_get_length'); - php_start_implicit_flush, 'php_start_implicit_flush'); + LFunc(@php_start_implicit_flush, 'php_start_implicit_flush'); - php_end_implicit_flush, 'php_end_implicit_flush'); + LFunc(@php_end_implicit_flush, 'php_end_implicit_flush'); - php_get_output_start_filename, 'php_get_output_start_filename'); + LFunc(@php_get_output_start_filename, 'php_get_output_start_filename'); - php_get_output_start_lineno, 'php_get_output_start_lineno'); + LFunc(@php_get_output_start_lineno, 'php_get_output_start_lineno'); - php_ob_handler_used, 'php_ob_handler_used'); + LFunc(@php_ob_handler_used, 'php_ob_handler_used'); {$ENDIF} {$IF not Defined(PHP540) and not Defined(PHP550) and not Defined(PHP560)} - php_ob_init_conflict, 'php_ob_init_conflict'); - {$ENDIF} + LFunc(@php_ob_init_conflict, 'php_ob_init_conflict'); + {$ifend} LFunc(@php_strtoupper, 'php_strtoupper'); LFunc(@php_strtolower,'php_strtolower'); @@ -586,7 +585,7 @@ function LoadPHP(const DllFileName: zend_ustr = PHPWin) : boolean; {$ELSE} LFunc(@php_body_write, 'php_body_write' ); LFunc(@php_header_write, 'php_header_write'); - {$ENDIF} + {$ifend} {$IFNDEF COMPILER_php7pv} LFunc(@php_log_err, 'php_log_err'); {$ENDIF} @@ -673,6 +672,7 @@ function FloatToValue(Value: Extended): zend_ustr; var c: CharPtr; begin + {$if CompilerVersion > 21} c := FormatSettings.DecimalSeparator; try FormatSettings.DecimalSeparator := '.'; @@ -680,19 +680,38 @@ function FloatToValue(Value: Extended): zend_ustr; finally FormatSettings.DecimalSeparator := c; end; + {$else} + c := DecimalSeparator; + try + DecimalSeparator := '.'; + Result := SysUtils.FormatFloat('0.####', Value); + finally + DecimalSeparator := c; + end; + {$ifend} end; function ValueToFloat(Value : zend_ustr) : extended; var c: CharPtr; begin + {$if CompilerVersion > 21} c := FormatSettings.DecimalSeparator; try FormatSettings.DecimalSeparator := '.'; - Result := SysUtils.StrToFloat(Value); + Result := SysUtils.StrToFloat( Value); finally - FormatSettings.DecimalSeparator := c; + FormatSettings.DecimalSeparator := c; + end; + {$else} + c := DecimalSeparator; + try + DecimalSeparator := '.'; + Result := SysUtils.StrToFloat( Value); + finally + DecimalSeparator := c; end; + {$ifend} end; @@ -714,7 +733,7 @@ function GetPHPVersion: TPHPFileInfo; Result.MinorVersion := 0; Result.Release := 0; Result.Build := 0; - FileName := PHPWin; + FileName := PHPlp; InfoSize := GetFileVersionInfoSize(PWideChar(Filename), Wnd); if InfoSize <> 0 then begin @@ -735,13 +754,13 @@ function GetPHPVersion: TPHPFileInfo; end; {$ENDIF} -initialization {$IFDEF PHP4DELPHI_AUTOLOAD} +initialization LoadPHP; {$ENDIF} -finalization {$IFDEF PHP4DELPHI_AUTOUNLOAD} +finalization UnloadPHP; {$ENDIF} diff --git a/Source/PHPCommon.pas b/Source/PHPCommon.pas index 04369c1..d0a3a41 100644 --- a/Source/PHPCommon.pas +++ b/Source/PHPCommon.pas @@ -19,7 +19,27 @@ interface uses - Windows, Messages, SysUtils, Classes, VCL.Graphics, VCL.Controls, VCL.Forms, VCL.Dialogs, + Windows, Messages, SysUtils, Classes, + {$if CompilerVersion > 21} + VCL.Controls, + VCL.Dialogs, + VCL.Forms, VCL.Graphics, + {$elseif defined(FMX)} + FMX.Controls, + FMX.Dialogs, + FMX.Forms, FMX.Graphics, + {$else} + {$ifdef KYLIX} + QControls, + QDialogs, + QForms, QGraphics, + {$else} + Controls, + Dialogs, + Forms, Graphics, + {$endif} + {$ifend} + ZendTypes, ZendAPI, PHPTypes, PHPAPI; type @@ -274,6 +294,7 @@ function TPHPVariable.GetAsInteger: integer; var c: CharPtr; begin +{$if CompilerVersion > 21} c := FormatSettings.DecimalSeparator; try FormatSettings.DecimalSeparator := '.'; @@ -281,6 +302,15 @@ function TPHPVariable.GetAsInteger: integer; finally FormatSettings.DecimalSeparator := c; end; +{$else} + c := DecimalSeparator; + try + DecimalSeparator := '.'; + Result := Round(ValueToFloat(FValue)); + finally + DecimalSeparator := c; + end; +{$ifend} end; function TPHPVariable.GetDisplayName: string; @@ -308,6 +338,7 @@ procedure TPHPVariable.SetAsInteger(const Value: integer); var c: CharPtr; begin +{$if CompilerVersion > 21} c := FormatSettings.DecimalSeparator; try FormatSettings.DecimalSeparator := '.'; @@ -315,6 +346,15 @@ procedure TPHPVariable.SetAsInteger(const Value: integer); finally FormatSettings.DecimalSeparator := c; end; +{$else} + c := DecimalSeparator; + try + DecimalSeparator := '.'; + FValue := IntToStr(Value); + finally + DecimalSeparator := c; + end; +{$ifend} end; { TPHPConstant } diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 192f6ff..62d0a6c 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -20,8 +20,9 @@ interface uses -VCL.Dialogs, +{$ifdef PHP_UNICODE} WideStrUtils, +{$endif} {$IFDEF FPC} LCLType,LCLIntf,dynlibs,libc{$ELSE}Windows{$ENDIF}, SysUtils, ZendTypes, Variants, PHPTypes; @@ -32,37 +33,22 @@ interface TASDate = array of AnsiString; PASDate = ^TWSDate; const -PHPWin = -{$IFDEF PHP_DEBUG} +PHPlp = {$IFDEF PHP7} - 'php7ts_debug.dll' + 'php7' {$ELSE} - {$IFDEF PHP5} - 'php5ts_debug.dll' + {$IFDEF PHP5} + 'php5' {$ELSE} - 'php4ts_debug.dll' + 'php4' {$ENDIF} - {$ENDIF} +{$ENDIF} +{$IFDEF ZTS} + 'ts' {$ENDIF} +{$IFDEF PHP_DEBUG} + '_debug' {$ENDIF} +{$IFDEF WINDOWS} + + '.dll' {$ELSE} - {$IFDEF PHP5} - {$IFDEF PHP7} - {$IFDEF LINUX} - 'php7ts.so' - {$ENDIF} - {$IFDEF MSWINDOWS} - 'php7ts.dll' - {$ENDIF} - {$ELSE} - {$IFDEF LINUX} - 'php5ts.so' - {$ENDIF} - {$IFDEF MSWINDOWS} - 'php5ts.dll' - {$ENDIF} - {$ENDIF} - {$ELSE} - 'php4ts.dll' - {$ENDIF} + + '.so' {$ENDIF}; type @@ -84,9 +70,14 @@ align_test = record {$IFNDEF PHP_UNICODE} function AnsiFormat(const Format: AnsiString; const Args: array of const): AnsiString; {$ENDIF} +{$ifdef VERSION12} function Lfunc(var Func: Pointer; addr: LPCWSTR): Bool; function HFunc(const Func: Pointer; addr: LPCWSTR): Bool; -function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; +{$else} +function Lfunc(var Func: Pointer; addr: PAnsiChar): BOOL; +function HFunc(const Func: Pointer; addr: PAnsiChar): Bool; +{$endif} +function LoadZEND(const LibraryPath: zend_ustr = PHPlp) : boolean; function __fgsapi(sapi_globals_value:pointer; tsrmls_dc:pointer): Pointer; procedure UnloadZEND; @@ -105,9 +96,11 @@ function ZENDLoaded: boolean; _erealloc : function(ptr: pointer; size: size_t; allow_failure: integer; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint): pointer; cdecl; _estrdup : function(const s: zend_pchar; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint): pointer; cdecl; _estrndup : function(s: zend_pchar; Len: Cardinal; __zend_filename: zend_pchar; __zend_lineno: uint; __zend_orig_filename: zend_pchar; __zend_orig_line_no: uint): zend_pchar; cdecl; + {$ifdef PHP_UNICODE} _estrndupu : function(s: PUTF8Char; Len: Cardinal; __zend_filename: PUTF8Char; __zend_lineno: uint; __zend_orig_filename: PUTF8Char; __zend_orig_line_no: uint): PUTF8Char; cdecl; + {$endif} function emalloc(size: size_t): pointer; procedure efree(ptr: pointer); function ecalloc(nmemb: size_t; size: size_t): pointer; @@ -674,17 +667,17 @@ procedure ZEND_PUTS(str: zend_pchar); zend_startup_modules : function(TSRMLS_DC:pointer):integer; zend_collect_module_handlers : function(TSRMLS_DC:pointer):integer; - procedure ZvalVAL(z:pzval; v:Boolean) overload; - procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG) overload; - procedure ZvalVAL(z:pzval) overload; - procedure ZvalVAL(z:pzval; v:Double) overload; - procedure ZvalVAL(z:pzval; v:SmallInt) overload; - procedure ZvalVAL(z:pzval; v:Extended) overload; + procedure ZvalVAL(z:pzval; v:Boolean); overload; + procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); overload; + procedure ZvalVAL(z:pzval); overload; + procedure ZvalVAL(z:pzval; v:Double); overload; + procedure ZvalVAL(z:pzval; v:SmallInt); overload; + procedure ZvalVAL(z:pzval; v:Extended); overload; procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); overload; - procedure ZvalString(z:pzval) overload; - procedure ZvalString(z:pzval; s:zend_pchar; len:Integer = 0) overload; - procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0) overload; - procedure ZvalString(z:pzval; s:string; len:Integer = 0) overload; + procedure ZvalString(z:pzval); overload; + procedure ZvalString(z:pzval; s:zend_pchar; len:Integer = 0); overload; + procedure ZvalString(z:pzval; s:PWideChar; len:Integer = 0); overload; + procedure ZvalString(z:pzval; s:string; len:Integer = 0); overload; function ZvalArrayAdd(z: pzval; Args: array of const): Integer; overload; function ZvalArrayAdd(z: pzval; idx: Integer; Args: array of const) @@ -718,9 +711,15 @@ function add_assoc_variant(arg: pzval; key: zend_pchar; key_len: uint; value: va procedure ZVAL_ARRAY(z: pzval; arr: TWSDate); overload; procedure ZVAL_ARRAY(z: pzval; arr: TASDate); overload; procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; +{$IFDEF WSTR} procedure ZVAL_ARRAY(z: pzval; arr: array of zend_ustr); overload; +{$ENDIF} procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; +{$if CompilerVersion > 21} procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; +{$else} +procedure ZVAL_ARRAY(z: pzval; arr: array of integer); overload; +{$ifend} procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload; procedure ZVAL_ARRAYAC(z: pzval; keynames: Array of AnsiChar; keyvals: Array of AnsiChar); procedure ZVAL_ARRAYWC(z: pzval; keynames: Array of PWideChar; keyvals: Array of PWideChar); @@ -743,7 +742,9 @@ function ZendToVariant(const Value: pppzval;cobj: TObjectBConvertMethod=nil): Va {$ENDIF} procedure VariantToZend(const Value: Variant; z: pzval; cobj: TObjectAConvertMethod=nil); +{$IFDEF WSTR} procedure ZVAL_RawStr(z: pzval; s:RawByteString; duplicate: boolean); +{$ENDIF} procedure ZVAL_STRING(z: pzval; s: WideString; duplicate: boolean); procedure ZVAL_STRINGU(z: pzval; s: UTF8String; duplicate: boolean); procedure ZVAL_STRINGW(z: pzval; StW: WideString; duplicate: boolean); @@ -757,7 +758,7 @@ procedure zend_copy_constant(c: zend_constant); {$IF defined(PHP540) or defined(PHP550) or defined(PHP560)} procedure zend_copy_constants(target: PHashTable; source: PHashTable); cdecl; procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; -{$ENDIF} +{$IFEND} var get_zend_version : function(): zend_pchar; cdecl; @@ -769,7 +770,7 @@ procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; {$IFDEF PHP5} {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} zend_copy_constants: procedure(target: PHashTable; source: PHashTable); cdecl; - {$ENDIF} + {$IFEND} zend_objects_new : function (_object : pointer; class_type : pointer; TSRMLS_DC : pointer) : {$IFDEF PHP7}zend_object{$ELSE}_zend_object_value{$ENDIF}; cdecl; zend_objects_clone_obj: function(_object: pzval; TSRMLS_DC : pointer): {$IFDEF PHP7}zend_object{$ELSE}_zend_object_value{$ENDIF}; cdecl; zend_objects_store_add_ref: procedure (_object : pzval; TSRMLS_DC : pointer); cdecl; @@ -778,7 +779,7 @@ procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; function_add_ref: procedure (func: {$IFDEF PHP7}Pzend_function{$ELSE}PZendFunction{$ENDIF}); cdecl; {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} zend_class_add_ref: procedure(aclass: Ppzend_class_entry); cdecl; - {$ENDIF} + {$IFEND} {$ENDIF} @@ -826,16 +827,24 @@ function object_init(arg: pzval; ce: pzend_class_entry; TSRMLS_DC : pointer) : i function Z_LVAL(z : Pzval) : longint; function Z_BVAL(z : Pzval) : boolean; function Z_DVAL(z : Pzval) : double; +{$ifdef WSTR} function Z_RAWSTR(z: PZval): RawByteString; +{$else} +function Z_RAWSTR(z: PZval): TBytes; +{$endif} + function Z_STRVAL(z : Pzval) : WideString; function Z_ASTRVAL(z : Pzval) : AnsiString; function Z_STRUVAL(z : PZval): UTF8String; -function Z_WSTRVAL(z : pzval) : String; +function Z_SSTRVAL(z : pzval) : String; function Z_CHAR(z: PZval) : zend_uchar; function Z_WCHAR(z: PZval) : WideChar; function Z_ACHAR(z: PZVAL): AnsiChar; +{$ifdef WSTR} function Z_UCHAR(z: PZVAL): UTF8Char; - +{$else} +function Z_UCHAR(z: PZVAL): AnsiChar; +{$endif} function Z_STRLEN(z : Pzval) : longint; function Z_ARRVAL(z : Pzval ) : PHashTable; function Z_OBJ_HANDLE(z :Pzval) : {$IFDEF PHP7} P_zend_object_handlers {$ELSE} zend_object_handle{$ENDIF}; @@ -891,6 +900,7 @@ function estrndup(s: zend_pchar; len: Cardinal): zend_pchar; else Result := nil; end; +{$ifdef PHP_UNICODE} function estrndupu(s: PUtf8Char; len: Cardinal): PUTf8Char; begin if assigned(s) then @@ -898,6 +908,7 @@ function estrndupu(s: PUtf8Char; len: Cardinal): PUTf8Char; else Result := nil; end; +{$endif} function emalloc(size: size_t): pointer; begin Result := _emalloc(size, nil, 0, nil, 0); @@ -1021,7 +1032,7 @@ procedure ZvalString(z:pzval; s:string; len:Integer = 0); ZvalString(z, _s, len); end; -procedure ZvalVAL(z:pzval; v:Boolean); +procedure ZvalVAL(z:pzval; v:Boolean); overload; Begin {$IFDEF PHP7} z^.u1.v._type @@ -1031,7 +1042,7 @@ procedure ZvalVAL(z:pzval; v:Boolean); z.value.lval := integer(v); End; -procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); +procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); overload; Begin {$IFDEF PHP7} z^.u1.v._type @@ -1041,7 +1052,7 @@ procedure ZvalVAL(z:pzval; v:Integer; const _type:Integer = IS_LONG); z^.value.lval := v; End; -procedure ZvalVAL(z:pzval); +procedure ZvalVAL(z:pzval); overload; Begin {$IFDEF PHP7} z^.u1.v._type @@ -1050,7 +1061,7 @@ procedure ZvalVAL(z:pzval); {$ENDIF} := IS_NULL; End; -procedure ZvalVAL(z:pzval; v:Double); +procedure ZvalVAL(z:pzval; v:Double); overload; Begin {$IFDEF PHP7} z^.u1.v._type @@ -1060,7 +1071,7 @@ procedure ZvalVAL(z:pzval; v:Double); z.value.dval := v; End; -procedure ZvalVAL(z:pzval; v:SmallInt); +procedure ZvalVAL(z:pzval; v:SmallInt); overload; begin {$IFDEF PHP7} z^.u1.v._type @@ -1070,7 +1081,7 @@ procedure ZvalVAL(z:pzval; v:SmallInt); z^.value.lval := v; end; -procedure ZvalVAL(z:pzval; v:Extended); +procedure ZvalVAL(z:pzval; v:Extended); overload; Begin {$IFDEF PHP7} z^.u1.v._type @@ -1080,7 +1091,7 @@ procedure ZvalVAL(z:pzval; v:Extended); z.value.dval := v; End; -procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); +procedure ZvalVAL(z: pzval; s: zend_ustr; len: Integer = 0); overload; var lens: Integer; AChar: zend_pchar; @@ -1294,9 +1305,14 @@ procedure MAKE_STD_ZVAL(out Result: pzval); -function GetArgPZval; +function GetArgPZval(Args: TVarRec; const _type: Integer = IS_LONG; + Make: Boolean = false): pzval; begin + {$if CompilerVersion > 21} if Args._Reserved1 = 0 then // nil + {$else} + if Integer(Args.VPointer) = 0 then + {$ifend} begin if Make then MAKE_STD_ZVAL(Result); @@ -1317,14 +1333,27 @@ function GetArgPZval; ZvalVAL(Result, Args.VBoolean); vtExtended: ZvalVAL(Result, Args.VExtended^); + {$if CompilerVersion > 21} vtClass, vtObject: ZvalVAL(Result, Args._Reserved1); + {$else} + vtClass: + ZvalVAL(Result, Integer(Args.VClass)); + vtObject: + ZvalVAL(Result, Integer(Args.VObject)); + {$ifend} vtString: ZvalVAL(Result, zend_ustr(Args.VString^)); vtAnsiString: ZvalVAL(Result, zend_pchar(zend_ustr(Args.VAnsiString))); + {$ifdef WSTR} vtUnicodeString: + {$if CompilerVersion > 21} ZvalVAL(Result, UnicodeString(Args._Reserved1)); + {$else} + ZvalVal(Result, UnicodeString(Args.VUnicodeString)); + {$ifend} + {$endif} vtWideChar: ZvalVAL(Result, zend_pchar(Args.VWideChar)); vtChar: @@ -1339,7 +1368,7 @@ function GetArgPZval; end; end; - +{$ifdef WSTR} procedure ZVAL_STRINGU(z: pzval; s: UTF8String; duplicate: boolean); var sc: PUTF8Char; @@ -1361,19 +1390,21 @@ procedure ZVAL_RawStr(z: pzval; s: RawByteString; duplicate: boolean); SetCodePage(_s, CP_UTF8, not IsUTF8String(_s)); ZVAL_STRINGU(z, UTF8String(_s), duplicate); end; +{$endif} procedure ZVAL_STRING(z: pzval; s: WideString; duplicate: boolean); begin ZVAL_STRINGU(z, UTF8String(s), duplicate); end; + procedure ZVAL_STRINGW(z: pzval; StW: WideString; duplicate: boolean); var St: UTF8String; sc: PUTF8Char; begin - St := UTF8String(StW); sc := PUtf8Char(St); + z^.value.str.len := Length(St); if duplicate then z^.value.str.val := estrndup(sc, z^.value.str.len) @@ -1546,10 +1577,10 @@ procedure VariantToZend(const Value:Variant;z:pzval; ZVAL_STRING(z, '', true); end; end; - + {$ifdef VERSION12} varUString : ZVAL_RawStr(z, RawByteString(TVarData(Value).VUString), true); - + {$endif} varOleStr : begin if Assigned ( TVarData(Value).VOleStr ) then @@ -1592,6 +1623,7 @@ procedure VariantToZend(const Value:Variant;z:pzval; end; //varRecord : integer(TVarData(Value).VRecord) //<==... RTTI + {$if CompilerVersion > 21} varRecord : begin if Assigned(cobj) then @@ -1599,6 +1631,7 @@ procedure VariantToZend(const Value:Variant;z:pzval; else ZVALVAL(z); end; + //varObject : integer(TVarData(Value).VObject) //<==... varObject : @@ -1608,6 +1641,8 @@ procedure VariantToZend(const Value:Variant;z:pzval; else ZVALVAL(z, integer(TObject(TVarData(Value).VPointer^))); end; + {$ifend} + varStrArg : begin if Assigned ( TVarData(Value).VString ) then @@ -1619,10 +1654,13 @@ procedure VariantToZend(const Value:Variant;z:pzval; ZVAL_STRING(z, '', true); end; end; - + {$if CompilerVersion > 21} varUStrArg : ZVAL_RawStr(z, RawByteString(TVarData(Value).VUString), true); + {$ifend} varInt64 : ZVALVAL(z, TVarData(Value).VInt64); + {$ifdef VERSION14} varUInt64 : ZVALVAL(z, TVarData(Value).VUInt64); + {$endif} varShortInt : ZVALVAL(z, Integer(TVarData(Value).VShortInt)); varSmallInt : ZVALVAL(z, Integer(TVarData(Value).VSmallint)); varInteger : ZVALVAL(z, TVarData(Value).VInteger); @@ -1816,7 +1854,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of string); overload; end; Exit; end; - +{$ifdef WSTR} procedure ZVAL_ARRAY(z: pzval; arr: array of zend_ustr); overload; var i: integer; @@ -1843,6 +1881,7 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of zend_ustr); overload; end; Exit; end; +{$endif} procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; var @@ -1870,7 +1909,12 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; end; Exit; end; + +{$ifdef VERSION14} procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; +{$else} +procedure ZVAL_ARRAY(z: pzval; arr: array of integer); overload; +{$endif} var i: integer; begin @@ -2149,7 +2193,12 @@ procedure UnloadZEND; FreeLibrary(H); end; end; + +{$ifdef VERSION12} function Lfunc(var Func: Pointer; addr: LPCWSTR): BOOL; +{$else} +function Lfunc(var Func: Pointer; addr: PAnsiChar): BOOL; +{$endif} begin Result := True; Func := GetProcAddress(PHPLib, addr); @@ -2161,7 +2210,11 @@ function Lfunc(var Func: Pointer; addr: LPCWSTR): BOOL; Result := False; end; end; +{$ifdef VERSION12} function HFunc(const Func: Pointer; addr: LPCWSTR): BOOL; +{$else} +function HFunc(const Func: Pointer; addr: PAnsiChar): Bool; +{$endif} var fr: FARPROC; begin Result := True; @@ -2197,16 +2250,19 @@ procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; begin Inc(aclass^.refcount,1); end; -{$ENDIF} -function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; +{$IFEND} +function LoadZEND(const LibraryPath: zend_ustr = PHPlp) : boolean; var WriteFuncPtr : pointer; begin {$IFDEF QUIET_LOAD} Result := false; {$ENDIF} - PHPLib := LoadLibrary( PWideChar(WideString(DllFilename)) ); - + {$if CompilerVersion >= 20} + PHPLib := LoadLibrary( PWideChar(WideString(LibraryPath)) ); + {$else} + PHPLib := LoadLibrary( String( LibraryPath ) ); + {$ifend} {$IFNDEF QUIET_LOAD} if PHPLib = 0 then begin @@ -2220,13 +2276,13 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$IFDEF PHP5} {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} LFunc(@zend_copy_constants, 'zend_copy_constants'); - {$ENDIF} + {$IFEND} LFunc(@zend_objects_new, 'zend_objects_new'); LFunc(@zend_objects_clone_obj, 'zend_objects_clone_obj'); LFunc(@function_add_ref, 'function_add_ref'); {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} LFunc(@zend_class_add_ref, 'zend_class_add_ref'); - {$ENDIF} + {$IFEND} LFunc(@zend_objects_store_add_ref, 'zend_objects_store_add_ref'); LFunc(@zend_objects_store_del_ref, 'zend_objects_store_del_ref'); @@ -2327,6 +2383,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; '_estrndup@@8' {$ENDIF}); + {$ifdef PHP_UNICODE} // -- _estrndup Unicode LFunc(@_estrndupu, {$IFNDEF PHP7} @@ -2334,6 +2391,7 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean; {$ELSE} '_estrndup@@8' {$ENDIF}); + {$endif} // -- zend_set_memory_limit LFunc(@zend_set_memory_limit, 'zend_set_memory_limit'); @@ -3469,7 +3527,21 @@ function Z_VARREC(z: pzval): TVarRec; end; end; end; -function Z_RawStr(z: pzval): RawByteString; +{$ifndef WSTR} +function RawByteString(s: String): TBytes; overload; +begin + +end; + +function RawByteString(s: PAnsiChar): TBytes; overload; +begin + +end; + +function Z_RAWSTR(z: pzval): TBytes; +{$else} +function Z_RAWSTR(z: pzval): RawByteString; +{$endif} {$ifdef fpc} var s_len: SizeInt; @@ -3485,7 +3557,7 @@ function Z_RawStr(z: pzval): RawByteString; Result := RawByteString('False'); end; IS_LONG: - Result := RawByteString(inttostr(z^.value.lval)); + Result := RawByteString(IntToStr(z^.value.lval)); IS_DOUBLE: Result := RawByteString(FloatToStr(z^.value.dval)); IS_STRING: @@ -3516,7 +3588,7 @@ function Z_ASTRVAL(z : pzval) : AnsiString; Result := AnsiString(Z_RawStr(z)); end; -function Z_WSTRVAL(z : pzval) : String; +function Z_SSTRVAL(z : pzval) : String; begin Result := String(Z_RawStr(z)); end; @@ -3576,6 +3648,7 @@ function Z_WCHAR(z: PZVAL): WideChar; SetLength(S,1); Result := WideChar(S[1]); end; +{$ifdef WSTR} function Z_UCHAR(z: PZVAL): UTF8Char; var S: UTF8String; begin @@ -3594,6 +3667,12 @@ function Z_UCHAR(z: PZVAL): UTF8Char; SetLength(S,1); Result := Utf8Char(S[1]); end; +{$else} +function Z_UCHAR(z: PZVAL): AnsiChar; +begin + Result := Z_ACHAR(z); +end; +{$endif} function Z_STRLEN(z : pzval) : longint; begin @@ -3703,13 +3782,13 @@ function DupStr(strSource : zend_pchar) : zend_pchar; cdecl; end; {$ENDIF} -initialization {$IFDEF PHP4DELPHI_AUTOLOAD} +initialization LoadZEND; {$ENDIF} -finalization {$IFDEF PHP4DELPHI_AUTOUNLOAD} +finalization UnloadZEND; {$ENDIF} diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index dcc97c5..63588f9 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -16,7 +16,7 @@ interface uses - {$IFNDEF FPC} Windows {$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7} hzend_types, {$ENDIF} SysUtils; + {$IFNDEF FPC} Windows {$ELSE} LCLType{$ENDIF}, SysUtils; const //zend.h @@ -340,47 +340,36 @@ interface //zend_modules.h const -{$IFDEF PHP7} - ZEND_MODULE_API_NO = 20151012; -{$ELSE} - {$IFDEF PHP530} - ZEND_MODULE_API_NO = - {$IFDEF PHP560} - 20131226 - {$ELSE} - {$IFDEF PHP550}20121212{$ELSE}{$IFDEF PHP540}20100525{$ELSE}20090626{$ENDIF}{$ENDIF} - {$ENDIF}; - {$ELSE} - {$IFDEF PHP520} - ZEND_MODULE_API_NO = 20060613; - {$ELSE} - {$IFDEF PHP512} - ZEND_MODULE_API_NO = 20050922; - {$ELSE} - {$IFDEF PHP511} - ZEND_MODULE_API_NO = 20050922; - {$ELSE} - {$IFDEF PHP510} - ZEND_MODULE_API_NO = 20050617; - {$ELSE} - {$IFDEF PHP504} - ZEND_MODULE_API_NO = 20041030; - {$ELSE} - ZEND_MODULE_API_NO = 20040412; - {$ENDIF} - {$ENDIF} - {$ENDIF} - {$ENDIF} - {$ENDIF} -{$ENDIF} -{$ENDIF} -{$IFDEF ZTS} -const - USING_ZTS = 1; -{$ELSE} + ZEND_MODULE_API_NO_700 = 20151012; + ZEND_MODULE_API_NO_560 = 20131226; + ZEND_MODULE_API_NO_550 = 20121212; + ZEND_MODULE_API_NO_540 = 20100525; + ZEND_MODULE_API_NO_530 = 20090626; + ZEND_MODULE_API_NO_520 = 20060613; + ZEND_MODULE_API_NO_511 = 20050922; + ZEND_MODULE_API_NO_510 = 20050617; + ZEND_MODULE_API_NO_504 = 20041030; + ZEND_MODULE_API_NO_500 = 20040412; + + ZEND_MODULE_API_NO = + {$ifdef PHP700}20151012 + {$elseif defined(PHP560)}20131226 + {$elseif defined(PHP550)}20121212 + {$elseif defined(PHP540)}20100525 + {$elseif defined(PHP530)}20090626 + {$elseif defined(PHP520)}20060613 + {$elseif defined(PHP512)}20050922 + {$elseif defined(PHP511)}20050922 + {$elseif defined(PHP510)}20050617 + {$elseif defined(PHP504)}20041030 + {$else}20040412 + {$ifend}; + const - USING_ZTS = 0; -{$ENDIF} + USING_ZTS = + {$ifdef ZTS}1 + {$else}0 + {$endif}; const @@ -493,14 +482,18 @@ interface UIntPtr = LongWord; ULongPtr = ULong; {$ENDIF} + {$if defined(WSTR) and (CompilerVersion < 22) } + UTF8Char = AnsiChar; + PUTF8Char = PAnsiChar; + {$ifend} zend_uint = UIntPtr; zend_bool = boolean; - zend_uchar = {$IF Defined(PHP_UNICODE)}Utf8Char{$ELSE}AnsiChar{$ENDIF}; - zend_ustr = {$IF Defined(PHP_UNICODE)}UTF8String{$ELSE}AnsiString{$ENDIF}; + zend_uchar = {$IFDEF PHP_UNICODE}UTF8Char{$ELSE}AnsiChar{$ENDIF}; + zend_ustr = {$IFDEF PHP_UNICODE}UTF8String{$ELSE}AnsiString{$ENDIF}; zend_ulong = ULongPtr; zend_long = IntPtr; - zend_pchar = {$IF Defined(PHP_UNICODE)}PUtf8Char{$ELSE}PAnsiChar{$ENDIF}; - zend_pstr = {$IF Defined(PHP_UNICODE)}PUtf8String{$ELSE}PAnsiString{$ENDIF}; + zend_pchar = {$IFDEF PHP_UNICODE}PUTF8Char{$ELSE}PAnsiChar{$ENDIF}; + zend_pstr = {$IFDEF PHP_UNICODE}PUtf8String{$ELSE}PAnsiString{$ENDIF}; {$IFDEF PHP7} _zend_refcounted_h = record refcount : cardinal; @@ -1077,7 +1070,7 @@ _zend_stream = record _type : zend_stream_type; {$ELSE} _type: uchar; - {$ENDIF} + {$IFEND} filename: zend_pchar; opened_path: zend_pchar; handle: diff --git a/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local b/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local deleted file mode 100644 index 744d98c..0000000 --- a/Source/packages/php4delphi Delphi 10 Seattle.groupproj.local +++ /dev/null @@ -1,12 +0,0 @@ - - - - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local b/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local deleted file mode 100644 index dbd6596..0000000 --- a/Source/packages/php4delphi Delphi 10.1 Berlin.groupproj.local +++ /dev/null @@ -1,11 +0,0 @@ - - - - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local b/Source/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local deleted file mode 100644 index 35948ce..0000000 --- a/Source/packages/php4delphi Delphi 10.2 Tokyo.groupproj.local +++ /dev/null @@ -1,13 +0,0 @@ - - - - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi 2010.groupproj.local b/Source/packages/php4delphi Delphi 2010.groupproj.local deleted file mode 100644 index ce4c03c..0000000 --- a/Source/packages/php4delphi Delphi 2010.groupproj.local +++ /dev/null @@ -1,23 +0,0 @@ - - - - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj - 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj - 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj - 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj - 2019.03.04 22:32:46.928,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj - 2019.03.04 22:32:52.359,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj - 2019.03.04 22:32:58.134,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE8.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj - 2019.03.04 22:33:22.418,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 2011.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE8.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi 2011.groupproj.local b/Source/packages/php4delphi Delphi 2011.groupproj.local deleted file mode 100644 index c2c593f..0000000 --- a/Source/packages/php4delphi Delphi 2011.groupproj.local +++ /dev/null @@ -1,22 +0,0 @@ - - - - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj - 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj - 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj - 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj - 2019.03.04 22:32:46.928,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj - 2019.03.04 22:32:52.359,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj - 2019.03.04 22:32:58.134,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE8.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi 5.bpg b/Source/packages/php4delphi Delphi 5.bpg new file mode 100644 index 0000000..aa42dc7 --- /dev/null +++ b/Source/packages/php4delphi Delphi 5.bpg @@ -0,0 +1,23 @@ +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = php4DelphiR5.bpl php4DelphiD5.bpl +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +php4DelphiR5.bpl: ..\php4DelphiR5.dpk + $(DCC) + +php4DelphiD5.bpl: ..\php4DelphiD5.dpk + $(DCC) + + diff --git a/Source/packages/php4delphi Delphi 7.bpg b/Source/packages/php4delphi Delphi 7.bpg new file mode 100644 index 0000000..dce47b4 --- /dev/null +++ b/Source/packages/php4delphi Delphi 7.bpg @@ -0,0 +1,23 @@ +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = php4DelphiR7.bpl php4DelphiD7.bpl +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +php4DelphiR7.bpl: ..\php4DelphiR7.dpk + $(DCC) + +php4DelphiD7.bpl: ..\php4DelphiD7.dpk + $(DCC) + + diff --git a/Source/packages/php4delphi Delphi XE1.groupproj.local b/Source/packages/php4delphi Delphi XE1.groupproj.local deleted file mode 100644 index 730de94..0000000 --- a/Source/packages/php4delphi Delphi XE1.groupproj.local +++ /dev/null @@ -1,14 +0,0 @@ - - - - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi XE2.groupproj.local b/Source/packages/php4delphi Delphi XE2.groupproj.local deleted file mode 100644 index c62f4a8..0000000 --- a/Source/packages/php4delphi Delphi XE2.groupproj.local +++ /dev/null @@ -1,15 +0,0 @@ - - - - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi XE3.groupproj.local b/Source/packages/php4delphi Delphi XE3.groupproj.local deleted file mode 100644 index 5380455..0000000 --- a/Source/packages/php4delphi Delphi XE3.groupproj.local +++ /dev/null @@ -1,16 +0,0 @@ - - - - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi XE4.groupproj.local b/Source/packages/php4delphi Delphi XE4.groupproj.local deleted file mode 100644 index a7c375a..0000000 --- a/Source/packages/php4delphi Delphi XE4.groupproj.local +++ /dev/null @@ -1,17 +0,0 @@ - - - - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj - 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi XE5.groupproj.local b/Source/packages/php4delphi Delphi XE5.groupproj.local deleted file mode 100644 index 47e6273..0000000 --- a/Source/packages/php4delphi Delphi XE5.groupproj.local +++ /dev/null @@ -1,18 +0,0 @@ - - - - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj - 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj - 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi XE6.groupproj.local b/Source/packages/php4delphi Delphi XE6.groupproj.local deleted file mode 100644 index 2c6ab26..0000000 --- a/Source/packages/php4delphi Delphi XE6.groupproj.local +++ /dev/null @@ -1,19 +0,0 @@ - - - - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj - 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj - 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj - 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi XE7.groupproj.local b/Source/packages/php4delphi Delphi XE7.groupproj.local deleted file mode 100644 index 9691c31..0000000 --- a/Source/packages/php4delphi Delphi XE7.groupproj.local +++ /dev/null @@ -1,20 +0,0 @@ - - - - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj - 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj - 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj - 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj - 2019.03.04 22:32:46.928,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj - - - - - diff --git a/Source/packages/php4delphi Delphi XE8.groupproj.local b/Source/packages/php4delphi Delphi XE8.groupproj.local deleted file mode 100644 index fded362..0000000 --- a/Source/packages/php4delphi Delphi XE8.groupproj.local +++ /dev/null @@ -1,21 +0,0 @@ - - - - 1899.12.30 00:00:00.000.047,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10 Seattle.groupproj - 1899.12.30 00:00:00.000.717,C:\Users\Andrew\Documents\GitHub\php4delphi\ProjectGroup1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj - 1899.12.30 00:00:00.000.086,C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi2010.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi 10 Seattle.groupproj - 2019.03.04 22:31:53.120,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:03.207,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.1 Berlin.groupproj - 2019.03.04 22:32:09.673,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10 Seattle.groupproj - 2019.03.04 22:32:17.131,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi 10.2 Tokyo.groupproj - 2019.03.04 22:32:22.720,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE1.groupproj - 2019.03.04 22:32:29.457,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE2.groupproj - 2019.03.04 22:32:34.993,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE3.groupproj - 2019.03.04 22:32:41.465,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE4.groupproj - 2019.03.04 22:32:46.928,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE5.groupproj - 2019.03.04 22:32:52.359,C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE7.groupproj=C:\Users\Andrew\Documents\GitHub\php4delphi\packages\php4delphi Delphi XE6.groupproj - - - - - diff --git a/Source/php4App.dproj.local b/Source/php4App.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4App.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4App.identcache b/Source/php4App.identcache deleted file mode 100644 index 303be0800985cc7e22649d7940d5f7d672a24a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47 qcmZQ%U|^7Qwu(t9E>4Xp$S5#LNzEz9$OJPT3kvj73W|U#-~a$Qs|#ZQ diff --git a/Source/php4App.stat b/Source/php4App.stat deleted file mode 100644 index fd9c33f..0000000 --- a/Source/php4App.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=3 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=724 -OtherSecs=68 -StartTime=21.09.2018 13:22:04 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4AppUnit.pas b/Source/php4AppUnit.pas index b2b78c1..5e6feee 100644 --- a/Source/php4AppUnit.pas +++ b/Source/php4AppUnit.pas @@ -217,10 +217,6 @@ procedure PrepareResult(RequestID : integer; TSRMLS_D : pointer); data: ^ppzval; cnt : integer; InfoBlock : TPHPInfoBlock; - {$IFDEF PHP5} - EG : pzend_executor_globals; - {$ENDIF} - begin InfoBlock := TPHPInfoBlock(RequestID); ht := GetSymbolsTable; @@ -713,7 +709,7 @@ procedure StopEngine; sapi_shutdown; {$IF not Defined(PHP550) and not Defined(PHP560)} tsrm_shutdown(); - {$ENDIF} + {$ifend} except end; end; diff --git a/Source/php4Applications/PHP 4.4.6/php4App.dll b/Source/php4Applications/PHP 4.4.6/php4App.dll deleted file mode 100644 index 9ed7aae13e758078b2a32fe309d14496fc7ee2de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130560 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

>OxHsW$3p@T_rJw-hiSR#Zqvi2Cr!^_ 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 diff --git a/Source/php4Applications/PHP 5.3.0/php4App.dll b/Source/php4Applications/PHP 5.3.0/php4App.dll deleted file mode 100644 index 2efba3b2800a05157f96211c84dacaadaa3fff8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135168 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

=dUG|zK|&3VZN*+_(L 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 diff --git a/Source/php4Applications/PHP511/php4App.dll b/Source/php4Applications/PHP511/php4App.dll deleted file mode 100644 index d02c89182caa73741870896bf47ab1900f9fb6cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119808 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%0Dk^9FTI~Gi_kD7tVVy%hlAQ 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 RqMnxc6$SXu@4rC{{0|4tFYW*U diff --git a/Source/php4Applications/PHP512/php4App.dll b/Source/php4Applications/PHP512/php4App.dll deleted file mode 100644 index aa4ea5bfda664db36971774a6dcc4577f38adb09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37888 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 - diff --git a/Source/php4DelphiD2005.stat b/Source/php4DelphiD2005.stat deleted file mode 100644 index 9ec5214..0000000 --- a/Source/php4DelphiD2005.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=3 -StartTime=21.09.2018 3:07:29 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiD2007.dpk b/Source/php4DelphiD2007.dpk index 1810861..c112701 100644 --- a/Source/php4DelphiD2007.dpk +++ b/Source/php4DelphiD2007.dpk @@ -30,7 +30,7 @@ package php4DelphiD2007; {$DESIGNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl, designide, @@ -38,11 +38,11 @@ rrequires vclx, php4DelphiR2007; -ocontains +contains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpWeb in 'phpWeb.pas', phpAbout in 'phpAbout.pas' {dlgAbout}; -d. +end. diff --git a/Source/php4DelphiD2007.dproj.local b/Source/php4DelphiD2007.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiD2007.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiD2007.stat b/Source/php4DelphiD2007.stat deleted file mode 100644 index 6bfe8ad..0000000 --- a/Source/php4DelphiD2007.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=3 -StartTime=21.09.2018 3:07:40 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiD2009.dpk b/Source/php4DelphiD2009.dpk index d9f82a3..3627877 100644 --- a/Source/php4DelphiD2009.dpk +++ b/Source/php4DelphiD2009.dpk @@ -1,7 +1,6 @@ package php4DelphiD2009; {$R *.res} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -12,24 +11,22 @@ package php4DelphiD2009; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION OFF} +{$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} -{$REFERENCEINFO ON} +{$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} -{$STACKFRAMES ON} +{$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (design-time)'} {$DESIGNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl, designide, @@ -37,11 +34,11 @@ rrequires vclx, php4DelphiR2009; -ocontains +contains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpWeb in 'phpWeb.pas', phpAbout in 'phpAbout.pas' {dlgAbout}; -d. +end. diff --git a/Source/php4DelphiD2009.dproj b/Source/php4DelphiD2009.dproj index 440917d..f096ad0 100644 --- a/Source/php4DelphiD2009.dproj +++ b/Source/php4DelphiD2009.dproj @@ -1,123 +1,131 @@ - - - {65B66BBA-1F79-4212-AC10-21298E0BC3B0} - php4DelphiD2009.dpk - True - Debug - 1 - Package - VCL - 18.2 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - 00400000 - false - 1 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - 1058 - true - php4DelphiD2009 - false - false - false - true - true - php4Delphi (design-time) - false - true - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - - - android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - - - true - php4DelphiD2009_Icon.ico - 1033 - Debug - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - - - php4DelphiD2009_Icon.ico - - - RELEASE;$(DCC_Define) - false - 0 - 0 - - - DEBUG;$(DCC_Define) - true - false - - - - MainSource - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - Package - - - - php4DelphiD2009.dpk - - - - False - False - False - True - False - - - 12 - - - - + + + {65B66BBA-1F79-4212-AC10-21298E0BC3B0} + php4DelphiD2009.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + 0 + ..\..\..\..\Public\Documents\RAD Studio\6.0\Bpl\php4DelphiD2009.bpl + 00400000 + false + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + 1058 + true + php4DelphiD2009 + false + false + false + true + true + php4Delphi (design-time) + false + true + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + + + RELEASE;$(DCC_Define) + false + 0 + 0 + + + DEBUG;$(DCC_Define) + true + false + + + + MainSource + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + php4DelphiD2009.dpk + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1058 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + False + False + False + True + False + + + 12 + + diff --git a/Source/php4DelphiD2009.dproj.local b/Source/php4DelphiD2009.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiD2009.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiD2009.stat b/Source/php4DelphiD2009.stat deleted file mode 100644 index 7cf7048..0000000 --- a/Source/php4DelphiD2009.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=3 -StartTime=21.09.2018 13:22:02 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiD2010.dpk b/Source/php4DelphiD2010.dpk index 6d19017..f322623 100644 --- a/Source/php4DelphiD2010.dpk +++ b/Source/php4DelphiD2010.dpk @@ -34,27 +34,15 @@ requires vcl, designide, vclactnband, - vclx; + vclx, + php4DelphiR2010; contains PHPProjectWizard in 'PHPProjectWizard.pas', - { Components Requirements } - DelphiFunctions in 'DelphiFunctions.pas', - phpLibrary in 'phpLibrary.pas', - PHPCommon in 'phpCommon.pas', - phpFunctions in 'phpFunctions.pas', - ZENDTypes in 'ZENDTypes.pas', - phpClass in 'phpClass.pas', - php4delphi in 'php4delphi.pas', - phpModules in 'phpModules.pas', - phpAPI in 'phpAPI.pas', - ZENDAPI in 'ZENDAPI.pas', - PHPTypes in 'PHPTypes.pas', - { Components Requirements } php4DelphiReg in 'php4DelphiReg.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpWeb in 'phpWeb.pas', - phpAbout in 'phpAbout.pas' { dlgAbout }; + phpAbout in 'phpAbout.pas' {dlgAbout}; end. diff --git a/Source/php4DelphiD2010.dproj.local b/Source/php4DelphiD2010.dproj.local deleted file mode 100644 index a169e93..0000000 --- a/Source/php4DelphiD2010.dproj.local +++ /dev/null @@ -1,6 +0,0 @@ - - - - 1899.12.30 00:00:00.000.520,D:\переустановил\Рабочий стол 08.07.4016\soulengine-5554e3db061d08b94f439be26ed071a74c30071c\php4delphi\php4DelphiD2010.dproj=D:\переустановил\Рабочий стол 08.07.4016\soulengine-5554e3db061d08b94f439be26ed071a74c30071c\php4delphi\php4DelphiD2010.dproj - - diff --git a/Source/php4DelphiD2010.identcache b/Source/php4DelphiD2010.identcache deleted file mode 100644 index 4f6504a0b4d282d4dec9190c7477d605440ffac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 zcmb`H$qs@r6h-+2zr>X*93lY~6EwsjB&HjN7pVc-bTGlM7tpvUxM;P@w>Y`)zLSnD z%W_;BojEX$0=OfOq_TucaJ0d~mkFXdon%nZ9HS$VEQN03b&~^J$28^*nN0 z0sJ4RcT^QM)lGF-?L8;ls+^fFr)keEV&2=$HULGCsChhHOz4LpBR5DzgdZ`>RG`WE z0-Ugz)hf!>&GvF?Evr;uQuQjE>+;$go@&|`%jAkqLZnbvTUP>SHF6F1{lgD4;QSL>A%d6y diff --git a/Source/php4DelphiD2010.stat b/Source/php4DelphiD2010.stat deleted file mode 100644 index 7701441..0000000 --- a/Source/php4DelphiD2010.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=240 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=45492 -OtherSecs=256 -StartTime=04.03.2019 21:55:53 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiD5.dproj.local b/Source/php4DelphiD5.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiD5.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiD5.stat b/Source/php4DelphiD5.stat deleted file mode 100644 index 3137e8d..0000000 --- a/Source/php4DelphiD5.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=80 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=8334 -OtherSecs=82 -StartTime=21.09.2018 3:07:20 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiD6.dpk b/Source/php4DelphiD6.dpk index fb713db..a1312f7 100644 --- a/Source/php4DelphiD6.dpk +++ b/Source/php4DelphiD6.dpk @@ -30,16 +30,17 @@ package php4DelphiD6; {$DESIGNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, + vcl, designide, php4DelphiR6; -ocontains +contains PHPProjectWizard in 'PHPProjectWizard.pas', php4DelphiReg in 'php4DelphiReg.pas', phpWeb in 'phpWeb.pas', php4DelphiWeb in 'php4DelphiWeb.pas', phpAbout in 'phpAbout.pas' {dlgAbout}; -d. +end. diff --git a/Source/php4DelphiD6.dproj.local b/Source/php4DelphiD6.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiD6.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiD6.stat b/Source/php4DelphiD6.stat deleted file mode 100644 index 5f3a5ae..0000000 --- a/Source/php4DelphiD6.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=2 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=3 -StartTime=21.09.2018 3:07:24 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiD7.cfg b/Source/php4DelphiD7.cfg new file mode 100644 index 0000000..290f5ea --- /dev/null +++ b/Source/php4DelphiD7.cfg @@ -0,0 +1,40 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W+ +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"c:\program files (x86)\borland\delphi7\Projects\Bpl" +-LN"c:\program files (x86)\borland\delphi7\Projects\Bpl" +-DDEBUG +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/Source/php4DelphiD7.dof b/Source/php4DelphiD7.dof new file mode 100644 index 0000000..bc67b09 --- /dev/null +++ b/Source/php4DelphiD7.dof @@ -0,0 +1,136 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=0 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=1 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=php4Delphi (design-time) +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals=DEBUG +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1058 +CodePage=1251 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= diff --git a/Source/php4DelphiD7.dproj.local b/Source/php4DelphiD7.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiD7.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiD7.stat b/Source/php4DelphiD7.stat deleted file mode 100644 index 40ad9b8..0000000 --- a/Source/php4DelphiD7.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=57 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=20209 -OtherSecs=85 -StartTime=21.09.2018 13:19:38 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiR2005.dpk b/Source/php4DelphiR2005.dpk index 4385116..bdd3e86 100644 --- a/Source/php4DelphiR2005.dpk +++ b/Source/php4DelphiR2005.dpk @@ -30,22 +30,20 @@ package php4DelphiR2005; {$RUNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl; -ocontains +contains ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; - -d. +end. diff --git a/Source/php4DelphiR2005.dproj.local b/Source/php4DelphiR2005.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiR2005.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiR2005.stat b/Source/php4DelphiR2005.stat deleted file mode 100644 index 55185f1..0000000 --- a/Source/php4DelphiR2005.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=1 -StartTime=21.09.2018 3:08:04 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiR2006.dpk b/Source/php4DelphiR2006.dpk index 124371d..6bb00b2 100644 --- a/Source/php4DelphiR2006.dpk +++ b/Source/php4DelphiR2006.dpk @@ -30,22 +30,21 @@ package php4DelphiR2006; {$RUNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl; -ocontains +contains ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -d. +end. diff --git a/Source/php4DelphiR2006.dproj.local b/Source/php4DelphiR2006.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiR2006.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiR2006.stat b/Source/php4DelphiR2006.stat deleted file mode 100644 index 3cba0bc..0000000 --- a/Source/php4DelphiR2006.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=1 -StartTime=21.09.2018 3:08:05 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiR2007.dpk b/Source/php4DelphiR2007.dpk index bd7459e..05939e5 100644 --- a/Source/php4DelphiR2007.dpk +++ b/Source/php4DelphiR2007.dpk @@ -30,22 +30,21 @@ package php4DelphiR2007; {$RUNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl; -ocontains +contains ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -d. +end. diff --git a/Source/php4DelphiR2007.dproj.local b/Source/php4DelphiR2007.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiR2007.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiR2007.stat b/Source/php4DelphiR2007.stat deleted file mode 100644 index 6544ade..0000000 --- a/Source/php4DelphiR2007.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=1 -StartTime=21.09.2018 3:08:16 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiR2009.dpk b/Source/php4DelphiR2009.dpk index ec35688..e7e09aa 100644 --- a/Source/php4DelphiR2009.dpk +++ b/Source/php4DelphiR2009.dpk @@ -2,7 +2,6 @@ package php4DelphiR2009; {$R *.res} {$R 'php4delphi.dcr'} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -13,39 +12,36 @@ package php4DelphiR2009; {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION OFF} +{$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} -{$REFERENCEINFO ON} +{$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} -{$STACKFRAMES ON} +{$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'php4Delphi (run-rime)'} {$RUNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl; -ocontains +contains ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -d. +end. diff --git a/Source/php4DelphiR2009.dproj b/Source/php4DelphiR2009.dproj index 818ccc6..1f38f11 100644 --- a/Source/php4DelphiR2009.dproj +++ b/Source/php4DelphiR2009.dproj @@ -1,110 +1,139 @@ - - - {B0FA1B58-2442-42C7-83BD-6DD3D0CE3CF8} - php4DelphiR2009.dpk - True - Debug - 1 - Package - VCL - 18.2 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - 1 - php4Delphi (run-rime) - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - php4DelphiR2009 - true - 1049 - false - true - true - true - false - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - 00400000 - false - false - false - - - android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar - - - php4DelphiR2009_Icon.ico - 1033 - true - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - - - 0 - false - RELEASE;$(DCC_Define) - 0 - - - true - false - DEBUG;$(DCC_Define) - - - - MainSource - - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - Package - - - - php4DelphiR2009.dpk - - - - False - True - - - 12 - - - - + + + {B0FA1B58-2442-42C7-83BD-6DD3D0CE3CF8} + php4DelphiR2009.dpk + True + Debug + 1 + Package + VCL + 18.2 + Win32 + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + 0 + false + ..\..\..\..\Public\Documents\RAD Studio\6.0\Bpl\php4DelphiR2009.bpl + php4Delphi (run-rime) + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + php4DelphiR2009 + true + 1049 + false + true + true + true + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 00400000 + false + false + false + + + 0 + false + RELEASE;$(DCC_Define) + 0 + + + true + false + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + + + + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + php4DelphiR2009.dpk + + + False + True + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1058 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + False + True + + + 12 + + diff --git a/Source/php4DelphiR2009.dproj.local b/Source/php4DelphiR2009.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiR2009.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiR2009.res b/Source/php4DelphiR2009.res index b946c3cf4737f4cfe63fa0bc6b919aa29fe155e5..4ed2b323e18cf6de8d1fcabf8a5f7f57159fa833 100644 GIT binary patch delta 673 zcmZ8f!AiqG5Pc~*c#Ow-k{}8qrE2aTY=wf@VkK7zT4S(HL%JS3<%dN40l{zZ7yJPK z!1`u3YiKs??(EK+H*aS18h#$UA8l8r1MC7=uLDkx77zrXuLc*>iMYm?;+E?W*R)0$ zxC6%omxK$* zVvf;cdN-W_5o#2hGx@wFVP6GY(x0kVdl5k%^zvyo1k|6?do^5GTVMhCtYw72dXqy;Z9cb YpunE~4O(KCfh(#{>i4j%4*hTc4^o<3bN~PV delta 7 OcmX@0zD8+-jvxRGjsl|q diff --git a/Source/php4DelphiR2009.stat b/Source/php4DelphiR2009.stat deleted file mode 100644 index 32ee432..0000000 --- a/Source/php4DelphiR2009.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=1 -StartTime=21.09.2018 3:08:17 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiR2010.dproj.local b/Source/php4DelphiR2010.dproj.local deleted file mode 100644 index 2c5c945..0000000 --- a/Source/php4DelphiR2010.dproj.local +++ /dev/null @@ -1,6 +0,0 @@ - - - - 1899.12.30 00:00:00.000.755,C:\Users\User\Desktop\soulengine-5554e3db061d08b94f439be26ed071a74c30071c\php4delphi\php4DelphiR2010.dproj=C:\Users\User\Desktop\soulengine-5554e3db061d08b94f439be26ed071a74c30071c\php4delphi\php4DelphiR2010.dproj - - diff --git a/Source/php4DelphiR2010.identcache b/Source/php4DelphiR2010.identcache deleted file mode 100644 index 1dac930ecb535057e1680df202d4aaf389edca0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823 zcmbu7I}5@v6h^cAU!0uk10_)_R4J&7+@(ze4KxpuM(Dpc6>&)Gkecxhhw~jWLkMkf z0(Z-dg^WFcDCz{0t%W0RQ&)nn^`c^pt~p$lGnDn0v#MOf>|7Vt6TWW>>H`l^s|i-P zDeV7Fd75XuG==FxCmicU-rWvP(v~YZP+Q0H9{UTqb$S?n8%y#de`+NYV7vSj)>_75 Y`gJ3m=t_PYRzfHl8b$vpPa4hr0{b`y3IG5A diff --git a/Source/php4DelphiR2010.stat b/Source/php4DelphiR2010.stat deleted file mode 100644 index 92d1072..0000000 --- a/Source/php4DelphiR2010.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=4262 -DesignerSecs=1 -InspectorSecs=3 -CompileSecs=138371 -OtherSecs=477 -StartTime=29.07.4016 22:02:01 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiR5.dpk b/Source/php4DelphiR5.dpk index e1c6298..555ae25 100644 --- a/Source/php4DelphiR5.dpk +++ b/Source/php4DelphiR5.dpk @@ -38,13 +38,12 @@ contains DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', - phpFunctions in 'phpFunctions.pas', + PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', phpClass in 'phpClass.pas', - phpModules in 'phpModules.pas', PHPCommon in 'PHPCommon.pas'; END. diff --git a/Source/php4DelphiR5.dproj.local b/Source/php4DelphiR5.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiR5.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiR5.identcache b/Source/php4DelphiR5.identcache deleted file mode 100644 index ad5b648ef899d1efd57807697fcece7e57628518..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 zcmd;KU|>*mwu(t9E>4Xp$S5#LNzEz9$V6i56(kk|6~Tc57S#bB0nYikx%qj-D2{UV za|x*|NG(QJjLjWDlYKIiiV}+|(N!yBaR<-?Zl!t2C7Jno7^bUZSMOX}T#}!Q!wxkp zdR)K(gwq;%ELwoha?VLC#&D7>7PUYRI|g{7dlp;J08RDHPbtm83`jXF=7K^Ui^15O K3v>e3_yGV9u9si{ diff --git a/Source/php4DelphiR5.stat b/Source/php4DelphiR5.stat deleted file mode 100644 index 7e8d660..0000000 --- a/Source/php4DelphiR5.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=96 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=9481 -OtherSecs=55 -StartTime=21.09.2018 3:07:56 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiR6.dpk b/Source/php4DelphiR6.dpk index b96a100..78e7aa7 100644 --- a/Source/php4DelphiR6.dpk +++ b/Source/php4DelphiR6.dpk @@ -30,22 +30,21 @@ package php4DelphiR6; {$RUNONLY} {$IMPLICITBUILD OFF} -rrequires +requires rtl, vcl; -ocontains +contains ZENDAPI in 'ZENDAPI.pas', DelphiFunctions in 'DelphiFunctions.pas', php4delphi in 'php4delphi.pas', PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', PHPFunctions in 'PHPFunctions.pas', - ZendTypes in 'ZendTypes.pas', - phpTypes in 'phpTypes.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', phpClass in 'phpClass.pas', PHPCommon in 'PHPCommon.pas'; -d. +end. diff --git a/Source/php4DelphiR6.dproj.local b/Source/php4DelphiR6.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiR6.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiR6.stat b/Source/php4DelphiR6.stat deleted file mode 100644 index 0c40d2a..0000000 --- a/Source/php4DelphiR6.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=1 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=1 -OtherSecs=1 -StartTime=21.09.2018 3:07:52 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4DelphiR7.cfg b/Source/php4DelphiR7.cfg new file mode 100644 index 0000000..290f5ea --- /dev/null +++ b/Source/php4DelphiR7.cfg @@ -0,0 +1,40 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O- +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W+ +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"c:\program files (x86)\borland\delphi7\Projects\Bpl" +-LN"c:\program files (x86)\borland\delphi7\Projects\Bpl" +-DDEBUG +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/Source/php4DelphiR7.dof b/Source/php4DelphiR7.dof new file mode 100644 index 0000000..f3d0e61 --- /dev/null +++ b/Source/php4DelphiR7.dof @@ -0,0 +1,136 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=0 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=1 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=php4Delphi (run-rime) +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals=DEBUG +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1058 +CodePage=1251 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= diff --git a/Source/php4DelphiR7.dpk b/Source/php4DelphiR7.dpk index cbc7fef..dc295fa 100644 --- a/Source/php4DelphiR7.dpk +++ b/Source/php4DelphiR7.dpk @@ -41,7 +41,6 @@ contains PHPAPI in 'PHPAPI.pas', phpModules in 'phpModules.pas', PHPLibrary in 'PHPLibrary.pas', - phpCustomLibrary in 'phpCustomLibrary.pas', PHPFunctions in 'PHPFunctions.pas', PHPTypes in 'PHPTypes.pas', ZENDTypes in 'ZENDTypes.pas', diff --git a/Source/php4DelphiR7.dproj.local b/Source/php4DelphiR7.dproj.local deleted file mode 100644 index b3811b7..0000000 --- a/Source/php4DelphiR7.dproj.local +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Source/php4DelphiR7.identcache b/Source/php4DelphiR7.identcache deleted file mode 100644 index 5416a4118405a623d0c0f6bb70852ad19a744896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmb`F%L>9U5Jmd|ev2#dQ3NfmT0tcX-AFcl1R7`_WD=x*Z*-xM)Wv|apToUpW|AaH zny2&z%mB?~YuJMps&Rrz3-rKk>1wJwJ!@I7J5EVSPP{gi8K$}dzx|mN26NwCitC^m zgp>`2QoJ+moop;uGGZ+;EZ;HjD~KQ{J6};@FH{yUc~lNI%UQLqj~#EZUL05@{&99+ hELTD(8S0s1B6&(ijv-=!LA?HNgt5jje2ky3_XI254c7nw diff --git a/Source/php4DelphiR7.stat b/Source/php4DelphiR7.stat deleted file mode 100644 index d2541d1..0000000 --- a/Source/php4DelphiR7.stat +++ /dev/null @@ -1,10 +0,0 @@ -[Stats] -EditorSecs=157 -DesignerSecs=1 -InspectorSecs=1 -CompileSecs=5944 -OtherSecs=23 -StartTime=21.09.2018 3:08:01 -RealKeys=0 -EffectiveKeys=0 -DebugSecs=1 diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index d1fa8cf..c999320 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -36,13 +36,50 @@ interface uses - Windows, Messages, SysUtils, System.Types, Classes, VCL.Graphics, - PHPCommon, WinApi.WinSock, + Windows, Messages, SysUtils, + {$if CompilerVersion > 21} + System.Types, + {$else} + Types, + {$ifend} + Classes, + {$if defined(REGISTER_COLOURS) or defined(php_side_handler)} + + {$if defined(LCL) or (defined(VCL) and (CompilerVersion < 22))} + Graphics, + {$ifdef php_side_handler} + Dialogs, + {$endif} +{$elseif defined(KYLIX)} + QGraphics, + {$ifdef php_side_handler} + QDialogs, + {$endif} +{$elseif defined(FMX)} + FMX.GraphConsts, + {$ifdef php_side_handler} + FMX.Dialogs, + {$endif} +{$elseif defined(VCL)} + VCL.Graphics, + {$ifdef php_side_handler} + VCL.Dialogs, + {$endif} +{$ifend} + {$ENDIF} + PHPCommon, + {$if CompilerVersion > 21} + WinApi.WinSock, + {$else} + WinSock, + {$ifend} + ZendTypes, PHPTypes, PHPAPI, ZENDAPI, - DelphiFunctions, phpFunctions, strUtils, varUtils, - {$IFDEF PHP_UNICODE}WideStrUtils, {$ENDIF} - {$IFDEF php_side_handler} {$IFDEF FMX}FMX.Dialogs{$ELSE}VCL.Dialogs{$ENDIF}, {$ENDIF} - System.UITypes; + DelphiFunctions, phpFunctions, strUtils, varUtils + {$IFDEF PHP_UNICODE}, WideStrUtils{$ENDIF} + {$if CompilerVersion > 21} + , System.UITypes + {$ifend}; type @@ -197,7 +234,11 @@ TPHPEngine = class(TPHPComponent, IUnknown, IPHPEngine) private FINIPath : zend_ustr; FOnEngineStartup : TNotifyEvent; + {$if CompilerVersion > 21} FAddMods : TArray; + {$else} + FAddMods : array of Pzend_module_entry; + {$ifend} FOnEngineShutdown : TNotifyEvent; FEngineActive : boolean; FHandleErrors : boolean; @@ -1739,7 +1780,7 @@ procedure TPHPEngine.ShutdownEngine; except end; - {$ENDIF} + {$ifend} FHash.Clear; finally FEngineActive := false; @@ -1854,9 +1895,9 @@ procedure TPHPEngine.StartupPHP; if not PHPLoaded then begin if FDLLFolder <> '' then - DLLName := IncludeTrailingBackSlash(FDLLFolder) + PHPWin + DLLName := IncludeTrailingBackSlash(FDLLFolder) + PHPlp else - DLLName := PHPWin; + DLLName := PHPlp; LoadPHP(DLLName); if FReportDLLError then begin diff --git a/Source/phpClass.pas b/Source/phpClass.pas index 3770112..0c9f39b 100644 --- a/Source/phpClass.pas +++ b/Source/phpClass.pas @@ -643,6 +643,7 @@ function TClassProperty.GetAsInteger: integer; var c: CharPtr; begin +{$if CompilerVersion > 21} c := FormatSettings.DecimalSeparator; try FormatSettings.DecimalSeparator := '.'; @@ -650,6 +651,15 @@ function TClassProperty.GetAsInteger: integer; finally FormatSettings.DecimalSeparator := c; end; +{$else} + c := DecimalSeparator; + try + DecimalSeparator := '.'; + Result := Round(ValueToFloat(FValue)); + finally + DecimalSeparator := c; + end; +{$ifend} end; function TClassProperty.GetDisplayName: string; @@ -677,6 +687,7 @@ procedure TClassProperty.SetAsInteger(const Value: integer); var c: CharPtr; begin +{$if CompilerVersion > 21} c := FormatSettings.DecimalSeparator; try FormatSettings.DecimalSeparator := '.'; @@ -684,6 +695,15 @@ procedure TClassProperty.SetAsInteger(const Value: integer); finally FormatSettings.DecimalSeparator := c; end; +{$else} + c := DecimalSeparator; + try + DecimalSeparator := '.'; + FValue := IntToStr(Value); + finally + DecimalSeparator := c; + end; +{$ifend} end; diff --git a/Source/phpModules.pas b/Source/phpModules.pas index 6c12fa1..fdff4f1 100644 --- a/Source/phpModules.pas +++ b/Source/phpModules.pas @@ -16,7 +16,17 @@ interface uses - SyncObjs, {$IFNDEF FPC} Windows, {$ELSE} LCLType,LCLIntf,dynlibs,LCLProc,{$ENDIF} SysUtils, Types, Classes, VCL.Forms, VCL.Consts, + SyncObjs, {$IFNDEF FPC} Windows, {$ELSE} LCLType,LCLIntf,dynlibs,LCLProc,{$ENDIF} SysUtils, Types, Classes, + {$if defined(VCL) and (CompilerVersion > 21)} + VCL.Forms, VCL.Consts, + {$elseif defined(FMX)} + FMX.Forms, FMX.Consts, + {$elseif defined(KYLIX)} + QForms, QConsts, + {$elseif defined(VCL) or defined(LCL)} + Forms, Consts, + {$ifend} + PHPCommon, {$IFDEF VERSION6}RTLConsts, Variants,{$ENDIF} ZendAPI, phpAPI, phpFunctions, @@ -456,7 +466,7 @@ constructor TPHPExtension.Create(AOwner: TComponent); try if Assigned(OnCreate) and OldCreateOrder then OnCreate(Self); except - VCL.Forms.Application.HandleException(Self); + Forms.Application.HandleException(Self); end; end; end; @@ -467,13 +477,13 @@ constructor TPHPExtension.Create(AOwner: TComponent); procedure DoneVCLApplication; begin try - VCL.Forms.Application.OnException := nil; + Forms.Application.OnException := nil; {$IFDEF WINDOWS} - if VCL.Forms.Application.Handle <> 0 then ShowOwnedPopups(VCL.Forms.Application.Handle, False); + if Forms.Application.Handle <> 0 then ShowOwnedPopups(Forms.Application.Handle, False); {$ELSE} - VCL.Forms.Application.ShowHint := False; - VCL.Forms.Application.Destroying; - VCL.Forms.Application.DestroyComponents; + Forms.Application.ShowHint := False; + Forms.Application.Destroying; + Forms.Application.DestroyComponents; {$ENDIF} except end; @@ -607,7 +617,7 @@ procedure TPHPApplication.OnExceptionHandler(Sender: TObject; procedure TPHPApplication.Run; begin - VCL.Forms.Application.OnException := OnExceptionHandler; + Forms.Application.OnException := OnExceptionHandler; end; diff --git a/php4Delphi.pdf b/php4Delphi.pdf deleted file mode 100644 index b88790c9594403975fa8ad4e010168f618d7117a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221817 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%0D=vRx66GnS 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

p(8fClFi$o=0BCsOG*m zEZ6@$*pZz4KOve+(?Eg_hPeLLO^~#>1l^`3OjBHG^$5QJhB=_o9RFQt3{TU{A>#$m z4u*!%wM0h?{)mOggTf~XjLCaP-0X!ihG4 z7Vm+rsNgm?sh4$MeZedZ-Fz?C?JmXFtH$*6$~uG)#aDM_Wl6TWuBN+Dguq+wvtJb0 z=y1!N%oXA+zWKG|HNnEo54InQ=5?Ven93_k2eP2Cxs3bn#yIo&Zc4={#ieA^pFBo# z*kKDR7SSiW_pXJ^uuG)!KhQV<7u@%Uk3hegy8SaYIQh zw=w0<;jix{;p`7;Hv=VSuD;7=Vylsg%@1@bu`c|&?~yr9o-a<cNZC!W~Ah^2|+}$;h;0f*! z+})ilB)GdvLU0SgU4y#@cXtWS;?BH#zkBa@pL@?aRo|&wb*sJ~sdTaC>>k~7bdS;9 zV?0j}xQT_DpN|0k^%#|5RRUbkh`^l0#0mG;2kzzVPZ}xk)Il)P^LI1aKs2Q_dU0z9 z2nWVbj!n?;KU1VF(Hd8U@4!VQpb#VV55`Ai1{WI_LhW@=Dg5(0c8iz3k9NoP+vU{f zCeBzS6-h<9O9UrI(eRJ4lT4WKTZy=_bg#Eq5Rjd-8g?R}n*RF>bz>CL21^!oU5H_k z?&)-etu1U%^Sb`(2q7D(-ukNn*KPEoW}SFMs4 z-WhSOluIWvPKe1tUoIkv{E#W`>W|0Jl8+p7T+fN5tE;{>G}O0*o#w~$8Kz3%iX*3B z3WkQGs|IVlsz)}@w71Y+&I!Ge`=H&Kxu{!gy3(wPE=?YzC`N4J*h!hLthV2mR?1xY zEAu-9LVi06#FBcBk}qMzpO8^;g-ViCY62RTkSNc7C8{^su<0IP z5FwFO=?tc6AikqwzjM&UPYB@2N#%%(<=rc5EqjRW<0K2>x@}3RZ<;1=2&OX*a8+tz z&bEM6i_PtCjB`6)$X!=+JG(mTO=qelvgf#pk{w@I;@9Q0v;2_h(}1kKKCo$V1X5km zU6&HWa$Kq(!_nR=6lt*We)K;*;|`(EBh(54hi zYt@QJgPyr3!Wr8_-?rzA78V*2%kmG=5K43X)(kJb23MkoQi7VHMWhUiFKO|6J?>ON zU9raQB*u0P$J*0SBk$KEWGXPew9k;&b1p6o*{~f7eM_z5Yzdt-$LK-DH@BqC>WT9( znp`H21|pJFYof^IBsCq7llNqzDSjZ)iBZy-GTc%nGc}ShW9y=Nc)0ys3cNm+I(oVH z;TdF}IyG?V)5&tYqMrt-3F&<_rz8^7Mhme`GO`vtmK@xsZiurpib6VWNR*>6+%#Qm zC_LM;IlQSJpO9U1);14j=K5@nlLRToDYJ%;Uov1iCU)$NKCbo0;@NkS*mokfdZ0l?n=oE&{_=1E$nmjs> zl0*{4$g&;v%9evlNAB2+=Yw#~RT4FO6Xp9|JLD30gR!d)^1#3kWFeKbt&?&~?P*LJ zytuvMAQpcGJV^Dvp-F)33Jcl#igGL zT-P_!cuoYtB;xqPvV{(JY9M?ngOf3d0-Ya)mb2HE+{YbZ;&*fJE@ZbhsneR{SH=24 zQ2t)wVKbQ!TF0+(_8#BA>n+Wq zC43rQDiV#xK5YgpA%hr|54G9@rc|e3fPf3`2d{V(sN24-i zJU>r9Qd#iK&0UwBoSIc9Y!6^@MIly82M9xqVktjtKtPxYbdorv=>v?|ECwC1jt(B)}vKodD44-AT{6Bn+ zdik^-lElhXQfSz@?F8liuQiL-n*h;QG^Ie+84z_8QS35e1xy@oM_X50E{6C!cRHMO zS|-fb9MZ^25cTe;c8+Myd}%YO>!X}2m>KZtB>3C~Y&QS|XuQ{e{0=+E)4o!C`L92_ z=D0GYCuM>x0S+>qF{*LhMF|Xxr4%@#2>QDZi2-OTOD_bxHhtd1W&trp!M2sT@fPMS z4G~sy)yZiuWjgzNJ@7>~n%JhF^5u0Fodv45qDF)Twy%Z&*F}6b^Q9-r3f0od(TAVw zegkI4ejtK1D1Y_#Iu`IAG|;EjL?C3UbWAd#PzT(l<2DoPIsa;BH}f+ zAANmVVq_pcfi#6&R3Mb(+`v+~4VXzMP-QFqKceAYb26T<4dRnjJ_L3{Mr zYrkFvyx9qT^hfr$Oiy#N=tUxAe1*gBYXmwUcTg>t;7_1lv);nXGxB;OI%(3kZn{MH2jpN2v zZRoYLG)>+ai@7Pd-xu-YT^9o0!XJGNkW^(I$YEu`FIaCXUAZM3gb0>;R#vq2@h%WB zt4nu@Q5_sog}R+G`OJHmnG%h{Aw>s=v%p~NEA^Ew9mvt1R*;9kRNl1ET#!^2+~uhA zJQ5}Ps06tHuZrh=@uRwkxk-TBV|z+H0F%WRF*=;Km9MV|lhnCu>1IlY=o{ul{xIXTD37y3xM!JVOMssA>e!vSF$%blz z^Y~BdxK+bi76KQyf$y3dZApn3z3(bdC~M=zCx@sorJ8rg+=*Yj#=q z=6U`@G1D*J(&-Z-=1Zm&il6VwAYxbcq^gqp4!d=C}~fp?;4iO9RzF{$AVio zamKwoWD_)VOoBMhw`=v)SQQCn%o|D;l>OJPrmQzk%rh#QCZdeIqCGE>275`)J9!j8 zKQ2)krzsccmA*|F?IF5?A>k6OWGX{U)P{O89c{lN;M6Rz`hq_6!egZl3l4p;r-0qY z2FvlH$}FPRy*T<}G`-Wy*vI_M{r3-$t}Nj&E@-4OjDbPr`5KxvziBK>zK3B!>)C>B zseNo^=A#|)%&BajfC0^+*Eyf8)03jZ1*}_PtmdM}4rG)}N~(RDWgOD7Y}^6@<0VT85aPO|douSvOeUjby5EG`I-r|g3ZB2E!brY~? z1J|QNR-ouzBUZo;lal)+hFF!FT!)Up4RS9W^i5|I7?>5)Z@oIL-%y%gT-~CHvXWtN zD@GZ9fet_MJt8*zRnkw=h^AmWK|XVKw#53dJtKj1X+4*RSPfLS6}Lr?#*9TQR9V^h z=G9N3uc2Z5NcVr;Nt4y@d{&)?8g$nrBIM33LE1-_u&pnEH-p{TC>@59M-ja!kqsz) zZoCRL52r-Q8jdW4acjnB_QC+ol+{v5D z7Zw>Hy92$Zf8t&pQGte%xb7XDH!Fd$9~+I*bwtFtPQ_1zget}pc5&vKIs6Q@ zR&O{cF(_6JY%$5yf&dUE^d@uBvDZ87|-Y!kf;p7@HK)~3YRcb%Z z2R3Dce`9kXUX4Qi$pVikwOjJ%`f=HEk($Oed68C0c2Wf6wSo&WJRL3@ukB6QfF0ua4lfRluJyQ}h<)QTsVQNa z!Ihfu=nR-M;(k`Z!KhctabcV{e6-G6h3JZuV}SOy96CVB``A)=uU+X ztWkz>7tuY1j!L)0kt4%bUKRyq{QQo!!FskZ@un? z=u5SBjT7JXiks~ir9}#2E0zo0DYtGhk)M=7R(_e}eDKz&Y2(LJdW7zk zIjpT(bk(i8V6WUQ+__^kBPK5B!da2Qd%s}LOIXz-f`(WdRTSk6L zOb8tlvC}~C<=^_JfNkJ)}vYS+4Q0=vg94UmHIB2Cr5y80UV zO((GcIqI91x^Gb+8cEkrf#_kW32Q7cSYah`*!38ns-uQAqPGNcStRck&_yQI4d>Yp zzWr=H;*+9b+ZG!htx)zTeN*FX@xfrP%U;Uu>^xLL%WF8ghoZI>Z0OZ}Jyp3BThI?? zGQD~x(^OTMe>lrrvpEf3&1fIH`)&t;7!H@gPT?$#vy~rtN0B=qN>D;;NJC=^Dfp|H zWr*j=*0>V$d3rPu4!ujpKP$U7r`pU^{G zm-c?MVXI8*EwcZxj*;=J`h@=ULYmu2*wq?eE8fn)h7}}-PM1)BBxB!$veE3DDXaENy6vqh%EI z24%-t4^9w0(W~RYrwH=p?DTHWR>a`BPpx{J=!QM^~K|y!W52=^DzIGL#JR#8Yqi7j57L4nS4KRQQ z7UngRv~h3GlE{vdMA9|z0O!bMFBXacENdiy^lGV=K=lsCCAqZNAlf;moR{$X#B!vU z45`;+k5dndTZBt^U!90qHd+-MhbY2xT%1H^JJIJYmvCQ!OP!VPY0>F{tHNyaqZ{eU zB+mX@)ctoHbYb47#1ie2CN*26gn1r0rm0`JlP&J!uKdmz`u)BY!$fr2Xy=fe6o0Ir z?g)uUI=f;RCz9a^RuUD%VRlErltd!rX%6@<@n%6YQZE{bkqjDbekWwJy34jfLeGUy zq^zNUB;w2QR>~&z(*xispPZM?w^Ky-yc8 zD(UC5$UsZ+K}TjJG~zJn!mnvT1ZK4bxrnplBc>)fRgN)Bdi7c?;?{HGB5^R@uMT3? zwsNZ3(SFF%{$iSy35E8oyA~AFeYb}4^oya&u`UkZ<@8-_J$u~wS8tQon0Q>inQ%l4ugnTO_*P_|m1B z*?dxJeAi5`Q15rPJRS&e)M}iFt2g=hBx4D|kqB=ucXY*Po|{egBwQ%FtR;Ck@MFjm zyI9g6men>baA?`yzMG0V663)Q$O1`qnn?bp%>JPs>nGdnM|1L3N^-&vi z0|LgKm8zNxU$`0t>$*QQ71x-04kX<&*H*2icd0Z=c6lGvq+NTid>RRaxV_-WLr`~} ztusjBW6(}=&B9nwy|8c1M}GB)S>*q;j|FR5pzMZk+gwq{MElKgFsXVZQAT1?79$8b zZu`1j`8EBR9eQrg51fF>`B9=zCd%66y>wBx8_AziPmz9sf zDdWDP(2^Qc!c{&$WrUQ;m3X1OxcK3YLDS5*g{&6Dd2)W{L(|nW+TS(DxW5n5d%YeC zN5^->bCdc#pe5x~ywdk<1h|cThY4Ry{M5!cn6)$vCKUyo>`W6CQ&@}QNU*50F$K?4 zaov&3E45!1y$JW6gYNOC*di0!h%)N4m<2Ck4q)Ck&XQ=jRags=nmBIA3I@XMK*eBx zWu04}JP`9(K1tfxT3F*5JZhGk;wJ?Xjd_@SI{pFT zPs(54nciK!s=cPSTxAXZw6GZ)LAVk`G=2-}>!wg63G>uW!9~uYA^d zKF7?v5a}U?DOmBcFYJ|#pKT20@+<5NCWwh5m$7}*Xt#|3wQi5wj5sr)CGtn_Zc}ls z7`s^StXIQcs@!Q?)EGSw+Q8-9S?_eHiuK@|I!n*hyCGauaSr=5wmz<7gH0aKLZs-*~>eR#SAnU*$OceIE$f_bR?HGP|R9r8@#VqR!=*W+r z-i5ML;=`^BPnCw5UWI%N2W7{k^qe#8js`qY3&+rRJI?kE|LTo(_ZpyJpIF~W?S9gu z(;eUC(VDewkNX%$H1%{vPfm!xY+POSrQjpCt=*xE6k55doSjhQ0(EmqkUy)@UiP+1 zf~-9+<3)nJ>7lCrSps(6jW4nYaSi%%xZGTA8Eb66QKFX5uSh!IF*KRMwg!24qo37^ zq&y_1gOlB$U1Z^ViiqJ<3=~&P4fN$;=aZM5j;V*xjgPhwQ0eUM$it|Ci+P@THN*LN ze!;M(AB#fxwc;iN;@m>Yl!7*rCn{Hi}i&l)jI4>Ad*Xe&a0Vbg2zXzn0%kq)3n5ZZ~5 zNhAA*p{L2d4a2wn)@JaUG*0g=mos!N?G%Kz)G|-I!?mbf7BNS5$AC4DI(T2r_er8b z!wP{xP+XPRsPm1R;UwDRvfW{7be9-4Pi<)W=MfZG$}zkZym<-on=AM{x%`%;uEB~4 z6(oWM>0!TGNiNP%Zr4r&mOHt%O=A!|28yB}46}iy%p7|HY5ZvB)^7OSYhjc1D7CNC za>Tst^SacAI6qX*LDjK$TD~3zD1MO{79;g~CvIK2aE5NLo>tbqbLQE3HI;ywF6G*OiCw)CAm^zm9pZssTuNQWs>V1;h#5$fW<8%6 zJ%u9lKxG51)DebDxUS@}!lK_TbrtTWnyh6$=f4H@V?;@`wec3oJwDU;KOPJINl(tr z#`O=bM9$w-CoOG9yckG~PU^RRP}^YU{5bnnWh z&i1ZO#-`4QLPEehPWHwsrT~RJtKwTpR#j6E7vK>|dpnmuewAb=Xa75Eyd(!XP{nU7 zQC3M#a`wMBBFRn8{x@cHR!JUm_TMayzaQWwXa5`T;lFbo{&AwI{4Z?t0O9*TJM*6& zasH#ie;#p;XvjG)@}Rd}YOL)IYohDH3@mN@Oy8NbG)v4d7pNdD=2SBoayxu{h^JW5 zjLo&p&mt!FkMRBYaJ*rpHH?R>6rA>Y$W|<@hr1-TC+h8x92aHkbiPG<`8a`hNb)LT zfTc>+y+=R{Z8kcuRDjxWoYUzmW|J6^RPUDL){I`SY{9Qe^<4Ff@jCUdCGq%OBX3 zLSLtddr9~9D1X$wA*e{5s?iwQAaxvVPK>`Mvt2l%kS$5(jpc)A9*;k|(T;DE`m(Sj zOAM)KUXwK{=W`Ta4HrFO&bvB($1OvBx~>c$!y`IzmKw*uSc!`ul;n5AW!^D-C;2(F2WOTFUpk6`1) z_q2#>8#m`=>&PnQ_#2T!E_Pinyvi`Q1lAUjdz}>T@iiYg?Faqd3E|Ad5+ziTG$wrk zt4I#khAqV*S`v(~_XJE>!1Qw=llP9;Qs8{dP@pM%yH_w(IVLIB9z%_4On}1voY~)4 zk3?|s-Q&)>EOpmWdXaqJ%f=fUK>$f(Aa$)ve{q3mlHiH_qw3?${&?cVY68l3(7K1E zTN=Lqn`)X!>sd~1UhD_j{!d*wXto1^sX#na6d}Ru6y*zIa|#634JxofmGB&Ae$BN0 z+%i#j8hwY?V>de{OSOGXtJkJ9SA#?*sZ?G0>K%U%e0m&m!~)T0PVES{f&1c3&z+nw1Vc+pWSb5;sgFXvsRHVDEo|MHsie2+2ELWGuX18!cj(a8A4& z7Pfp2!E&|m6nuq)tmeD<;G5zLYZp*em__!JPeQ|SY_}cnh0-r)lCX3Ia10CKAq=Nv z`HlvuBshHD>7MJ<@Mc5ghn;x)7M_nqiO=8#LN1y4G3e)v27ZgpB-)~yZj)LUz32su zsy{`5_0y*>F;%aJMKGA)@Zr+G2;`ZKJf*#X{o3{#p7?$#qs15$xv%`Bi$>s@qhjAJ zKsnwV#i$c?>9Pv zL|6y)mv7cR&~CAR26rN2tSeG(A{p*{`&)Dli@w~F&7=?+360P>4;6|~l;7`izE7R~j{j4V|inbFsgu2In^UTGJy zWPoJhc$zQYc@ezF9T&wiH!$OD*87RFY0aP!#xE(kDSy-mRm4BV0)F={%|Ydz$dowW zyv^`y)T#oD_P7x|Y^885#v0}Zs!$iEl6=o@Mwizz z`-jE)iwXNz#QgszT`vIdtzl{6VnNQ$^-t7qPIdqc{J)^<{qLcEbNvU5{{IJ1zoGbF zQ2hU>-+!Q)|38oV{bT%50}R`Q#y=76*UM|N9P{C;`owwA8Nq`@9|Q)tZU3RJ@u}vJ zUWl>6>PEfPl{r8s)F^J=m_}+r=BHX1$Z?ck*t)i1+(izIbf95tf9;a=jXCqug$K^{ukGL{$xN1$2<*B5z5m*@=1EEpuwY-MbV@(%C>{n%$DDa(@st0!hG*^JE( zkH>dutAA-G4}v8u2k{;QFi!!9-g7nccN14gIcU~%G2B}b7IiBhI_nY7Q{n=l@KdZ` zfVOh<_;%VqF_p1`>pm_U<_S;Yihx_>Hq>gIaMu_WlCFkRgrNqI6miI_ROhD%RbV0r99sJRxQ)tabu|006Y!k5((QW9-`f~zqsvyJtzMn{mQrty-w+E%`T5bXQ>Uv3=!3F37KciKb=I{#7y{%I2?X;p~BJp!7?C ztUqvZ8e-;>^Pdjq$eNPB)bt*h0?l6KF75x5)NeL_PXmQNr@^R!GKRu|i)b8NeevV) zUPf@z5N3ea6uKzBJr2@bL3>ZxmdC+HURR#6Yw(iJn4KZA=*I_MaP!dc&3U7Cx1y`DQZrZj!{cLnxq|1}kD;-36w-qo zvo$4C3{<9F%`cTMI>!m z)?VE`+S#A+lk887KV4BrZ(dzja@1+5jlSo$z5`aXuZ~>DCSKRK03KTIW6Ui$)0dt2 zd|_EFAEB+PBEUew27=DLx;LaXHTzJ=r>l_-gy+dDsx<-Z z2>~(3^rCx=?!fGarA?Xj)!2lH{YoV{HeKGsbx%=nxU^D|zFlH=WsGp8LN+P0%i{x? z6Rc@4J{8hF!B#wjPS^4t;P)=b!N^LZu8$n;uqax{zD|uqxI zvO)A1Nc75WoqKx3E-jW_OPaA;goDF`elt|+t{-y;H)~)k8g%+KE~~|O17%o-kEi3K zIAJlGA2ahWdhVcUmcm(xWQby;bbYUCap%Ph5+f{pM`q$uZjo`isC^D3z&+ z#iy)4ItteEUs2K}TLjjn+$=!Lr2bI?zHa58U)NK@0sN1~|52Eq`E!&983P}DoNC0Gq4*o=|9I9j9~^ zXvcu{9hbj^Jba1y$9tqY>!nZXqmyb=oAJ_x5?UJ%Z0Wq9ZFfd`Wieu6$FWuy#!8Qb zoAvdq&1}9+kFQfRoAab@bmAGR$O(RMLen{j%xlflWowPW{9nw7^5Wjm_c)V^-Bij3 zKZCk2hUIRBKYzn3H-5^!o-LrHOYL|$<4l8`XCWvU;J_g@zC%!0)iav&J)*YuV;BIS z9g-mjdu%v1I{V;N<2h)(@U3ck=I9q*`?Ptumfbut4o23{H&`NR;Y&Xd2(=dJQ2S6X zf3GfCuqI^`tGl4gPA4;d(C-^RKOFgP=3JR}eK5-r7gGNfqakU1{ZVH*#h{)4F42>S zDrMwl^wO-rZD2S3m%g$Ow>&z62*;!c3tHv2I>%6kme)lx_`&RX-GzGYZ(_Sx)8q0LIEbz`#VP|QK6Zm-_ z!_~{tONbD-8d#vlAix^dcmvjJ`vsOc=cz2Ta&za{ug6?mXzph=sK(tJ?N@R9nMw;+ z3^P5VgMMEeAF1>je{R5&Zz9j~#l-A>{H*s0OK{~)Om%k;mIJVMUSj1`tHPIex_ z!;=+ABCbv>qMCf*qY&KE2Q{H1JX!K%X%*HkCrh_ zForPqLn$0k*PDbhWZ*tiiu^hOpGEKGT)_br^^8EY>-(d4Ho@6!lt{7nX9+6wJWl3{ zj9p$tovhLze3eUfM7{xRpt04*`!LaYYsg3G^UY#w$r;100p4@9|a-{0H8vFB)JxP5`}r?JElWn()Zb zdXlm}A_AL!C^xkkl^>1%vA>X&vdn@{?`TlCdJL!j{)f&T-iG;8l-ym~8ksQwI+=qs z_6P?)%R6!>yIcp>I=@p0&K0o$ZWIHq?~6f9k`(L3w=z(nC>L7>{&A}?CeX3KZsL>s zTVUA}0USWT0SGp@Obxh9di6)8mwo>yVZA?Atl&?uz6v-Mue(^7+_~18oTP|-0}?;# zJ|%0*g+=z7@djHtzC!i0E2Ezrvbi0b1;Bn# z3Z{5`^FWw#$=N5;2f#3h;N{$+K7-Z)-h+RP72~R%OBU{e<|ZjgZOX8qYJLshC_*2V z8_bl+R1MwNOfs~E)HS|%C0pE?yEjD z$Fl#=o!>Vrde@U`9({Y%wqc3jMaJeyKeqY94?mATi& z#Xa1#a0pZHg-M^}3X{Y!l_QsD3uB_3)Z*#!WY77MvFC{*hB;W+{d}U~Xk)x~d?c9W zFgiIc-IJ5us*pT}5Bf?4AIEB5$e0VmK`#Ja(F56UAAu(e(6>W9%X19Mn2!5+32aBn zrai>CTs1{ zFH*e;*}c>gG;1abSkf&k{PWe^$C8D;W>#AxH;%ILyC5SMWWGHP2XE&ka}tI`ZP)4k zN@6Y4{Dd6>1I|q3t+>DrNDb{v;xhNe)$xz2IracPVpcS+AX9MY9>=GZMa!{#gg|o+=TqNTyB!^cMClZKM!NHRfA@uW3mHvaNH0Fz>zfHJMExVOJ+@aT%E zVS~G#c%9?1j<-H#U=n`0xx@EPj2JY5Qb`UGgJqEZ~I=O;Gz*QvC`n}7M> zF-vxI1~E^DJN5SYIqF+IVo6^V#+W(A<@`aY4qeKeqqZT*kS#GaNQ|7y92vBkX_9cL z%3W#@|F(;7W4V0`Sp3YVyRkM^4!Dm7zkcFzbJNY$3Eu%Yl*1EV7C#`^|na6&)nMQmu&vrbM>GSOC&Q`|J z1i;y%V7*n^l>sbH9Nr_{j+pVN>lnhpTyj$xZjqx0

4b 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�HSK=E{jl`v~!2?ad{Rv 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 From e6cb7b4053d7e98856a3bd9f0b59dfcbbbc34942 Mon Sep 17 00:00:00 2001 From: lion Date: Sat, 18 Jul 2020 18:16:52 +0300 Subject: [PATCH 49/54] readme.txt -> README.md: /r/ --- readme.txt => README.md | 502 ++++++++++++++++++++-------------------- 1 file changed, 251 insertions(+), 251 deletions(-) rename readme.txt => README.md (94%) diff --git a/readme.txt b/README.md similarity index 94% rename from readme.txt rename to README.md index f24d7d9..353fc1e 100644 --- a/readme.txt +++ b/README.md @@ -1,251 +1,251 @@ - PHP4Delphi library -PHP - Delphi interface and PHP extensions development framework - -{ $Id: readme.txt,v 7.4 07/2020 delphi32 Exp $ } - -PHP4Delphi is a Delphi interface to PHP for Delphi {2007, ..., Berlin} - -PHP4Delphi consists of 3 big subprojects: - -1. PHP scripting (using PHP as a scripting language in Delphi applications) -PHP4Delphi allows to execute the PHP scripts within the Delphi program using -TpsvPHP component directly without a WebServer. -It is a PHP extension that enables you to write client-side GUI applications. -One of the goals behind it was to prove that PHP is a capable general-purpose scripting -language that is suited for more than just Web applications. -It is used by "Delphi for PHP" from CodeGear. - -2. PHP extensions development framework (using Delphi to extend PHP functionality) -Visual Development Framework gives possibility to create custom PHP -Extensions using Delphi. -PHP extension, in the most basic of terms, is a set of instructions that is -designed to add functionality to PHP. - -3. PHP4Applications (integrate PHP in any application) -Supports C, C++, Visual Basic, VBA, C#, Delphi, Delphi .NET, Visual Basic .NET etc. - - -More detail information available in php4Delphi manual php4Delphi.pdf - - -This is a source-only release of php4Delphi. It includes -design-time and run-time packages for Delphi 2007 through Delphi Berlin - - - -History: -7.4 Mar 2019 - -* Compatible with PHP 5.5.0 -* Compatible with PHP 5.6.0 -* Compatible with PHP 5.6.x -* Compatible with Delphi 2011, XE8, Seattle, Berlin -* Added unicode support - -7.3 Jan 2019 - -* Compatible with PHP 5.4.0 - -7.2 Oct 2009 - -* Compatible with Delphi 2010 -* Compatible with PHP 5.2.11 -* Compatible with PHP 5.3.0 (VC6 and VC9 editions : see PHP.INC for more details) - -7.1 Oct 2008 - -* Compatible with Delphi 2009 - -7.0 Apr 2007 - -* Compatible with Delphi 2007 -* Compatible with PHP 5.2.1 -* Compatible with PHP 4.4.6 -* Thread safe TpsvPHP component -* New component TPHPEngine introduced -* RunCode method reimplemented to solve "black horror" of pipes. -* Not fully compatible with previous version due to multithreading, but migration is easy. - -6.2 Feb 2006 - -* Compatible with PHP 5.2.0 -* Compatible with Delphi 2006 -* Compatible with PHP 5.1.1 -* Compatible with PHP 5.1.2 -* Code reorganized, some crap was removed -* Added headers support (Michael Maroszek) -* New demo projects -* PHP4Applications revisited - -6.1 - -* Compatible with PHP 5.0.4 -* Compatible with PHP 5.1.0b3 -* Compatible with Delphi 2005 - -6.0 - -* Translated Zend II API -* New PHP Object Model support -* PHP classes support for PHP4 and PHP5 -* New demo projects -* TPHPClass component compatible with PHP4 and PHP5 -* Added new property DLLFolder to psvPHP component -* New component PHPSystemLibrary - -5.5 fix 1 - -* New property RegisterGlobals (boolean) added to psvPHP component -* New property MaxExecutionTime (integer) added to psvPHP component - Maximum execution time of each script, in seconds -* New property MaxInputTime (integer) added to psvPHP component - Maximum amount of time each script may spend parsing request data -* New property SafeMode (boolean) added to psvPHP component -* New property SafeModeGid (boolean) added to psvPHP component - When safe_mode is on, UID/GID checks are bypassed when - including files from this directory and its subdirectories. (directory must also be in include_path or full path must - be used when including) -* Memory leak fixed in phpModules unit -* php_class demo project errors fixed -* psvPHP can load now PHP modules using dl() function - -5.5 - -* New component TPHPClass added (only for PHP 4) -* Added support of PHP 5 -* Improved speed of unloading of the PHP extensions under Apache -* Decreased size of the compiled modules (based on API only and developed using Visual FrameWork) -* ZendAPI unit is splitted to ZendAPI and ZendTypes units -* PHPAPI unit is splitted to PHPAPI and PHPTypes units -* New version of php4App - php4Applications subproject. - php4Applications allows to use php scripts in VB, C, C++, etc applications. - Demo projects for Delphi, VC and MS Word included. -* New property UseDelimiters added to TpsvPHP component. If UseDelimiters = true (by default) the - syntax of RunCode method parameter ACode should include standard script delimiters "" - to make RunCode and Execute method compatible. -* New parameters for OnScriptError event (error type, file name and line number) - -5.4 - -* Minor bugs fixed -* Documentation improved -* New property IniPath (folder where php.ini located) added to TpsvPHP component -* New functions translated in ZendAPI unit - -5.3 -* Added new public property ExecuteMethod to psvPHP component. - if ExecuteMethod is emGet, psvPHP receives variables as $_GET["variable"], - if ExecuteMethod is emServer (default), psvPHP receives variables as $variable. - Can be used to debug real PHP scripts with GET parameters. -* Added possibility to access published property of Delphi components from PHP -* Fixed problem with loading of PHP extension compiled wihout PHP4DELPHI_AUTOLOAD - option. - -5.2 -* Added dynamic attachement of all exported functions from php4ts.dll - in PHPAPI.pas -* New function for safe dynamic functions linking PHPStubInit and ZendStubInit - This functions can be used if you are planning to work with beta-version of PHP, - for example -* New unit zend_dynamic_array.pas -* New unit logos.pas - -5.0.3 -* Fixed bug when php function without parameters does not return value. -* New classes: TZendVariable and TZendValue in phpFunctions.pas -* New subproject: php4App - Using php4App you can integrate PHP not only with Delphi, but with VB, for example - -5.0.2 -* Fixed problem with assembler code in ZENDAPI.pas for Delphi 7 - -5.0.1 -* Fixed problem with number of parameters of zend_getparameters_ex function - -5.0 -* First version written in Delphi - - -1.0 - 4.0 -* php4Delphi was written in C as a DLL with simple Delphi wrapper - - -Before using php4Delphi library: - -If you have no PHP installed, you have to download and -install PHP separately. It is not included in the package. -You can download the latest version of PHP from -http://www.php.net/downloads.php - -ZEND API documentation available at http://www.zend.com -PHP API documentation available at http://www.php.net - -You need to ensure that the dlls which php uses can be found. -php4ts.dll is always used. If you are using any php extension dlls then you -will need those as well. -To make sure that the dlls can be found, you can either copy them to the -system directory (e.g. winnt/system32 or windows/system). - -Copy the file, php.ini-dist to your %WINDOWS% directory on -Windows 95/98 or to your %SYSTEMROOT% directory under Windows NT, -Windows 2000 or Windows XP and rename it to php.ini. Your %WINDOWS% or -%SYSTEMROOT% directory is typically: -c:\windows for Windows 95/98 -c:\winnt or c:\winnt40 for NT/2000/XP servers - -How to install php4Delphi library: - -Delphi 2007 & up: - -Uninstall previous installed version of php4Delphi Library from Delphi 2007 IDE. -Remove previously compiled php4Delphi packages from your hard disk. - -Select PHP version you are going to use. php4Delphi supports PHP 5.x, -but not at the same time. You have to compile php4Delphi for selected target version of PHP. - -Open PHP.INC file. -If you are using PHP5: -a) Uncomment (remove dot) from definition of suitable php, VC, Visual Library and architecture version -b) Uncomment (remove dot) from definition of prefered features in the feature block of the PHP.INC file -c) Save PHP.INC file - -Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime -choose suitable Runtime package php4DelphiR(Your Delphi Version).dpk; In "Package..." window click "Compile" button to -compile packages. -Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS -"PATH" environment variable; -for example, in the Windows\System directory). - -After compiling php4Delphi run-time package you must install design-time -package into the IDE. - -Use "File\Open..." menu item to open design-time package php4DelphiD(Your Delphi Version).dpk -In "Package..." window click "Compile" button to compile the package -and then click "Install" button to register php4Delphi Library -components on the component palette. - - -Since this is a freeware you are strongly encouraged to look -at the source code and improve on the components if you want to. -Of course I would appreciate it if you would send me back the -changes and bug fixes you have made. - -For more information on the PHP Group and the PHP project, -please see . - - -PHP4Delphi forum -http://sourceforge.net/forum/forum.php?forum_id=324242 - -Authors: -Serhiy Perevoznyk -Belgium -serge_perevoznyk@hotmail.com -http://users.telenet.be/ws36637 -http://delphi32.blogspot.com - -Lew Zienin -Poland -levzenin@pm.me - -Nikita Ganzikov -Ukraine -pig-l@mail.ru - +# PHP4Delphi library + +PHP - Delphi interface and PHP extensions development framework + +{ $Id: readme.txt,v 7.4 07/2020 delphi32 Exp $ } + +PHP4Delphi is a Delphi interface to PHP for Delphi {2007, ..., Berlin} + +PHP4Delphi consists of 3 big subprojects: + +1. PHP scripting (using PHP as a scripting language in Delphi applications) +PHP4Delphi allows to execute the PHP scripts within the Delphi program using +TpsvPHP component directly without a WebServer. +It is a PHP extension that enables you to write client-side GUI applications. +One of the goals behind it was to prove that PHP is a capable general-purpose scripting +language that is suited for more than just Web applications. +It is used by "Delphi for PHP" from CodeGear. + +2. PHP extensions development framework (using Delphi to extend PHP functionality) +Visual Development Framework gives possibility to create custom PHP +Extensions using Delphi. +PHP extension, in the most basic of terms, is a set of instructions that is +designed to add functionality to PHP. + +3. PHP4Applications (integrate PHP in any application) +Supports C, C++, Visual Basic, VBA, C#, Delphi, Delphi .NET, Visual Basic .NET etc. + + +More detail information available in php4Delphi manual php4Delphi.pdf + + +This is a source-only release of php4Delphi. It includes +design-time and run-time packages for Delphi 2007 through Delphi Berlin + + + +# History + +7.4 Mar 2019 + +* Compatible with PHP 5.5.0 +* Compatible with PHP 5.6.0 +* Compatible with PHP 5.6.x +* Compatible with Delphi 2011, XE8, Seattle, Berlin +* Added unicode support + +7.3 Jan 2019 + +* Compatible with PHP 5.4.0 + +7.2 Oct 2009 + +* Compatible with Delphi 2010 +* Compatible with PHP 5.2.11 +* Compatible with PHP 5.3.0 (VC6 and VC9 editions : see PHP.INC for more details) + +7.1 Oct 2008 + +* Compatible with Delphi 2009 + +7.0 Apr 2007 + +* Compatible with Delphi 2007 +* Compatible with PHP 5.2.1 +* Compatible with PHP 4.4.6 +* Thread safe TpsvPHP component +* New component TPHPEngine introduced +* RunCode method reimplemented to solve "black horror" of pipes. +* Not fully compatible with previous version due to multithreading, but migration is easy. + +6.2 Feb 2006 + +* Compatible with PHP 5.2.0 +* Compatible with Delphi 2006 +* Compatible with PHP 5.1.1 +* Compatible with PHP 5.1.2 +* Code reorganized, some crap was removed +* Added headers support (Michael Maroszek) +* New demo projects +* PHP4Applications revisited + +6.1 + +* Compatible with PHP 5.0.4 +* Compatible with PHP 5.1.0b3 +* Compatible with Delphi 2005 + +6.0 + +* Translated Zend II API +* New PHP Object Model support +* PHP classes support for PHP4 and PHP5 +* New demo projects +* TPHPClass component compatible with PHP4 and PHP5 +* Added new property DLLFolder to psvPHP component +* New component PHPSystemLibrary + +5.5 fix 1 + +* New property RegisterGlobals (boolean) added to psvPHP component +* New property MaxExecutionTime (integer) added to psvPHP component - Maximum execution time of each script, in seconds +* New property MaxInputTime (integer) added to psvPHP component - Maximum amount of time each script may spend parsing request data +* New property SafeMode (boolean) added to psvPHP component +* New property SafeModeGid (boolean) added to psvPHP component - When safe_mode is on, UID/GID checks are bypassed when + including files from this directory and its subdirectories. (directory must also be in include_path or full path must + be used when including) +* Memory leak fixed in phpModules unit +* php_class demo project errors fixed +* psvPHP can load now PHP modules using dl() function + +5.5 + +* New component TPHPClass added (only for PHP 4) +* Added support of PHP 5 +* Improved speed of unloading of the PHP extensions under Apache +* Decreased size of the compiled modules (based on API only and developed using Visual FrameWork) +* ZendAPI unit is splitted to ZendAPI and ZendTypes units +* PHPAPI unit is splitted to PHPAPI and PHPTypes units +* New version of php4App - php4Applications subproject. + php4Applications allows to use php scripts in VB, C, C++, etc applications. + Demo projects for Delphi, VC and MS Word included. +* New property UseDelimiters added to TpsvPHP component. If UseDelimiters = true (by default) the + syntax of RunCode method parameter ACode should include standard script delimiters "" + to make RunCode and Execute method compatible. +* New parameters for OnScriptError event (error type, file name and line number) + +5.4 + +* Minor bugs fixed +* Documentation improved +* New property IniPath (folder where php.ini located) added to TpsvPHP component +* New functions translated in ZendAPI unit + +5.3 +* Added new public property ExecuteMethod to psvPHP component. + if ExecuteMethod is emGet, psvPHP receives variables as $_GET["variable"], + if ExecuteMethod is emServer (default), psvPHP receives variables as $variable. + Can be used to debug real PHP scripts with GET parameters. +* Added possibility to access published property of Delphi components from PHP +* Fixed problem with loading of PHP extension compiled wihout PHP4DELPHI_AUTOLOAD + option. + +5.2 +* Added dynamic attachement of all exported functions from php4ts.dll + in PHPAPI.pas +* New function for safe dynamic functions linking PHPStubInit and ZendStubInit + This functions can be used if you are planning to work with beta-version of PHP, + for example +* New unit zend_dynamic_array.pas +* New unit logos.pas + +5.0.3 +* Fixed bug when php function without parameters does not return value. +* New classes: TZendVariable and TZendValue in phpFunctions.pas +* New subproject: php4App + Using php4App you can integrate PHP not only with Delphi, but with VB, for example + +5.0.2 +* Fixed problem with assembler code in ZENDAPI.pas for Delphi 7 + +5.0.1 +* Fixed problem with number of parameters of zend_getparameters_ex function + +5.0 +* First version written in Delphi + + +1.0 - 4.0 +* php4Delphi was written in C as a DLL with simple Delphi wrapper + +# Prerequisites +Before using php4Delphi library: + +If you have no PHP installed, you have to download and +install PHP separately. It is not included in the package. +You can download the latest version of PHP from +http://www.php.net/downloads.php + +ZEND API documentation available at http://www.zend.com +PHP API documentation available at http://www.php.net + +You need to ensure that the dlls which php uses can be found. +php4ts.dll is always used. If you are using any php extension dlls then you +will need those as well. +To make sure that the dlls can be found, you can either copy them to the +system directory (e.g. winnt/system32 or windows/system). + +Copy the file, php.ini-dist to your %WINDOWS% directory on +Windows 95/98 or to your %SYSTEMROOT% directory under Windows NT, +Windows 2000 or Windows XP and rename it to php.ini. Your %WINDOWS% or +%SYSTEMROOT% directory is typically: +c:\windows for Windows 95/98 +c:\winnt or c:\winnt40 for NT/2000/XP servers + +# Building +Uninstall previous installed version of php4Delphi Library from Delphi IDE. +Remove previously compiled php4Delphi packages from your hard disk. + +Select PHP version you are going to use. php4Delphi supports PHP 5.x, +but not at the same time. You have to compile php4Delphi for selected target version of PHP. + +Open PHP.INC file. +If you are using PHP5: +a) Uncomment (remove dot) from definition of suitable php, VC and widgetset version +b) Uncomment (remove dot) from definition of prefered features in the feature block of the PHP.INC file +c) Save PHP.INC file + +Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime +choose suitable Runtime package php4DelphiR(Your Delphi Version).dpk; In "Package..." window click "Compile" button to +compile packages. +Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS +"PATH" environment variable; +for example, in the Windows\System directory). + +After compiling php4Delphi run-time package you must install design-time +package into the IDE. + +Use "File\Open..." menu item to open design-time package php4DelphiD(Your Delphi Version).dpk +In "Package..." window click "Compile" button to compile the package +and then click "Install" button to register php4Delphi Library +components on the component palette. + +# Credits + +Since this is a freeware you are strongly encouraged to look +at the source code and improve on the components if you want to. +Of course I would appreciate it if you would send me back the +changes and bug fixes you have made. + +For more information on the PHP Group and the PHP project, +please see . + + +PHP4Delphi forum +http://sourceforge.net/forum/forum.php?forum_id=324242 + +Authors: +Serhiy Perevoznyk +Belgium +serge_perevoznyk@hotmail.com +http://users.telenet.be/ws36637 +http://delphi32.blogspot.com + +Lew Zienin +Poland +levzenin@pm.me + +Nikita Ganzikov +Ukraine +pig-l@mail.ru + From d2be1db4239bba4b4aafe771d8a95d8ea63209cf Mon Sep 17 00:00:00 2001 From: lion Date: Sun, 19 Jul 2020 00:46:46 +0300 Subject: [PATCH 50/54] added: Delphi 10.3 Rio support --- Source/ConverterBackup/php4DelphiR2010.dproj | 122 ++ .../php4DelphiR2010.dproj.2007 | 120 ++ Source/DelphiFunctions.pas | 1 + .../php4Applications/Delphi/Project1.dpr | 4 +- .../php4Applications/Delphi/Unit1.pas | 3 +- Source/Demos/psvPHP/console/phpcon.dpr | 13 +- Source/Demos/psvPHP/console/phpcon.dproj | 1085 ++++++++--------- Source/Demos/psvPHP/console/test.php | 11 +- Source/PHP.INC | 8 +- Source/PHPAPI.pas | 8 +- Source/PHPTypes.pas | 2 + Source/ZENDAPI.pas | 32 +- Source/ZendTypes.pas | 64 +- .../php4delphi Delphi 10.3 Rio.groupproj | 48 + Source/php4App.dll | Bin 2192384 -> 0 bytes Source/php4AppIntf.pas | Bin 1952 -> 3988 bytes Source/php4DelphiDRio.dpk | 48 + Source/php4DelphiDRio.dproj | 799 ++++++++++++ Source/php4DelphiRRio.dpk | 50 + Source/php4DelphiRRio.dproj | 806 ++++++++++++ Source/php4delphi.pas | 13 +- Source/phpModules.pas | 48 +- 22 files changed, 2640 insertions(+), 645 deletions(-) create mode 100644 Source/ConverterBackup/php4DelphiR2010.dproj create mode 100644 Source/ConverterBackup/php4DelphiR2010.dproj.2007 create mode 100644 Source/packages/php4delphi Delphi 10.3 Rio.groupproj delete mode 100644 Source/php4App.dll create mode 100644 Source/php4DelphiDRio.dpk create mode 100644 Source/php4DelphiDRio.dproj create mode 100644 Source/php4DelphiRRio.dpk create mode 100644 Source/php4DelphiRRio.dproj diff --git a/Source/ConverterBackup/php4DelphiR2010.dproj b/Source/ConverterBackup/php4DelphiR2010.dproj new file mode 100644 index 0000000..113eeaf --- /dev/null +++ b/Source/ConverterBackup/php4DelphiR2010.dproj @@ -0,0 +1,122 @@ + + + {DB360964-FCA5-4943-AD27-13C4B2BC0549} + php4DelphiR2010.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + ..\..\..\..\..\..\Public\Documents\RAD Studio\6.0\Bpl\php4DelphiR2010.bpl + 00400000 + true + x86 + php4Delphi (run-rime) + true + false + false + true + true + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + + + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + php4DelphiR2010.dpk + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1058 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Source/ConverterBackup/php4DelphiR2010.dproj.2007 b/Source/ConverterBackup/php4DelphiR2010.dproj.2007 new file mode 100644 index 0000000..3d746af --- /dev/null +++ b/Source/ConverterBackup/php4DelphiR2010.dproj.2007 @@ -0,0 +1,120 @@ + + + {DB360964-FCA5-4943-AD27-13C4B2BC0549} + php4DelphiR2010.dpk + Debug + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + ..\..\..\..\..\..\Public\Documents\RAD Studio\6.0\Bpl\php4DelphiR2010.bpl + 00400000 + true + x86 + php4Delphi (run-rime) + true + false + false + true + true + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + php4DelphiR2010.dpk + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1058 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/Source/DelphiFunctions.pas b/Source/DelphiFunctions.pas index 11163b2..23892b4 100644 --- a/Source/DelphiFunctions.pas +++ b/Source/DelphiFunctions.pas @@ -16,6 +16,7 @@ interface uses + Dialogs, SysUtils, Classes, ZendTypes, ZendAPI, PHPTypes, PHPAPI, typinfo; diff --git a/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr index dfa3f13..0114347 100644 --- a/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr +++ b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Project1.dpr @@ -2,7 +2,9 @@ program Project1; uses Forms, - Unit1 in 'Unit1.pas' {Form1}; + Unit1 in 'Unit1.pas' {Form1}, + php4AppIntf in '..\..\..\php4AppIntf.pas', + ZendTypes in '..\..\..\ZendTypes.pas'; {$R *.RES} diff --git a/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas index 10d384c..b5d3415 100644 --- a/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas +++ b/Source/Demos Delphi 2009 (WideString support)/php4Applications/Delphi/Unit1.pas @@ -15,7 +15,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, PHP4AppIntf; + StdCtrls, + php4AppIntf; type TForm1 = class(TForm) diff --git a/Source/Demos/psvPHP/console/phpcon.dpr b/Source/Demos/psvPHP/console/phpcon.dpr index dd42a80..59005ac 100644 --- a/Source/Demos/psvPHP/console/phpcon.dpr +++ b/Source/Demos/psvPHP/console/phpcon.dpr @@ -15,7 +15,7 @@ program phpcon; uses SysUtils, - VCL.Dialogs, + Dialogs, php4delphi, zendAPI, ZENDTypes; @@ -23,6 +23,7 @@ uses var php : TpsvPHP; Engine : TPHPEngine; + ft : Byte = 0; procedure gui_message(ht: integer; return_value: pzval; return_value_ptr: pzval; this_ptr: pzval; return_value_used: integer; @@ -55,9 +56,13 @@ begin php := TpsvPHP.Create(nil); if ParamCount = 1 then begin - php.FileName := zend_ustr(ParamStr(1)); - write(php.Execute); - end + php.FileName := zend_ustr(ParamStr(1)); + if FileExists(ParamStr(1)) then + ft := 1; + end; + + if ft = 1 then + write(php.Execute) else begin writeLn(Format('Usage: %s ', [ParamStr(0)])); diff --git a/Source/Demos/psvPHP/console/phpcon.dproj b/Source/Demos/psvPHP/console/phpcon.dproj index caf51d6..3847e22 100644 --- a/Source/Demos/psvPHP/console/phpcon.dproj +++ b/Source/Demos/psvPHP/console/phpcon.dproj @@ -1,574 +1,511 @@ - - - {BDB76098-EDD6-4A5A-AF30-D7A6B0BCF914} - phpcon.dpr - True - Debug - 3 - Console - None - 18.2 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - ..\..\..\;$(DCC_UnitSearchPath) - C:\elsewere - false - 1058 - false - 00400000 - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICON.ico - phpcon - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - false - false - false - $(BDS)\bin\delphi_PROJECTICNS.icns - - - android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar - true - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - true - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - true - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - true - true - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - true - true - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - true - true - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - true - - - C:\elsewere\x32 - (None) - 1033 - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - - - 1033 - C:\elsewere\x64 - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - (None) - Debug - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - 0 - false - 0 - RELEASE;$(DCC_Define) - - - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - - - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - true - DEBUG;$(DCC_Define) - false - - - info.php - - - info.php - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - - - - - phpcon.dpr - - - Embarcadero C++Builder Office 2000 Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - True - True - - - - - true - - - - - true - - - - - true - - - - - true - - - - - phpcon.exe - true - - - - - - Contents\Resources - 1 - - - - - classes - 1 - - - - - Contents\MacOS - 0 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - res\drawable-xxhdpi - 1 - - - - - library\lib\mips - 1 - - - - - 1 - - - 1 - - - 0 - - - 1 - - - 1 - - - library\lib\armeabi-v7a - 1 - - - 1 - - - - - 0 - - - 1 - .framework - - - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - 1 - - - 1 - - - 1 - - - - - - library\lib\armeabi - 1 - - - - - 0 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - res\drawable-normal - 1 - - - - - res\drawable-xhdpi - 1 - - - - - res\drawable-large - 1 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - res\drawable-hdpi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - - - Assets - 1 - - - Assets - 1 - - - - - 1 - - - 1 - - - 1 - - - - - res\values - 1 - - - - - res\drawable-small - 1 - - - - - res\drawable - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - - - res\drawable - 1 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 0 - .bpl - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - - - res\drawable-mdpi - 1 - - - - - res\drawable-xlarge - 1 - - - - - res\drawable-ldpi - 1 - - - - - 0 - .dll;.bpl - - - 1 - .dylib - - - - - - - - - - - - - 12 - - - - - + + + {BDB76098-EDD6-4A5A-AF30-D7A6B0BCF914} + phpcon.dpr + True + Debug + 3 + Console + None + 18.2 + Win32 + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + phpcon.exe + ..\..\..\;$(DCC_UnitSearchPath) + + false + 1058 + false + 00400000 + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + phpcon + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + false + false + false + $(BDS)\bin\delphi_PROJECTICNS.icns + + + 0 + false + 0 + RELEASE;$(DCC_Define) + + + true + DEBUG;$(DCC_Define) + false + + + + MainSource + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + + + + + phpcon.dpr + + + Embarcadero C++Builder Office 2000 Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1058 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + False + True + True + + + + + true + + + + + true + + + + + true + + + + + true + + + + + phpcon.exe + true + + + + + + Contents\Resources + 1 + + + + + classes + 1 + + + + + Contents\MacOS + 0 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + library\lib\mips + 1 + + + + + 1 + + + 1 + + + 0 + + + 1 + + + 1 + + + library\lib\armeabi-v7a + 1 + + + 1 + + + + + 0 + + + 1 + .framework + + + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + 1 + + + + + + library\lib\armeabi + 1 + + + + + 0 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-large + 1 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + res\drawable-hdpi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + + + Assets + 1 + + + Assets + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\values + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + res\drawable + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 0 + .bpl + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\drawable-ldpi + 1 + + + + + 0 + .dll;.bpl + + + 1 + .dylib + + + + + + + + + + + + + 12 + + diff --git a/Source/Demos/psvPHP/console/test.php b/Source/Demos/psvPHP/console/test.php index f4f3614..97d44b7 100644 --- a/Source/Demos/psvPHP/console/test.php +++ b/Source/Demos/psvPHP/console/test.php @@ -1,4 +1,7 @@ - - + \ No newline at end of file diff --git a/Source/PHP.INC b/Source/PHP.INC index d7fa89c..6b8aca2 100644 --- a/Source/PHP.INC +++ b/Source/PHP.INC @@ -34,8 +34,11 @@ Define suitable visual library } //Version +//{$DEFINE PHP520} {$DEFINE PHP560} //PHP Version +{$DEFINE COMPILER_VC6} + //Compiler Version {$DEFINE ZTS} //Thread Safe mode (php7ts, e.g) {$DEFINE VCL} @@ -96,7 +99,6 @@ Define suitable visual library {$IFDEF PHP510} {$DEFINE PHP504} {$ENDIF} {$IFDEF PHP504} {$DEFINE PHP5} {$ENDIF} {$IFDEF PHP_COMPILER_ID} - {$DEFINE COMPILER_VC9} {$IFNDEF PHP7} {$IFDEF PHP550} {$DEFINE COMPILER_VC11} {$ENDIF} {$ELSE} @@ -120,6 +122,10 @@ Define suitable visual library {$DEFINE VERSION12} {$DEFINE VERSION13} {$DEFINE VERSION14} +{$else} + {$if CompilerVersion > 25} + {$LEGACYIFEND ON} + {$ifend} {$endif} {$IFNDEF VER80} {Delphi 1.0} diff --git a/Source/PHPAPI.pas b/Source/PHPAPI.pas index d26fec7..fefeccc 100644 --- a/Source/PHPAPI.pas +++ b/Source/PHPAPI.pas @@ -119,7 +119,7 @@ interface php_get_output_start_filename: function (TSRMLS_D : pointer) : zend_pchar; cdecl; php_get_output_start_lineno: function (TSRMLS_D : pointer) : integer; cdecl; php_ob_handler_used: function (handler_name : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; - {$IF not Defined(PHP540) and not Defined(PHP550) and not Defined(PHP560)} + {$IF not defined(PHP520) and not Defined(PHP540) and not Defined(PHP550) and not Defined(PHP560)} php_ob_init_conflict: function (handler_new : zend_pchar; handler_set : zend_pchar; TSRMLS_DC : pointer) : integer; cdecl; {$ifend} {$endif} @@ -268,7 +268,7 @@ function ValueToFloat(Value : zend_ustr) : extended; php_info_print_table_row : procedure (n2 : integer; c1, c2 : zend_pchar); cdecl; php_info_print_table_end: procedure (); cdecl; -{$IF Defined(PHP540) or Defined(PHP550) or Defined(PHP560)} +{$IF defined(PHP520) Defined(PHP540) or Defined(PHP550) or Defined(PHP560)} php_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; {$ELSE} php_body_write: function (const str : zend_pchar; str_length: uint; TSRMLS_DC : pointer) : integer; cdecl; @@ -528,7 +528,7 @@ function LoadPHP(const LibraryPath: zend_ustr = PHPlp) : boolean; LFunc(@php_ob_handler_used, 'php_ob_handler_used'); {$ENDIF} - {$IF not Defined(PHP540) and not Defined(PHP550) and not Defined(PHP560)} + {$IF not defined(PHP520) and not Defined(PHP540) and not Defined(PHP550) and not Defined(PHP560)} LFunc(@php_ob_init_conflict, 'php_ob_init_conflict'); {$ifend} LFunc(@php_strtoupper, 'php_strtoupper'); @@ -580,7 +580,7 @@ function LoadPHP(const LibraryPath: zend_ustr = PHPlp) : boolean; LFunc(@php_info_print_table_row, 'php_info_print_table_row'); LFunc(@php_info_print_table_end, 'php_info_print_table_end'); - {$IF Defined(PHP540) or Defined(PHP550) or Defined(PHP560)} + {$IF Defined(PHP520) or Defined(PHP540) or Defined(PHP550) or Defined(PHP560)} LFunc(@php_write, 'php_write' ); {$ELSE} LFunc(@php_body_write, 'php_body_write' ); diff --git a/Source/PHPTypes.pas b/Source/PHPTypes.pas index 6516dbe..bbca1da 100644 --- a/Source/PHPTypes.pas +++ b/Source/PHPTypes.pas @@ -308,7 +308,9 @@ interface phpinfo_as_text : integer; + {$IFDEF PHP520} ini_entries : zend_pchar; + {$ENDIF} additional_functions: Pointer; input_filter_init : Pointer; diff --git a/Source/ZENDAPI.pas b/Source/ZENDAPI.pas index 62d0a6c..fbed93f 100644 --- a/Source/ZENDAPI.pas +++ b/Source/ZENDAPI.pas @@ -25,13 +25,17 @@ interface {$endif} {$IFDEF FPC} LCLType,LCLIntf,dynlibs,libc{$ELSE}Windows{$ENDIF}, SysUtils, ZendTypes, Variants, - PHPTypes; + PHPTypes + {$if defined(chameleon)} + ,zend_chameleon + {$ifend}; type TArrayVariant = array of variant; TWSDate = array of string; PWSDate = ^TWSDate; TASDate = array of AnsiString; PASDate = ^TWSDate; +{$if not defined(chameleon_load_firstmatch)} const PHPlp = {$IFDEF PHP7} @@ -40,7 +44,7 @@ interface {$IFDEF PHP5} 'php5' {$ELSE} - 'php4' + 'php' {$ENDIF} {$ENDIF} {$IFDEF ZTS} + 'ts' {$ENDIF} @@ -50,6 +54,7 @@ interface {$ELSE} + '.so' {$ENDIF}; +{$ifend} type EPHP4DelphiException = class(Exception) @@ -286,7 +291,7 @@ procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE} var zend_get_constant : function(name: zend_pchar; name_len: uint; var result: zval; TSRMLS_DC: Pointer): integer; cdecl; - + {$if defined(PHP530)} zend_register_null_constant : procedure(name: zend_pchar; name_len: uint; flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; @@ -295,7 +300,7 @@ procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE} zend_register_long_constant : procedure(name: zend_pchar; name_len: uint; lval: Longint; flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; - + {$ifend} zend_register_double_constant : procedure(name: zend_pchar; name_len: uint; dval: Double; flags: integer; module_number: integer; TSRMLS_DC: Pointer); cdecl; @@ -755,7 +760,7 @@ procedure ZVAL_STRINGLW(z: pzval; s: PWideChar; l: integer; duplicate: boolean); procedure INIT_CLASS_ENTRY(var class_container: Tzend_class_entry; class_name: zend_pchar; functions: {$IFDEF PHP7}HashTable{$ELSE}pointer{$ENDIF}); procedure zend_copy_constant(c: zend_constant); -{$IF defined(PHP540) or defined(PHP550) or defined(PHP560)} +{$IF defined(PHP520) or defined(PHP540) or defined(PHP550) or defined(PHP560)} procedure zend_copy_constants(target: PHashTable; source: PHashTable); cdecl; procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; {$IFEND} @@ -768,7 +773,7 @@ procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; zend_output_debug_string : procedure(trigger_break: boolean; Msg: zend_pchar); cdecl; {$IFDEF PHP5} - {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} + {$IF not defined(PHP520) and not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} zend_copy_constants: procedure(target: PHashTable; source: PHashTable); cdecl; {$IFEND} zend_objects_new : function (_object : pointer; class_type : pointer; TSRMLS_DC : pointer) : {$IFDEF PHP7}zend_object{$ELSE}_zend_object_value{$ENDIF}; cdecl; @@ -777,7 +782,7 @@ procedure zend_class_add_ref(aclass: Ppzend_class_entry); cdecl; zend_objects_store_del_ref: procedure (_object : pzval; TSRMLS_DC : pointer); cdecl; function_add_ref: procedure (func: {$IFDEF PHP7}Pzend_function{$ELSE}PZendFunction{$ENDIF}); cdecl; - {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} + {$IF not defined(PHP520) and not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} zend_class_add_ref: procedure(aclass: Ppzend_class_entry); cdecl; {$IFEND} @@ -1910,11 +1915,11 @@ procedure ZVAL_ARRAY(z: pzval; arr: array of variant); overload; Exit; end; -{$ifdef VERSION14} +{$if CompilerVersion > 21} procedure ZVAL_ARRAY(z: pzval; arr: System.TArray); overload; {$else} procedure ZVAL_ARRAY(z: pzval; arr: array of integer); overload; -{$endif} +{$ifend} var i: integer; begin @@ -2238,7 +2243,7 @@ procedure zend_copy_constant(c: zend_constant); if (c.flags and CONST_PERSISTENT) = 0 then _zval_copy_ctor_func(@c.value, '', 0); end; -{$IF defined(PHP540) or defined(PHP550) or defined(PHP560)} +{$if defined(PHP520) or defined(PHP540) or defined(PHP550) or defined(PHP560)} procedure zend_copy_constants(target: PHashTable;source: PHashTable); var tmp: zend_constant; @@ -2274,13 +2279,13 @@ function LoadZEND(const LibraryPath: zend_ustr = PHPlp) : boolean; {$ENDIF} {$IFDEF PHP5} - {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} + {$IF not defined(PHP520) and not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} LFunc(@zend_copy_constants, 'zend_copy_constants'); {$IFEND} LFunc(@zend_objects_new, 'zend_objects_new'); LFunc(@zend_objects_clone_obj, 'zend_objects_clone_obj'); LFunc(@function_add_ref, 'function_add_ref'); - {$IF not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} + {$IF not defined(PHP520) and not defined(PHP540) and not defined(PHP550) and not defined(PHP560)} LFunc(@zend_class_add_ref, 'zend_class_add_ref'); {$IFEND} @@ -2515,6 +2520,7 @@ function LoadZEND(const LibraryPath: zend_ustr = PHPlp) : boolean; LFunc(@zend_get_constant, 'zend_get_constant'); // -- zend_register_null_constant + {$if defined(PHP530)} LFunc(@zend_register_null_constant, 'zend_register_null_constant'); // -- zend_register_bool_constant @@ -2522,7 +2528,7 @@ function LoadZEND(const LibraryPath: zend_ustr = PHPlp) : boolean; // -- zend_register_long_constant LFunc(@zend_register_long_constant, 'zend_register_long_constant'); - + {$ifend} // -- zend_register_double_constant LFunc(@zend_register_double_constant, 'zend_register_double_constant'); diff --git a/Source/ZendTypes.pas b/Source/ZendTypes.pas index 63588f9..d0d768b 100644 --- a/Source/ZendTypes.pas +++ b/Source/ZendTypes.pas @@ -35,43 +35,23 @@ interface const ZEND_BUILD_DEBUG = ''; {$ENDIF} -{$IFDEF PHP_COMPILER_ID} -{$IFDEF COMPILER_VC9} const ZEND_BUILD_SYSTEM = -{$IFDEF COMPILER_VC14} -',VC14' -{$ELSE} - {$IFDEF COMPILER_VC13} - ',VC13' - {$ELSE} - {$IFDEF COMPILER_VC12} - ',VC12' - {$ELSE} - {$IFDEF COMPILER_VC11} - ',VC11' - {$ELSE} - {$IFDEF COMPILER_VC11} - ',VC10' - {$ELSE} - ',VC9' - {$ENDIF} - {$ENDIF} - {$ENDIF} - {$ENDIF} -{$ENDIF}; -{$ELSE} -{$IFDEF COMPILER_VC6} -const ZEND_BUILD_SYSTEM = ',VC6'; -{$ELSE} -const ZEND_BUILD_SYSTEM = ', $DEFINE COMPILER_VCx directive error. See PHP.INC for more details'; -{$ENDIF} -{$ENDIF} -{$ENDIF} - +{$IFDEF PHP_COMPILER_ID} +{$if defined(COMPILER_VC14)}',VC14' +{$elseif COMPILER_VC13} ',VC13' +{$elseif COMPILER_VC12} ',VC12' +{$elseif COMPILER_VC11} ',VC11' +{$elseif COMPILER_VC10} ',VC10' +{$elseif COMPILER_VC9} ',VC9' +{$elseif COMPILER_VC6} ',VC6' +{$else}', $DEFINE COMPILER_VCx directive error. See PHP.INC for more details' +{$ifend} +{$else} +', $DEFINE COMPILER_VCx directive error. See PHP.INC for more details' +{$endif}; {$ENDIF} - //zend_vm_opcodes.h const ZEND_NOP = 0; @@ -853,10 +833,14 @@ Tzend_class_entry = record get_iterator : pointer; interface_gets_implemented : pointer; + {$IFDEF PHP530} get_static_method : pointer; + {$ENDIF} + {$IFDEF PHP511} serialize : pointer; unserialize : pointer; + {$ENDIF} interfaces : pointer; num_interfaces : zend_uint; @@ -867,7 +851,9 @@ Tzend_class_entry = record doc_comment : zend_pchar; doc_comment_len : zend_uint; + {$IFDEF PHP511} module : pointer; + {$ENDIF} end; {$ENDIF} @@ -1192,10 +1178,14 @@ _zend_module_entry = record request_shutdown_func : pointer; info_func : pointer; version : zend_pchar; - globals_size : size_t; - globals_id_ptr : pointer; - globals_ctor : pointer; - globals_dtor : pointer; + + {$IFDEF PHP520} + globals_size : size_t; + globals_id_ptr : pointer; + globals_ctor : pointer; + globals_dtor : pointer; + {$ENDIF} + post_deactivate_func : pointer; module_started : integer; _type : byte; diff --git a/Source/packages/php4delphi Delphi 10.3 Rio.groupproj b/Source/packages/php4delphi Delphi 10.3 Rio.groupproj new file mode 100644 index 0000000..ba7a357 --- /dev/null +++ b/Source/packages/php4delphi Delphi 10.3 Rio.groupproj @@ -0,0 +1,48 @@ + + + {D3946CCE-C89C-4195-8C9B-ACC8FEE61B03} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/php4App.dll b/Source/php4App.dll deleted file mode 100644 index d25d474ea40f00cf2577bcd09b2c3e842a603502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192384 zcmce93w%`7wfCM!GLvLrCNN0Ah(V)5K_mu|5TZj~hWC&cAqW^rV!)83$r(W9k@S$t zVRw4d*7ml&e)raEd#`Q1Ep4sfqji$O1Q0cVg#ap1sh%)Cq98^<6Bw^t5!E8)z#NNP+zt-X|1P0O1i%ysoqnQ`w%=X9jq;~6Wb(jlLu>!IYql!jnjHrxN)I96gsQSUhB zioFzNid3;d0{F#W=?FqSo3dI%oG=PdA8@Wg`d_4jflm_Qm6u6n0Qubb zA|2%;eQ_|J3&m6JZ)iXX>#W3=YaBgZ?&F)XS|ccQ10As$KpQ?7-$nGwHAK-yw3XR_ zmwOq!3XPu7IfG6~rTLfOxu(=>crXiel#W+;IlPMM+Eu`zz6teF@g;bfQ|cS)2~G5E zsE-}!>xhp_7*qs+Y=}P6Rq!;df9l)pa50l5v$nRnqO8V1q{J7XQMqN+4Hf3XdQU}k z!9xvF#adF?G?W;vvuhewXH}Ke3tV^&p-tvSS&W(BV$6^`p(?BjaD%m=sC*^;4>6|C7Exygl}8sv zBEWZQA3`WWxglm@nY4Oc1&|^nN0(ArtX4)8BBg0TnK`;(b^yg3Iia!DR0iIU0Y`od0^mse0n&JV#S18%aC&dF9nI@vM-;L94yy#k;5g7As7=)97z z!vCJYpI=+^0O5yKw(YC%Uqr!(=myaoqP`#bxL6WfYa+qA0gH{LCTcM1+%tgLEX8H@ ztINpTn0X}H8|%(py`iF<`s1YD;6%VjMi*vPmo+qe?|Mx+Qvowr^73;Eisl!FMKrQJ zz=uZ_-cvLu+d-P44;2$F`WTJbDMq#*If5d0yOxXAa;YRMW8|z+Hq8hrqgb5vQwVx< zZQaV8Z+ptBS4$6}m}DD~4Q}T76_t=)JV)iPexM2&Ba54iI>V{XoSKTST`T5A)QZYk zTSqL2I4H%q0E^D5uPBo$G@xdE=4^O*5*L!hWUhW7r=}cwB;GMwht@D%^9;3EuR*$q zn_VE4kq;=Z*l<}QApDpU{b6^bCo1YI%T`t7)JXLYJq;i#>_9TyUO2cc5tYP;bSuP1 zYBbH6lZ_hj7^swuE-oy?fHAViA%>G6mN|lst5GZ!e+Pdm{DkN~G7QwBL z8Z3*TF#|vp&O#C?izwTjLqgy~wTTsdjIp8(S+yQvaDWIaun=^0MT5qQeUIo_3KvvJ zRkh`03gSa_s1furVw9Jo36vKUbk!PJG>hA|@hhxl8|a3tg`Oj<<#E*c3TwGSt^KHF zCmXv*SVw(fRap(BLt~92u24-ywQGh{TU0M>`)kzB+oU&denmsW*W_4^IwOf=sLt1B zS3TMVnFc;B82|JM!M~H>5~G!1Z*F$6llYtb9T!W+UpD^o@HZcSF8r0C-4gyjgfxuZ zz_z1qHaipCfix588+!UB(k$fD$7t|1dio=z1n0& zykDf}gFh1Kh2VaX_6Osj!+Gq>;B=&O*~Q@fNEcw%WXw{y=>9botE8LR{!L-0BPMVt z*1`QC&$xC7JaD%bZ(ZQSp^H6Pa~0{8RSohPv8@iba)QiFg-t0MRz5W;L8r zgH%?t3Pg#aRg7Tp4KWs@&cLi8G!o@DR)yO3EQ*{wb)k~4WHyl{Jp!r3j8gbe9XKVx z*k^S%1T`=Nq5vaHW1XlICx}y>ISr5lWAc((My-~akf`D$ zHh*KNqPq-1gA|sFnvYLd^%Gg*cR~%AQ&U+B4sbK&HBTQ;YqWw zfoW545~;++TWp}a1wzyb)Bo#3`npg`a_e-o*1UMm5MwY_5hSnDIu8AdLYP*be zrLt~Ruohu}NA}bZ;}|rOrm^xySUFWGSXE2I^y;H8RZIiXVm2EXc!RYfa%hUKh)H7B zh=U^X${MO@W)BaM!S#$RRZK3{!dfkg4GT0FZ%`waiMc4gpscbY3oEOf4XY~Zq}8=G zCN^34oFP4?%VyK?GcMm?CqvcH2KoLz}9DXSJkyxy})BaI5w2ZP0; z3N#mX#T)je?m^`iIzRRRlRobwEX$&STypDlc7GThqJs^D9-D1Wao?TH{ z=Bb8WYs#xDw52Fn)>W%d5|ee@!ix1F&lQ>s1TVBM>8R!Nlyc(qX-*%M%vz z2A6mY!B72D^2Ha|R%1(|IzmFww_FM)c9)fKt1gca3SSd$bcx3h{O33Pqxv(l-=HqV z#V7QXF?*ideNWE9us-i#j&+yBhem6%5F#`($ya0fJX>3J8bNaE&`LJ!V+^iDp$S#W ztuA{2E>83J12jZCEknhjMqgG-*#Ch@POE!CE#{Eg`jTX#UQMvkg*t4Cdr8@92|F=` zRaixpe-DL5jDIA<2XG1p;n=9~?y zC9Sf?YaNXoH-vRD|~SU;?e762M&A&NaWzhafAz5x@LzIvuz1R9}i zSni_rHDUc}%@rEbXzJ~yHqiQ?#pY5Qbt0rZrv@e6EcR4*DzGsGXo3b6kWiyzSj?X9 zA@C`vkis+w4NZ?F_h*?Mo-c`A?CdZWDJ*99qk|P@7*Yu+-H|9{ibGID?^+61udS%{ zh)#^Tcl#iXUyde3wiebu6zVFFy$sfeUeF;Opfz8MvF-bVDwu{yDzZ_tHPu}zwwps2 zZVz^qh5jxl(c?g|3Y6K^)nA3R>t-ywV&{b8P{JdV6(66L4rad); zpPKQse=%q-!(Rpd!ZL$ah+ZAw!omR~hJDCy#9!#sJwbzAkCZ+cNXf)6H`g}?Fhk>S z{&!p=GWrFc2lgVUHkOZMv}QcUV6atQG8P##u|;4(OZ!HVo)7*3DJ|vUV+Qu(%C%9D z!iedWqQf^)n+-%#DMG?4MTbKwOk&iGuN9?{t}K_zNGcr?xEPpm+9kHoSD@-FRBzTuD=q0}BJ+PjsT(1f^|PVWiyzi>AHQ z>C>D-I>ycrEXEx=RCrtmGuyWWJall-8GHu=@xWC14_7r{%-tjmQrlUI^N=>+8!N%ES)o;H^*U3HlgqIn@-^gFqMFuoKz#!=hm9OeQ&6{}ka}|?5Jay+!bzgdA^uKeh29eIFgzwqL(B@OiG5ZK z;E+gIpRCozAsAIOMo|QT9o?{eak|{J1)_mT3}Xy=NWC&m)HHJ$_3hkF$VUU(7%dtW z+8=(JWQrx3FelVQsVkLc2A(hRzTjE7744i5Q8`_4p1q zEvlIIr?fK)(XN>MiiV2%brt22#~5K?bs*jBHv6Vky=R7$by$dP3)2AuMz8?3#ygn)j_R9bxPd zm8`}3I2{Bl3Q>9r_8=s%6o*X*wjfL=x|k$|1=5GUp)8VnFofExLj;}$&M6drDCY}JxJ${!=wlGshai{EYgFy)wN}kReDg9 zI|>gK62M~H3}9_H4uB<88|3C|hF3y`!D0(7RdNBK; z8i7Y*YBT^83^5G=sOuHA-SxGrD#|_e5eMb>-iC2z(Z?$(SbQk#3_G=m5kS!weT)&d zM@O;(7FA4bGO}K{ZUKlX4!Lh5n-KyIHV%Oo(e-^W7y*kec5BqM84xTj#i0O}_M>$q zeUEj1NQRi=(21}%!~|Mwv3meY4o5)aV3MH|SF8?TnF1VBJTPjLLO^S=-Y1%I3dC69 z7({18K;wh}S~nQko1s>R$4!|1aE#Q5xfC;UNU+$I5pGPJO@f~>i z+NFQLIY-Nf;6I zxLI0$t)Bi~Pe0SsJ2JHL4SM>Vp2pp!!B^<%AN16Gw+1iL)1T{Ux1QeY(#os#bcdc^ z)YECR^>RIZN>AU@)A5;F`M34-k9zvCp3chB${*I#XZ18LTZ7l@={`NZK1YLl_4GqM z&CAu`zthv3@6qx<)6;QzTK-Wz{Zda?!M3P>8J4dL%IX`c%BpW>w$H)?%*5zJ+ss|U z3PT$|>?Y;{77pk%A7RoX0fX4iLFiXNgY{-MA4oBaJkpi0Ca@A<#m%X?3f>e}PJ+#D zActpS6zOB1If9{!K%pbLDQx3qu!WeKc!RK~v&VpK#VWXV)q)C~iP5OO_jTx=;uA6zcSSZU=6%46g9TT+)cCpnerd(Nu^7hC#PNsGT-k8^J+= zj$vg{daO(wrk%bD2O<#WK7k*NmBMV zC8^KP;iXgo+Z{=glusYWH)y!lSp!loW_=)O6%7}i@l9nU9V1E!%b3GlAUL#dtk_G} zK9`H0M0em6GE5|wl}9#|Y@I$=p+Y?{n98N%Tr zgUS#+Uqup9ZDe~EGTV8$!3DMJ;6CW{l@_msm|Fc%I7!R$$Z&Exn+$3(xcwbo4~VWD z66P9cN1kFzij}eF!Zx5*Tv1KsKs^%W((pWT@EO@GR)Tu^g@CK^)bC$~c&4)!)V1k% z3~(2Rt~F|QH&j>>#Smdgcd^G&HC`+wv}T4@ESIf6gt43Xu2_4B1q`Y!wv@4jLD!qy z`X!y&%yj|V?t`S!cWl0*L4!z=7Jmr>U%NSCfrT}gSpO|#d#+e_NMj=EUal#3u^IhC zB`K0BXMEjulzfxg5waLr5!-;e4w^j%_b3_aSB?m64$#K7X?_Lvvc;t_ET+XB(g)Zt zznbW!D>*tYz>U~}z7^((sd|77u3B8mri4xY5;wCWWe@lNKO=q-s|MXcI?+1gpCMYq z9s^Nlq_DKuFRClV^;aVN59%d)LD_~&RkM1U5p7jB%&A$m&{K_fh>UClyYC8IF71m! z{+GII2p8LBxQLN%jWlc{Yha!KFyFxutY(a%ne_@yZDwb#z|tuWBT2QFjU{NF3kS`* znd*UsVEJ|1y_(epVKIYxH9T1VH#>G6d-}?ZuH3i(ppGk9FSrgiTFqztZ?>%gPGa^~ za`}JKFua$7-BC+;3zc^2hg^AJFc2~yY>*9$73Xu}Ds?|za>SdA*VE|)op=z|1mNHu zIXc4=I81D+G3Fw;!|g6x^&lp9DyDa|DzK1&shm<*pB7JC;LK6{vj4@PI-{MO~ zJu1|If?ednIgBrK34l(%#KF0^t4-It#R?I1yFep;WT7~`o29+FI)#=5=Nbc)7azDSMc&U@}lwTN^OeM|H0m%vV2Nx+}DNq)3Q5NN1}B z4S-Fmi7^hRi38wSusLeE(Ha^D+R0;rfQ1eoX%1s-!vf$A!&Qw2ZKlL2 zbPGVDosZ#R_^`srvXEjm1k|UGF}f z_37!0db&$bpV8ADdiu1UKBcF>)YD(+>En9(Q$2l5Ph0f#dwRM}Pm}a?tDZLM=|(-> zpr?|a*6C@ro>u8;xt`vqr}yen^StCD(GFtzgcj4dsF)ST>h=P$16 z|8xcGc@GZM>tey1DAxi#I`w)EJ+FEqTHR~zU)BfkQewilnRgC0# z`*)FY^bL}OaxESBs2;l*44%zSo@|h!>^tvGp3435?(AiLA^TLF z*JM4Npr?C~GB%rjO{QW4JepKdp0u`NZEgKSNq7tM!KA9PhNRk6tLWDc%BLg&l@(T1 zL?SoP6q$5C4o4ppH5!ue&g0Bsu>!9FxAaiIGO_}Z6->%kd)6l5m7=8Tvib)qG!j~E z!6)f{x&}2V4haD##ww{y{q2sA66XB(_acD&H3++)`8wIaFIy5VzfHYnzJe+%i~k#<0d zhsGtNzon_Cf9?vV>}%~Y*`GbU3pN})Py0DkUkIyE(pvDQ=8 zrc*)0RAcsz-`CVePhQ*Kh!S6HPTQwg6}MS2DznX!$=@=R2hEs=x??mRyC??^-7y*m zIYR;!=An8|)Zy{0tKZZ zaQz6?j=UfeD&fNf2`Dr0oWG@@n0KihIBU#RbVs$SH#m~5Vd{J=8k&95LO$$1YEfs0 z@m{1)QicrI!1pz^5-R^x{@C0RP5%9_-N;Wmt=vKMC%wX3pCsAkSB$(49o)ZsrI3|)$h+UDDy{W-9iQepF+%i|!o(~3f z`~vkPGR;0u6yXl%QnEAs<8{%KJ~o^Vyxtu2jO2I&fjg5G2RA2k@PlpXLh=rIcd`&t z=t17y%|GLPfU0KBUJ%yMB?p}8Z`nWq@Q2OC@W_~JQZ@M_gH0QgG07X4r>?0y8Rmg@AD(mw<&N~uhI{$nCLL;Oqw={;?~1}> z>HY>I?;_nNF;)OXn_Fd~ZPKlxN5arkAP)_VCQ%(qot1Z*N^SBhR;AR&PXyNUm(`6V zFLm3RrY|SQn%O!l<`WH<>cEHcL;Uq0sNK}P9qIv$z`)%H0_msgWBCdB6Nj?i8n}(O ztJ6YsZfLrw(+TlB#5?$F>gyVT77(BrD@pHjuiMmm%9Jq~ZoOdpFtSzqqj|9Ot$Xdy ze#Z%W^(MZ&p?f*=6!QWr&vZQ32fIi+CXJReorW7RJm)$TcfT~D-Ncq*XtwZz1pCf; zMnh|QmUI0&LQ>{APzWTge6CelYE$M}^$NS7SeiI)l>S5ZCk^C&FeoR>0oUo4&;WV` z=Kc%F5yrM}T?wf$dbR@^c)EB=Xw;>JP;RQmkd(ePK;wPTxHp1^h7bc9xkRJG{?`V> zjdzeUl&A?={~!;OEru!ioY#P@tI$|CsiA{muLi zaxs8Kdw)P~FzraaQF(ph#fbt#5v76g_MKVLN{1ScURK&M$Q=JkE#79Lk=1^$e0^%Jly5~Py zKUPc#6T5_iR>XV&H?5TP2P{gL+Jk}F9z`mG*%mK}=*nC(xyKo49iGucW=VAAC^Cpp zS1RWx9+R&3no|clP@j?P>R-r+tZ2Wc`*}v_UgxLul2Vs7`|Qds=Uy%cSJ?EBB`MDZR=u zbunyB*KG<-x-IAu`JGHt80{$IY{S+Q_MA6hwP~|!rwS&ZJS$4L~ zWZ(J|@;YScexBEVw$)OAX4{*$QIp5eC`443cA)-FZ{m+#fTg`sZ>BaWhm=lrkv7R( zqa0P*6hGuYkB&g{!k0+82(86CKPG93awNq!@qpYJ9KXlVsgBWVB{v1d#9&f3^yz#+ zr9yCSWBS!t-#i)OIs@!Ux*b{Qkxr2@4wg~H44D)&M zvtTf6f0}{W7Q=vkNpM)-3wAKNaYcVjKv~hRyuz1Y7#Tb<@;?!?C7leJpdd*W{MzPRkc!-LoDMz65CywyBag@ z72$T-8ioke>_%kt@m-9$i`Se{SAQG~y46}t#CqWqbqH+K*Qi`Px`C7}kme2`aliUB zVHBY77EyRB3IoHd97&877ohj%e1hiE;NyGv0jvV}2$-Ge0B;j(0+DMz=rN}HXl<&m zd!(^^6gi0W&Uy#$Y-*!rM!JABm}Q^CKj4xiiMq*$n$*6{X>LC5d4vDWYc?Z>d=#5(7%cK`r!WM_@+m)t z`1Cb(ElNP5UE{-#q4!6~zCE1TpS8O9A@uxT zz*RA}t^$tIb006V^8Ay0Px^uN!}xNmsh}6mBmF?bXcVOGRp$1tNyL-fb~4|sMxkeT zj#b{!Ypx%Mho%i@Xr<>Ff#y+x@9VQ)HLn9OnRU&jAVcp+CZWF7gl zkFbt(VofL3k&i$N`Z}_4P{IA8!1J=4;Q%i4B&^X_!nCe|31^~Oc5X8AbLS7ZT`6ob^U=ZBKN$jM*IdtAIz{fM=}FgF z7pN;a{T%;TlS)gJRyC@%+X|ELKGVkXE(W~|-t-oA13~S8ukKlkiHqlSW6gM$8SKsZ zT2@^mM6x$$ioCVGF?i3#AOr@gx)QNG?`sa)oBL>}6u6J z`D{wghdk#@vv2baN={efrVp58*n5gn)5G3?#F>lRdR z+HHm(b?14`qE6H9ZuolisJEGVE_Lto3>!x3?=iu9o8Po(5Eo8 zW#AdKVbk*+(8L1yad;51p03Bx#P-0{bM2%LPw}~SI&6~SiZH+^URoN+YWfS2AwRL{ zPWgT8dYF|ze+URLW&>lZ&y%F_U|cZdKc-UUF(FY<1NqfxoulXbe2cj$NLxtu=6YBa zzm7Ir0(X*+aHyYXTRAs}C^pzMmK1ObQpz)tbeEZ%F3^sRWE+rjuBx;&Ye&}M{_rx9tN_vxqlJb)BGm# zTtMwR8I-0pp9G}6`7FNKOVrm~!|C-l9}j*ROz*NkIvHA(?_&1vUW13mzX(Y@1BBJ|3 zWg?fXl}&h}n#z6`Dib-YR%YY5{g8Qt#$L$0LE{_^@Q)BP@~%bl$5uHA=h2P<5Nh}} zjTxn|5GD=N+9vzVPuV>-Eu(d0lTbFDb;+Vrl7e39J9~2p=*XJQZr-BnT*BsxrpZwH z#JwbS-yM2uMJ`_m#Q#k8zOeah{p{S-pf<3y-fs>{1G>}t8oOxfD;Si#E7a-hvw4<&jee=oZ?W zzXhM6zJWgOh$1IKe;rZe+vw@9bOGS`emwCug()tx+-6xX zIb~ncT+c~my0XsvJjw8!kfBwRq18Iqa~d1ov@No0Bfj9d!GWot$B>^E8{xcxcyA8z zE>_<<3Et<@PkT-&*DA}*+L}VnNFed05l>L+R-bt{7z6>zG-lXn-&~4PU&3(HBNSQ!?GmX%)NoX75cv?EWw*|Ttm1Fr~ zs!o}$$34T;|Dbw5Md!1Cz41cg`dIt3e*3dOtwUS!#1E^#gT`TXXcy-9#oKa%yvS^S zHYcb)fr6zJzv7%%Edd#M7m>l?Z;8j?Px1Ba*ZZmfvE~evD}oJTNA+7_rt0;0MC)3p zs@|5gPANtHB5D0bxyQQ25={1%)Zt(dM`RP^FRYv6aX=`4;n*Bar-b^+APKXM1q zp2gpb`19kh6MuihUpM|f!e1Z$@=r|gW*hpv^JDu?OjvyGsQfNHTT8>oY#Tp6F|!nB zjhm;Wb*?`!abH@e*BQTV4@6lkL@*qX-|3rpK*xuGpD#TzllWsbv@OV*Qoe zy4_{O)3!__>|@Vl%OiD$Gp;HM!$>UKu_Re`0_A)78z?^sBMppGXA`6kK|zOl z5nd93`B}+|X+Sb94D>YZwjm@U*T;SG?!H1b0Bj75I2;z| zpy2qsM{lLn-?D}sot0eTZ^3?P)P1mhDcWuST_PaBweK{$DJ@vck16J4`9f^HWrtZE zMy)U>+n+TjlnVQ&eTbv{GeWtjp`1eC2b67zQ)!c6F-nko4*n5i$86ntP%_&Z1IFYn zIQkOMZRXfgKdpxsYs;JG$?A!H(e6C-HrJW3u(%j#npJ<=r#yL+`Z2`R0b zlr~Vcf~rm4?GXLlt>I|xUJT=iYX)_ z(RM3op&^bK-Wt3cc9^4;5sH<0Mj>%(^&CvH>@xbWH*|xBGDbrgp`pYfaWJt1fYm<^ z;QTFL(Kd6k-sLuTrTm4Vet2cm7ZW z3N8<5U}6tJ2_Kzk#u9y@z}R67(SdQ7EeoQ|g2gDhjQW7= zwSXVhOcsFyjvmaF2qmz%Q>_>zUYWG_vwSxJuBTChg?o_|hrLBM?6ofw28{6qIuYPX zUgW66thT((hC5ZoOXS^Wc&~R>@~?hX`KzNJAD^83)=_!44Z&dx#t|gxRjY>M=;R<~ z)SY-J|CcDTB%shfPY5L^g!0%Rl;v$^@BrTNwbrA-ebsr-DX zT>j8@Vq>!T-^q^%rk+0>k?eCSBIlr3snH2%m6A&1p3 zVq&G;jf1zXGNexNr5t~0|Ni~9N-?Fcr|4^^?;2*586nRfEsarB}gjYWKxgrMPC_ zrm8?3*ao7{b!}e0VcD{YZwHoMd|5*aeD@`ElRaEVIt+Sc^=42`3Q=D-98d9pN3Hi) z%KljJdZD%39LZ_l#aBJXb6rbQ&K~$!xm}wZp9@ll(Z&w+;YQdnzUd1BVYNcZ_OY2; zk4w?6Z3%Ncr%NYxZZj_Pm!|jv=Y-8HQ94qNZ+k^KictAC6HmCd9XRO2g`%{h4JNBO zZ6(dU*pzEmjx@bP#O6p&`_Al?pnYdyS}?8CW18dn5My<_Ic2*uZAPc(bj)64{Vm(S zm1&*ey13VK*59JlSN5gs#UbZ`)4$pF>4XEPfBA=`37?++4UO|2+Kd99f|TRUzKsj) zTYrvx2HoPcdzc-UHpYs2#9`Cn*|HE3mx2 z$p^(gIhn#0?mPb8zv-b1_hE8q!s(BHM^w*4lyYc-w~@_LY|jtN{yp5JZk8Ae$LVXZ z64Z)QeMMD&e8k1dgHy|uByUka{6-L=g}kXBGY2gO)Mp?@V0_TiU$q~I-l9IhegRm} z)5qJNr%qAtm`ZED(xpqw6-U)`gq71L{s%bqLK6C{C+!+cpMe$2mSRD`cHs9&sX8J) zHU)q1qmk0wwQ;aCcK{X6=bD>v5<_P?lPSea5+wk5c#|M&3{P0GRCKG~{~Mhg8SRf@ zsiX^(1BzZC+J!9tGYYaG_JlN8owzz_fyjkjL0NwFeu$<14QFq>liG>Ht;kWj~+nmg{xx?@glugZ?V6$*JKTj555COi4!kFE3Re4_poJX z9b%63Hv3~fw27WEE?`cOBK5ekybl2u24^3QS9wclgdp-ZVJ*Nd>LcJHChAn4>x4;< zG<7H@S|Ls6CO2n6w>dD`yP%I3CtwX#NkdAE<87rF3?o5eS2i4r`s;5)+ZYc@I;!F% z2!TRq5N!ujjB52R)bRIIjnD=WT1jIXz6R%rSxli!{`)sw*M&FOV!kAv4+ z)9b7_v8=bH*V&|zvJaYmbD&3F7MC|<-_zPSENwlw4~V#fj&(H~S*$s7WqChPM`PK3SZzZq zff|c=a!0J1fD=GCOyTcvu@=i*!eS`IUS` zWz0coOl8w~=4%*%p`yA-h}IH#4O40Gol-cPvR=X!HbE=;V^w4*Ubyyr`?HRGmwOGX z>iH68cJMWn_G+bDlQGRPxBXcYE-e|tD8DC^t^%)KTr4ijh9|EBC>4{J55|aDSjY$j=|B&-^S!yzYBt)F zvUjVmv_v`;xc1L%`@JdAXZ?+ycWzINr}Sv!dnY`db37mLTqAj{h(4VIN2kjW8k3j^ z-@t%*X$`EIc4$_BdU)g@hAU8BPdT2lcR<$B5DmI?K-TnPqm+Qq*6=n$Oij|G-a8J< zE`&@>ZjZ(#oAb+7uIPCfG)2s=wHuwn>s~~&QJ0z>4^*w$lf6=kWs&DIjaFA_AZ`0t zlmt|*<#Vweptt;kz?e|G-_zTDoZ9_5wL7}h(5d%ont zp!-b9LGS!zM>!v>j8RrwJ7$~zXRC|h=3TiGy9~2z&vsn3z!t(}?y|v)4CmHAHn}l- zm8i50q}E{_O18xv!TdhhCVW1|Go5ay9xSSgYbHm3d%1E0Et!FG5@~pLv9_^;N`wxANBKXhr?Ab6?2k&44pCf#9Rm<*y(a&i9Dj z-9z1K4zPkW^=!f!4a6e@YQf$arV{cSBQg5zyiNG!Ui%;7(mQcMW4F2r>J7Y$jWmuO ztKLV&-cBFeY(3qQC-<=}x^8Gb1eu(^s$Ji8v8pb7sds?CTfGzCw7lC6hM1->-qdN> zV21a4L=EhtQT4Fr+Z^-P`42F`Rc>_9YO~`s3jV^0%Ny9r0%{@b}z<1ExUl3oeL*CAf%t@gFD6 zuYF+ksgm_C1yzW7Wr0 zFd%<~jeqsX-XIQTCCiR6>PEn6xi8~C>LOg5x)1i>`)Cwp_1@k*O3pBArMu|P3rZ=g zRY}}zdxCJ)zrK&oh}}gmrmBC$Gap4rire8=3s8wWusBE56Gxjpyp8CH_?hk}X>!6d zJz}Gih%6hwgCq|Yo8c>d4qC7VA$ylP0bLGYJgUq4a9#i^`aUZ8Y&AwJ{tR9elaGv2 zRMlc4ZL100p#BouNvV5_s%o}TSEiIJVC3eXu#|bj9sd8>wq< z)9|phh&X73;s|%62b54o#2Y}|-?Iq=HSiJWP$yz+;vQ8mE)Dha8VCH~17^mynUfo5 zCFAJ-0Za?HGO~3g()R3R18e@s{{0`47TxG31tAKI7dw#6A8jth@vwA_Is@=YfaAxL~e<-3^YmQ>&K$m5dyAFhEVC#XGG5-PdYj$AW=QNhr28V@vysN*p; zEolB|%YPB&B=zk*f+OvES_g4xLxo9wd|dN!`_^>m*js>zggB&kd3x0U)~cD&G%I)@ z=(&#ikH4Pk3l<<4us??FZ7{e|-E;|qbz*atm`&=#*;9~|A|>&0XZ;4xZTygY$|&zM zgn4~H8Zrc~;p0S682*WXH*SO`>{}`35M=D?N9~bq#|C;bwjad_qL`b}A?<1pbP!x< zmN%Q3XDW1^YbEM)!?Zs==f{u;N>1QTgdViUrS45Vh{g#&1;cBhIo_{6gmU$lz!vL2 zI&MVboInz#=(r8h6cY?sI4tnMAzuX6sxDubxjxX ziY(h~5p)87F`W%O7kUH7A-C=4BTV!vk+ybUtg7IRRz)lDnu*Esdlx}ysydFO>*Tg% z`5i;tK160UqI^dbx75#svz>gmR66;pu)X>~Sy`up!U*g8uZ`PR}Vl z9f#7f+?w7hWEEZ|5R0=PP42N_8CwTryhX^EB4pI(<^p~!G95h#=KWub! z$FF`452V7wg!Uj*)em={W%XEsS=i5qug6u08wR|@NT_e5>IagNW$nlkUP8N>2fD&{ zsuW!;=%?d1nn+bJc?P1vH2j;J%(qfI{J7JDXadtjHdjupUiQWyDmm<^)QE_O^cyFMv1UxVsn9sS) z*h|55H4^TuX~x^Y;BLH5>y&Ex)h7ec+o%L6rTL(J>!-jA9;CSH0~$OycH{Gt%}r^q zo&RLGbf+qAH)W)d=GNgIN1?*?Nr;Ed?#1fbR*Je zJ&oOq;0`cj$}i}f*IM~XbH_bq7Z7EClv+v7|Gggkt{PL@fz0XE3&!IWI$UFXwzcPR z+=dl9vqN=N8`hO{eZRWt6luw+YpDQbq$N*mPaYoe!m`-vvr@3Y@z(RwDDSspl$Uul z+)I}738L(~v2yK`?&Nv<(--Z>{a4o>zGP3z-tE?zv7Q)LrrHz_TTH-q6Y2y#opQT% zp2tUXU61I8>}2Plew!T>JqEobs<*>sXo_VKibbC|(I-b=3iZi@gIcyVVUTNHFcMC1bSf)&|m~s^%acG;3{*^E096G z3%Hl|gY(17_runIK^@H)imK{_PFAnqI)RPcp$0gMw0UtLlq6rd_F2!*qW3UtV;;iIfHeM zV4W>kXARbwgHzX7f>Yi3YQmfFoQtpr8{^~-aR#Vlkjw2(FapIus!@E z7gK#TXnqTLGajpGqao8K-)H_(voCBtWm?roVeRT);mK2cP)<2_EJef|KhOlwRM%gI zkX2oPnx(uvd2)&mM+4T9!(Xo1Nj+0A*`2a$x4I*qQN3x5;XTbaP}P8+N=N7>E4W9Y+G!?079O zVnN0xP$g*eLNrQsAD*e6=%eQ{HFp@LaxhB8<1{w!;4~oN#7>K zezk}ePcR7@C2fy|M+v_dPBdLO-U27jN3&ReW`Rw;nWBMVHZp;| z*cLlLPI%W*>a@j9#hKjmpU@3npFuyku^o}qTh3#lQw5j#%p1W~sj@D`i~3ZKV}TTS zDk%{tX?w6E%Yf+TG4dC<2AXE@e2$3Ap!EZ6_K9TNsRMQazitAa_y)|~I4=5eC@^R~ zzIp6CMJtm|n6X1+k?&%V@No0-E$@fs`GB*h86k%H6nb9WLJ`et_`(3dzOfdkg&7s| z8Mv~B%THLVfz!C3ggB*N*qlfq+O)1Ljb8+>^b1=~M(`R#yk-%vk;LnMjTgc~+E{rZ z5$%vS*^C>bUYL(ZvmRY7vrl7NF zG1)wN5H}-ixZMyuuoMroOxQ+pHpv+-)MuVy?NNDnFdWUGi%BTYvo}9V^VLDng$ZhX z6M0^i_pc!(X{UGZU{jaQ1lpfNtC*T^k2soJ1Y9}^i-N)Ud!B?@1$sp^ihhWs`L9E0 zdP6kTRU;zE{ku-?S%hu=p27ig;j>3XVvA810hlZHqjwufP#A>=&+o5RGd<#guDR%wq-GhlDl= zC;Ac&w^EF0Q|D3=rCy-j2jcKIstUQ6ytD^r!hdq`I~a99yLeR!yIy!R3Kt%?IW5|| zQ|$mL?elQp^X8utpP&ns&qLAd#!maQKYSkq?9aZk&1uIW@jS!@Ct>V(kF$fXOyIT7 z;QGYi`Xqj*ZgwkIr1-E$0}AK5#`s)&$q}|J4!zB`ys{}H50^Y}F~ccmxbei+#qFYN zAGnE%Z~c9?HP=;<*lRvlH)A*7tv2F2RAk(>;b-vB#Lf+b$Xxq+H(?12=syY|0wDAUuYuxD~+L-NZ`Mez*MoJL^Py$^(C07nh9*& z#w8f!1tycmt0~}?9<>2Ek8>A|JGBAxfcErv)N0&30dFSBn}CehwwQvmTP24D4-v%k zF-nb|SiD9=haXC=O<-TAo_Paakrt*SU}f)Nt*gGPLp&d=>7Wlh!@4MX{b)ST#j->i zt2*w+;K;?zFGsrDEX87_9-XfqdKQG*)o$1?Rq>dD#mU42i|BSW7vjm-iy19v%%Bk} z;jRunaEn{5r;7Lw#`s0v8}7}X1<(LZj%2S-lA1)Etob^+ADd$q+7XvzF=f*wS@MJG zgzjLlC}nRIx$JTtpD#AE@M}3{?!XJ4D-NMcN`ePd4q_&aUAjDcXGuFFFhc&@1QIJjP3JIrznnU2psx69_iC zw5?DN24CnFklIbv+R-R%g26y(jS77THu%*FXatW1YALELqdV4VZiBB5`=rC`zNIRt ziZ`1|J6wGTj_KDRDm%<>TxRQVoi*Y`GBb|tanb9HzbE~KcncKuv)oj7hTMG-FZktw zKPojSOq1J(23!`TQncWKtb6@G>E1FuISUZ1tr{#F!WSFagYgjv9TxI4GC#E za}s(N^PvMKkk|paU>9@y=4^EI2Iuy9V%^@%Giu;KFo^XQzYnY{c4- z&PA2OwCOF4?SQM%xeOOvtiap%!~FVxcS`v13fUbzdQqVla73_d;|w%n^=Z>tnhWw@QP42Uv5K$ zN{eXTo_bI{o=+a0uAvHCys(LYf$$1cAM}h8vwokhK&uIpL$&>=CTfvi7iai~mDiO% z^+n9s$`?3xKP$!2i`NIfqI4Qs&3o-zw;|_-z%~fn>?^fzwF3~mT`{V$ zfar45)c`@3uFtAZ43Lf?(&`Rq6NJZv2$QI2ul|Obyt^NQ(a^%ld-K^XF*rNl2NHn? zyt#&qAfok6w-t+5J)8S+83B7B&l6A`0XfJsZI1W;SQK>dSJW{82Bvsd81S1chtwyr z2`#GPeMoGb98%wg2vlbiUD_v%CSahc*ad-1VTG;)6>Tr)3NqGw4H;{6euHHE6@UXW zo`A;~B;(AXGX4b^SCUclP0E5kp+Oi1ZORKZ{&zn(730zzekNt7Fcxw=_MLt=)RB4+ zzl_w3MqmT7BXuvf|DD*eXg<3c@Av9RLTiWB`v}Q`w<;@@1RUgdsEa^XcT;qy6XWh? zjO*E35^)HYiTBDeEhudz`S|?>nAIP#%Tihrz_`fldz41GQ}}?0(W&B$i~I!2Vu=oo zp|8SyQO8YlNH@~vi3(m~P}#S>g~!EkWvl<7xt|K;{h&EP$Tm*MX5X2AMr8x?sm`lP zH`;HVFrc!Vp6EI{p&cco3FR+!Y!(suelxMjaE^Xm%m>BajsI}7V1-QBa z)#PCM!`VA-iwNEP1V_;&JP$4r>d5Q!SiP<@>QOo#8@WvB4ExTRg2ptBhG;@Y1Rd3V zIVwL2Q)%gGfIUOTp5N=~DlH{{fXjrqsCjUE^!CxY_e|_uZ#1;!5QWu$BZvMw$>g;Yruh=amJVAVd!4bV&%2gkBOm`j|GpMgSj5FsNJ!8c+mlc=e zNWS0xZ0zhGs^dhT7TBL1JM)!wM*hk+Yo^Qo?A{-$Q78~G1^g3fhi|f`_+q1_Nw_ha zkk+>4+KHX6=Di!8X{}qFhQr(J_niJ^AYL3F1^$ln_z#uVfV$1Has|1QmVD*i#oE=F z!|1M3e{fo|f<BbfZx@y3OkPq53IKeV6&$wf%9R z!}+=?X|GAw+IP-5qwYp1f*V{5`}s)2dG$9SLwzoa=)Mm(DPIIm_WTB$xfovurPV~0 zelsrJA(f|FrQz61%RsiYr02UZ*d_eoe$zw!b?$;p23}N%~&w`hNS)MQ7CCQG9|c?A)T5lTCNd!?Av0a)SEcSqNlKhRJ0= zo~V2#;)%R|!)t0i4%X*+dbl&0wmYy>X@jmz2%yv?v;q6(rO;|gi8uMNV0X{*zo8|e z^~7*+q8p%SBV893pTT9?9nnx3@5Hr%;ZO8ojiTb+aSAB?+Bw;hA}EFC_*YYc7zst3 zVxcMWhCYL50_Fv|ZCKs4Bz(6z4F{GuFQd2YP56DQcI<)&ZtH2sngRC&PpQqHFBmgJxj&ur6RB&Y^NsJX^$Pd4(KN_i(pBy?YGEc-oQ8$!z?J` zCN&3#6s3`HVI#PU`E>{0PeFj{3;b_5==Pu+!*xg6cg{Vdk2aG3x3JZo>1ZS72GVu( zuDbtrVMb}ARiIe+kw3%8~*^z#E+U5K*oC+=lRr2dA;Yi2B z4PPfH;Vd{81OxU`g2!kc8ILqH(dM4@=y>Q@i$`hUXAwVpav&g|H*7Me9t>FKrXSm6 zO!@9=wqsmBpq+=|uS8~BMD z+>o)rh7eU?PCcN~E2HVXAkxnFnD*iwG>iH$&T>VJHVgp~Nr$+-X?H(GM@R8)9Nw7F ze#y;!9?ZFma+n`wdQ^e#~LZ^O~R=3(AqLNxwB9ZP4$yXo|f zXzRA$Pqu#sPA6phA=^?Py6ZA4+t3&PWUs2d|v#>W&t~>iP(0^DKF|bAu6`@}y^gBeiybWEYg+J+CTcAp8 zw~%75r=uh@-}gLSGgm7>_A(legU0#(AE>{!nnwpQnq0eXsJ}{gI zxi@g|NXDt&i6VVQ>q1OP`h}map*ihMv=VdLYJE<76r)zd)PaZKdf**i(0|}vOs2~LikR3Q21$|vGg>VkkxYO%J&Q;X?vp<>Upleb zE<2$)FrjH;G^FWM*x#Yzap5UU#V=X}!_(J+_h|x)Rck&0(?OFLep(p8Kc=rgq0i>w z`roC~*UPY%A=B5tBa-#EzyVHe?v!o-iS)Vso@B#b?Pqukc%mUaG2Uar?-Xq~O~1tl zvoynx9!?Xn@_^5Z5lMYQf!VzC!K^dIX!LRX}Gx_UqVApt^rRpwR5%xN-2bHl{K~evRd-S;5bOz4y zJQRkRGCZ=lN*9?pY(RKMjURS^E|S|l8?Y=)e;Z!xG`FPVeb~ov#OKYvj^Uz{8KH-n zZHiLM5WB)*;>N5>ziXTR_U19(>^m4A?R92yi`QH?>23asX|FmSV&UeGmEoR>#p|r& zuL5WTFc2TkLooFVIv(C_6O%Emf0n_Xm(1B%Sd6&&cKfplnJ)a=-@dfBH@dJ0pM^%r z{-EKo;TWPNtD$S+fpfTX~G@y)!wAk8yRH@Z^DQ#`VmI_)gfkZA!71U}FRH{@@9MmW&1WC#NzWc11 zOhUAN&;LCCADI1~v-jG2uYJFqwbzDg^UgkfQW6G2=-wPPzARazgP<>0v_yP;@KzFya>&+EPNRa8pyoC%)O zOr8&XWO?hrhePp=bL5zCU#}+I-^V0dF`U@EvsXQQh?tO1v4~tH0A#)1Xqabwd(=$4 z7pX9laFIT0JovTxo^3wU+vw64j<@4A()R}p+zlU^?5liP{s#u?Oo~O$c^zuX)#3lr zvj2dA6!q6jY;|C7XY6Mv@F*lCdPbRl(!8~YR-a@gQ~N`%ZP*|(-b1@oqcHm0{CjS+ za095tJ3K~j7>;k=_#$>L@@F`{6IeR*5#~|_8zR`Ncg$L?4rpv(|AnuE{d-4htvJUr zVega}?-f&Gy_ZgLddEx|=Dlu8oOkvVmv_XJ;oi6@BfK$NDCgXn^CEf%o&uS*x+mcF z$NFd3p_~?9cADGbXRZD`a805AA9}%6G5!wQ!mF%$&Q+262;**aUb9vkivkI7HC_B) z8rLh^F0(!=W;<_!6~~ex(w45$cK(30%?PC}ki<0VmlR!56T>{jcjK z2afnVRDMEjgW80Rg31Owv~7tud?0LVKBc+V@Jv0HB(eo2xr4kJhdd}o{-hy)>X1K; zQ{r4}@X=J8;&QEdm^j?EW;3vJE4eyl@pr6_G5(Ejxt&}g_+K^(19<*Tm}4&;?=>CE z>9{uJ7-jq~90SYY?K3`9`=P}yUVSH+wfcBq@ld%uHJHoO!gKja^zXA)cP$DeGYGr! zm+xvCgBayUMWn?iE?RsMh(+GaL!K>tUiEF*!!^s~BLwg@Wn$L1^9Gd3WlTeVeQTbY z5X@^nFt4K#0qZ`iBJ;}JZ0yfz*1`$M?TeAqlabTusELbE6KhZtZ#QerXw-MRC69Gqy^EGs|j$HKo?4j)5bDM9#mm+?WaX>mEWtM%p{ciO4`YijEJ62)0 z*V1Kq$GDJLG97B*^bz;OG@U}FQPQ`eyZ8{a}o!4|~g!czcr<~r!O{a!= zZ*4k-N_;2inogni{uK{ftn)F3vrTpu{S6@|jJI?ccT=zgpZ>JYM_`zCZ==GRc0UQ( zT^FPatZGpn-$C8k9uN0G6()!`T5t@(ieIFjgFY+Tq`3hz$a#TWK?k0}VM;Gv}XSBtoWCY^sW1z&{ z(FdD=P5-xB&o~~J(o>(H?@4}5Pe`)8&2huF+n5a|^@ii{dOQX)QFK8(PEG{WQ#{Vk zH1EWTf>_tx{CI+or=5RI)%uct{%?TQqFJq0n>_;Xo2PN<7k=NxZ!&)K@vFxV5iz)U zh_A3l;m|j7%hU)5?G#E5%jvgbJ1}sY>*-pHtxM00^yrx}*wQOdNsKo(A;Gp))__L{ z_Ned>uJJgsoG#x_L1LFBBFXXSm+7)@5;Am`Q3!y9=%AR;T^pa{3u+&Pu3T$b_IkQ? zsO-7s8J1yUSQ(lfh+dhLaF2^s{RUR`99H$4Sk-ht$DgUFaUxmnVh&s@~Zq@jJJ2`DQy%UcR0_CXN zv(O1#Z>6I?%b`a@6NNDiiM3r~yDryfU?hbLl;!S#M|2s}Ew+V|tv2suYp(BKfiWtc z5tpK44RRGopdCEa;`?&Y_860aB|6tCm^%;pj=*nG*i;AG_#O~eh1y|*Dl~SxszQ?i zstTb7;d&$M2YC13cMEkYQ&0HY7}p2e)DLVn1S9o0fi925R+Jp#aRZ zSV4=$W-G(iK_S{1R!Xc@_*Ar8>0d#aTXxfM_d@U5>URU?>Sn6PR2McEEs>Rax?gPeCN5O(U2?vsgcV3TJ+n}fe75XF;x9q@! z{bWg!)3O5;>fz=2^YNWe&G#0fHK2y`^V*IxmrUrI@a2_V=YP4Q?~(~;CY+vd>dMpS zpYok^{X2Ehew=Zg@cPN)_ntiNe>pH6x-tA%kU<8DeUAUN1D_n|IPltmL$2rdy8d|D z^~e2hd~#s-$>WfD_wRttG(>B+e061;e-FiH&OgxHp-q55n==?8D+)Nmz7Qv&3(=@^ zk`kl$`W!gccXjk3Z?gaI&!nO}C-gxX!jS{7A9(A)+t+_y7rWek{d;v0SH5@t=cylj zj6nGP^5pReuLq7xSlDPC7}_F)Hb46Hl`$vZIoZ+tj@JB|C3^45sFMdz9%??QNi=i6 zF&=fo?PMEz97q>PFrm1AipalIGAPv5%d+Zvo|HHc5wAhn4nN=%DXyeV?E8xaUu0b< znB6>%sC8bA(Z^lZ+)#aHwD+WITSoPnvgV#~J_o&9+<_>(CHpKU#dw@Z-xXTlrM%?& zHMEOPY{l7M+~Ht{#*3bL-WZrG)PZr)TMJhzk%?AuV4+9yev5g7EmkNC*BWfkL$wCj z8jslBu5CHhXP_Ccb$?m25mN^xbEohSiBYNbBlR#6J@vLz&7Y4CV1pYtt$BA$AX+^Z z;n7rW6RlL+)J+dq8`AH9{u=Z@E~x*;(Au}m9vHv+Dt$K<&ah)fH}86MryUA1Z1$vc zF!D6F;~E`QJPbtciHACGgT#G!#RPdWevYOO7I*)0NVWn$Q#^Uk`x<`CNKK_h z-V4n)<_#{P{b_5!=GxSH0}}7GRrY;8JGobVJq;(8IgE_B09E(0QWIw!aoj9e4dW6Owkxe@wiSAP}zf8 zd*X^4q{^S$Ey6O8m(l$0Blv``Ct{6yAwIuTwbwQHOiO9Q!XD#)ZD?6b(6T6zbga4Y z2-J5rS3%b>d{Isj>UuE(rCKaFXNLbPthy%>9c+{ioxn!}lvi>e)sMTLJgGxs>~u;G z)^c{^^(`1vcVQ4yv9DuMj#T(fq95ymvPyX81dbQ^+Ln-B*wAB_&PapuTg<{fC_pUH2Zq=!XwxzFdg;W zqe?#zgSvq6w&J!Kc(v`+bC2P6qr#&`J4P3{7)SqvvF_S$AbbFXEr|Oq;{Zux%;%Tz zjJS}!fm^}gop@DQO@>nz8I3k1fXVZY4Kht8!1Pv(ttPv@7^6(q!0knd1z!kqk-*o2 zDM9fWpCaW_SV}*K`-s^e`sdl3-A5eYdsU+TMsndXX3TEalkQ_S_Yp*si)fk~yDh6$ zH@hA7zT9q>l{)!ye``>pGG$TMs?iki02?^o(qiAB=XNu1wqSVeb9cdg^^uV5>GwN- z^(uH-)V20d!^m{#S$7|4v2S55nvD)RbB6D;76x_?R~5Ya0<%6xp{laZtUCjV6X7)ly_EHp}Sp)pWtNRkNM$HcXydp zy9-Y`wOm8rH6E~}Kn2$jpjpA8Oyy)%Hww@A)e}e#_9pvFV3))7Br>@XUv5`j3r*J= z#NtuU3cDdWwAa{+sY|||+oj}HjTFpN0`dAQt|yVnZ-Gf;xT-^#RQ0Gdqa^&}C7T?Y z(#x5`Wdr7oD{)x(>aM=*9^aMF(rK>13b2y|9h}&!#n;kkeT2vO*Jqe8A?Zdu80C2w zxW_c#-lH{KNx2T_V#imd3z~m~z!JLpX7u>tAc+5RUwV)66O{LYd48PFy7#A@JjY-FudSkZ0K1@ z#M?MHVU$N7?Rt8J#fICi^m6G}?D`EnS&4qzdGb>bu?LU;wM< zKMR`_cdzTmPvL<=L9QQjae|sy*qaPN#=>qiO(Xz=6sk(0!}av-7TZ^td)HZ;Z;!;> zNzaRvtSIbtJ^7X%3pJenLL=GTeeyH?9Po~=8L1g#szAR6z3@^CQc{Ti+Av<{&iO8j z+ptiT`cdCeY%k|_yPkX%JrR0T2aXU%rA(LJ&kTC)KWK~ym6@* zvN6wNG@x`b-p8xk2O^nQoKhigP|u7vQ1U>2CsgV$JDPt40iERX7z{1^Qiat6jt>;A zN5t)awisCuv(~%(R8Iq;JDk5ukJr=VO-+{^%OH@~rC&4!TQ#V#m!#A~mNli`;f+YC zcj8Q9n{gkaS8_{wu3o~x?I<<1-nlaxS)QQ;ex zUQ}H_E`1vA+bc5t&77`jx7F5t^FszYwdpK_CY&2@uL(#hxY^%T<1 z^Fy8H?ubY6yc)XQ?|~9Be$Q_1iFExeVjXOorqa~BGs}a|v44yp3Z(%;t z0LSvturytC<kSSmo^Q$5(>)eN{dQ7b){vcyc@MJJEy4n79VbH zuLld?q$?r+zxWM>-5;c+_x5$>c>B69s*K}G;0j2Toa@?lKBNn&-|svqw}l!aTwk&J z6MWlq;Ovp2Q+f$z=bNXSjrDI*0=}@k3(1oMwC>)}S_`+@G>pV}hk1G0nQ^`dy<y`iY6|HleRa`my= z{8C2=1|@7osj90-)9OnR4u^%45%S%L2aUzbIu zL(>)p1H@o|*A4>XCx|c*0l)R_oHb3xu~}{$FNNymT^?gNJ_k`$nmcGq3tQICM7DUA z&UbBlFW>kFB*SR;C_?ZoU660I!=hy^Q`7Qu5AM{iW z(9y>-!FcnpMQdoW2V!6qC+A-#cZy-N$(5!2KCL zb$MFcM?FjJeIwZsvD*Fs0jt9#DX7oz1r3wmNkt@x1E;CFAUd0``J(x>+nzsG!`wd$ zk^{RiHG1hVe6|@cJgk-zyrT}mvw8Lh{sGIT1EoVnB$#SYleN3s_${oFFY#)Ifrhoz zVR}JmwFr$Q;FaUtbL=QnDKEum^ElII5cVQ1&#V{ zXTIKvS1ip=zKWWP3f<;0QrECTduIhZc2mb1&rJtXFePs@7Gu}KhyfLgWDF*^ShenY zHsMwD51x17^f`jWIW*%s(3!LP>tSt17fTNPibGtCbon7r?AcB>pZz^@*;s>#s7d(A zonh72hOk-mv%zIs=jUx;#XPe%xZhyi3*gK08m6klwQXV}XKUvynR`IL2Xe~V%U((=X(M*KW185H*j zctLLRt^+;rw_mfhrHVg(6cb->KpJkR{&wslHv^0Ffs^iNoGdQ2*hk$nf7 z8}Byi^WKiNpU1cwHZ5!Sk;wQ1a;GKVV%up(uzFtE?lp^;AqxjYgPx+Lg+87o`^j(I zXx!h^A4nMjNwsz8CsmHDy&mmwK(1DU7A-+Ks&5+im42n_TRcVH@|i_drE`&5b1XTE zxS?!AhUZWBnZxt!*Msdx={g-LCHxVShLb{XHKC$mXQbC?=l}r`<>zZIwEgm%5qdcsnv83aV;m#yXYLQC!0f-tI7d-<8^T>Th5Y{; zjG(UFbe5~~`?l$t8t%G3-b+_z7d$wA7FU~_))1e$6kFcD79A255f5NP;tuyBZ=B66au};N3a1x$3 z=3(XazWWhg|HlV)Q0lws`e_?)x&9#>A0ZhcwjmBPI{h^x66G0)!pTxPqBl_cxp%Zb z!L}_e`y3P|>v7qe!IZSDr8_%p<7v#waX!BRqjXQ7>*sCMb?q^3#(StzRKXvU@iD}2 z+d9`i&tzcM%{i*t*XZVi6uMZuLz`?Meh_J9eftHFkzf6fVB|>6uMm=XDccPFc)*fQ z!d&z}5LJ!EGiKxS&W!aLDerl|$0n-3lKd(+zIu#(oRwo2Y&XVGV-}{=kUHj^8$0F+ zDwHS{%BtTXlF5i9l!oskdIV+8^j4{aJog+D5|9owxL0^AA5-hxV}9(t1v|z!RXBy^ z+FQXCEVYxXr8Z+YvI%!dKtCQH&~{r2yVd;@h8?-e{W~=6UgNhcFPl-KrZv86G1=?Ld0#I zxX3EBzEbNc1OD^pa5;4hPyQCZQxB9{NPQB@n2CpE82l3M90p%o38vT557w3MVCA5z z7t9bCLd(xd_YB8%Xeu>lR)4x9z=j)YK6Zb?_q+e+_ zOS%}?)@flfj&SnEMu@uGuWOJOclK|A4aXjt{&wG6m`+EkO|Q?{MJSop0dyl#%~l)( z2jR4A8{DIdMg9>lGZAN;%`?-xe+~~LQ?c2Gi=O7$AK{bQgM)e>L!Zi5Y&DL8$WqEn zzL5{}UDp&9TIb{N92ld&k4faE`b5k~DcA=(7Y>a_Lc7^+V+|=xuHRGJsKGW$-OuRS zRDeN+hS#%?x#VD|B118>ySFbNBJZYBtw2m?;?tOi--?_=wdF3o(uC;SjYLv|A#^~E z&G!RjkUk8@Be$x>68o@h0Jx4^lN(Ug<3r_1@CDxur$7=9QM29*`KY95t<^ zq^`6cY#`Ly#y6#(&?*aM9@UTtxzbS?ecsXxi4FA=WrX?IkImD`RF!RQVB(RY7 zpsdSMBYOlIs!jx!DdkJjDBiEV9j8@Y&f;P?>PMQNcx|hR6{Y8Yo zgjH}x&p@@fOjgbyU&wiKpGub)Tn^FZ->ayjqLTAy^sVvP>Dq(J+@YZ}Z zxH*`~b@b;H@@CJ!zNUzq;4nlHkNx=T+KyQe{cT5;%fQI&#@Dx{Z{dAAynj>M`W8WK z==^VO?Y{@2X&cbQhM!lU`p7ByE76TqUFGrAR8*rs`5)D~P$uZ7`zC!471|`=Bf{49 z(Qo1)zro@k;F(oKJew7LL;iMFE@R}6(bsnvF~7xR1``1Dt|N?^Jjdd%{WhhO9k(!<%a&1?y(Yp1^9WT#n9X?Prj7~+G6Sg%^xnIMT4)$%BF#8iW8WaAEk$ri3mhVH@VY3L+(~vi=?R*z3 zjcKuOGe4k?{T9z_v6OyOXdgp`hDbmtZ!xc8&ZavgXF1v#?eCg7n@xIrR_0gekdKsfyKlVd z;DCs+W9_Hj$mUP&dX=WX#BvxI)JiibOsrG78XS7Q!$0LtNLuAPS_=Mb*JnVs|Ec6% zwpLr~y~fh@sCbBQ$`+`l4b^wlJ~l&V5^{}gFAGg?)pUr(oSKz#rs2AlQP&*^=(r}% z`O9D<)1#AL#@XG7mU;^=B{@9{6F?l+6AHV2JmpN|USxrPe7FD`Bjg0$+-uNpg2t^w z4I|PaBmwQu_U*T0e-_TQM2khJPM$SU2L)RJ%y zGE1M5)ROazJ=va=WoFrRI=s$+n(YOO_h38_t1-quhDc0)l#0kM*N$cmgUzj$sq8pc zC+a!}On;2N1InL&#^;nhzE7YHcu!wHaUV25zl6|2aSux=)wkspWgNolb+j7@Mte-vV77)Y>`!&TN;RkhgfG+qNiTj#%i4}LzT zm<*)D@Tq9;DKjeyyN#V7Fnb@>FGA-tZx2%H!9rQ>!!BvBu>!d;G`ropue+aJo;&9l z@vdT57KmWC1$#fZ3mvXXI`Ww2yM+1nhM|K6^~sBAf;eH9F%Ff%zX-Q=U9L6jzqSYlrfIaKX+0)Wp<6aWY5E_s z>+WawXP`nh_p_U=*jTb zQ&P3REc)PKU|Bp2w!+Jz7C{Y2TqV4;b>6v|iR(|+1`b$K9QU6L7RNW0#ZSIvS=^=|gZJlpmLM3H^4>w9M78NL*>3@WnM*lh+_gL%#)!{Bg^r~n z5b9Xkj6Z^!yWkSi32u?>pJ#lJf#CZm20Uq$weZD_)_I?)^2h8F-$l4t*^<8 zV{HY%4_cePYW2Mzu%zySwZ^ZB4i!2#tNUZvgcvxiP%o3oA2()|0EF5=tpj&+*Pd7g z=D^_`r60}Y?H-f2*(qIhxr#Lhz9^)h(Y!xM>GEAbzRoSXgBFMDhN*|X_m|tVz)#uk z4A^P`bXg`xVS!%T&rbh1hbdfcFGMl1o5;#_!)Kw&g^}mbpD^%KhSMDV+&!Tgr{2+$ z@I%z6XH-_s!X6;LYhw>IqWLqs{(U5<$GG@!X4N##hb#1P%s1w7Ov1up)d*bO5%N5O z8;B0p%}PXv*3T~v&tUC=$7Wn%K8#ix)N()~tMfmh3Ox;+($jVD)YkbFMsj|d;%>5< zFLDq0J>;*cl_4Ju>&MR`$UQC7vGt6KVZ4I&ip39}R%mU7y;;eV9&-;J$B04` zjvnI}S{%|jcffZp@PU!h{|vuI%|r^ZYqe3+SV<0g=rY2JkJxSfkM z{|c**Q1V72Rwl0j?roi~WAdZEys3Rw)Fpo3Qyb+hwBPr0xZAM7LldMoGF?w!Z1Oc6 z1;P4ntVgUZGc91rs2a@CG31WP(atBpk@`Hf5$6{|3_T?bJp$*p&S{DvWE&VlezQ_5 zDUu>|8Y(YCcdC7%4w!gaW>_c<`z+_V#^)Rm_hhU4#twmBsA#b(6)o(GJ=?j5AW9Ik zd?)lZN!n=40o(121w}gbjvs;AqSb$|oD#VqAzSpPn(>_a8u-D@j6j9|BZLoyLA&&P zyKx)^g18V`u)NuSDczO&qIh5eeu?>1=w~1VbS(+}`YrqE=-z6&tNWyJ_@u!20g{eI zSweGr68lEuyLeYM?XvxsYp8KM3`g@<5x9-K$5J1Gr)9CbBY3gtY9zMJe2hl2=oc4| z#Ndua^A=J_xjRyBgd#B9GnSI(4Bkf?mgj#*o=@Vnfvge-QSVPbhCf`uInK4scGnSn z-rI2`UO#8YC-HZE3Hhnmoqikdh`#Gc85To$id0XLp*FyNR9*V*bELJT$EWOXj7F`# z5PU+0AK$imZEdcn3!O^lU3G7e*l(S<_gOAOjQwlPvBDn@y~y}Md7=8@peN2{$^EG* zs0lbj#=A<-w*R@Z&z}>#L3HU)k+Bem#6VQvh{s*{!0R%efNki)G)O8T`5Vl=mB;aw zMBROZ5$XQ0=O3HTW?hAR7Y7$j=@?ah2ifK=8BtYRotG4Oz@srNOE_YXk89_PdG&~d<4ao=K}XIvj1_$R@@oio7x6)JE?82jkQ z2JpT{LeJ<9%Nc|&++&{8V{{--Lw(W=5UTu95xj(k(AN3eUon47?#($$82^__437+o zA;ka6@Zf(R3_gSWm#N^hRPbi@59Yre6wDp_zrUXU#PA4WL8$mw5l|0gTj$4{zJdQG z62r~mF@);QbGL`(%`L&O8_4|c_AzW-h5fa4$1b7o91wbV-B}PG!`=ZgOjj{n8OFUi z=P|FhMZJF<1k9aFP7KVQP~QJ%Wf=QcfJ$Y}cC!D;D`bD)1N~KhaNcK0=uLw{53f6$ z!XvnQKm>jj!L2HSucX@itQTjyi<_t&67WpJs)@Y}&L^rxc3@P$Y4r(gu* zbC8N9DuN6Z!O(4>6%@=RXV0KC^rvD!QxP8?$vGfasZf#pM~QB||I7YVoYjsONGw%@ zV+r;|8;vKIhh>vD7(qExu}MX+N=0C%;_R~M0S(jf`dKkZjZ$TCV|XM72Sjq6isbyT zRBYh5U~}T^mt{d)@OfMRvyMlMhg~L>Zo#19(5Kk}>iRt$$C{hl)%}@j{6R>HCOGgw z4}dxDtaBh7w2#?XI@)r3p^o0M&Z1T!{bLhEsTU}@ZlT%cc9i)|qEI*_2@3}+3Zam& zRln@OS>r;d-(y$9g~~^XSJ6ZNJT52^H+J^eFE+VEa_s(i447y6QLF~rw>oU5hBjz= zG~V$+Rf=-Qy`vnLAH#APo4Od8+i~RKV{EWC<8DG<)NXr{^BANxaL^cY0n)Z(hQ51f zcjnu6l4GM62hiG$7qR(>v`c=fF&#RCIsJ5PQ%dR8Tz44e4>BjfOaXa|`B&j=y%Tgj zVQY_c2+W)RFpG-*6XpwhT-#oPDy_zU;oF)~1sRbc;`ny?fU+*b7Xsu34>9K<7Ne?QyjW-U7Yx@F1Kk&5!W{0- z`iwcRxp%CqcOUWuHCNZP7Vb8!Deem`9k z=#>8RWQ51{R#-bz^K?uqp*7`DBQIApKEW~=D>0s4xDWxNZpEq6JeQ8Ys^gSawH~w0 zot5UYXOV+#>KmjGvi+kd)%Q1*+%B|e9Y<-bS?Q=g5ly(J@ZZUcaKKjO8q^~rOLiG= zp#%o=s!sRli+Th0?B+Hrz8FD*AHMOW68Zf~a>|Q;=9cfI}ISO&x_Y3ghAI@)2HH zmf>`arO=TlrI*Kbbp*;U*ry;IQTyNM#G&cruWP48zeh%*ovQl`-uwbD1DiDR)1zuL zSiLr!b~9)fD~250A7fvL{t5A1<|1g_5Rb*N z1E15hOyvZ{>3Nux9s|>RtesU@7$q)Ix@RAule#Zgh;l*n$a6lN<_yLQ+GL5$d#O-; zS4HDJ$74j`X{jdGiFgV3cfRo~Y=WL+g^K5@+BV!XY!hNpR%`b9t|-w*jzv0j`<-pZ zNO%(37eEUJENu@fo;=1MO^ZWq+eeY}kKSTfj1%qAzz~A7Of){Bf$Gs`9HDWD21xsi z12nLl=rd3=`iz}4o~N;$#$RY)6z?-owfj`Q7{BHdCdGZm&uMI+q0_jF#vL>oXkfP3 zXP_7EGf=nsjB*;qG;X3XpGE;ii#FBZbEIX-uFomIm|KxRl04G?=%>IW*#E zMAP6dzR`yqF?j!+@oySkGy*iJH_`Yfjl(qFrosEjjK9-hJ2QB%vcWtyo}sao2K6-> zzo)@_MGT&CG#;Sw3mW&*SWn|_8h6rYq`_~JMm-JQQDRikpiH^3n8pGcg)}@gX3)r_ zF^$F)8rRXdhQ>G=V`yAP<6;`T>%~Z*;i3^kBZ7uT2~N*Z1o zH8hseD5b%>PK+PYm_uVWjT{=&X{6DZN@FsOi8QXFaV3o;8kf+ZzF%V`jd&WdG$LtO zX!Q2NI7#D68lTcIXnaWHJsJmTyh-CV8ZXm$iAF08-n(l&P2(vVPtf39F9z>qFn&d2 zBaNTY;2oR>@0T{#&{$35b{aT@+-KC%xRpj3jUpNgY0RaOMS1Suf*p+lFV^SK<;xiw`%B?uuZ?Yr%@kKkOkq`FY=|0}N}s z)0~8sREIw;!FT|H;Oeq#H-qMx$?R-z`!PCOHD}!X3_W1F)zY{RGt@aRdxI z-n~zsW6v|zV!M03-@P9f1QGL#+md4Fc5;Et7N<{JuC+vvH?|XvFPxltRaKFEB>k0Qh+#I0~+W->mm$tY! zqgvn~RGzwPd9GH~YW%E+1=Jaj4-k6coA8|M?pWKZUx0aOt8GUQRF7bfwMXyS@v+s` zc=*J0TN8G%n~zxh?(GP+HdH6o2mUnz3f4W<8yK#9e4l%A`Y9C`j?)J{_Ao6^qH_x~ZHaPt| zv3XUZ=AF3If%!$Mih_cFmtk2^*yT^N<5~_mO-IMCKcDq+Hb6&wlRa*-Nec z$@I-=UX=i~Va=;XA#go?immOA$sRY3qg|nU94Uo{?_xb`Qpzi?`*t+{)3Ro-*QInb z_2^SJAdjp8EX4H&CRM9rK{Z{|q@jU+xpdbnP10;=@;iKEvL;5=B$5|H!UScX*6EGaOv4dkk{0xrRO~ zakjC@v^=U$M^j4W3#0r49(EkD&i6o1Ro+}H8JzTSnjss}VKr0E4dr}X#|a33gEO~y{Vt9y$Igzf|LZ$+ucz zY``g~378tNzf#=W+>YQ}{{QVeIM;XH<4DE4^;GiCEOpKh`mnfHhD1XAF?wPvuE`Bp zQ`54&k@qCtaDn&VuBV~*Zbb4<*sJx`#MeO@u;XZX8oq=3PC{lv?Z;u+9t=qD3Pj#> z!MeoMH2q-n4oXgZ!B1f(9lG!Bs&QKNo$6XJd&8+0ro2J=f3o?AQl@-M}mr~Dqp(MT^f=hIXuQvOZ>YBPzK20kwF0J)C@Z_$m ztEqE}2zkNE+EN?<(6law6;qH=QCC{*t*EJ1LD4t{hhdp@HC1Uij#6D+QGH7k-`v$D zXN55-ZkiSsQIL;w8)|S0a>L^V>e*V1Ll%6)Kmk3m#VdJkAV!O6O`fKO&eo995+ll*(N9u!BG^G#_G975qLllnO(o2w64a?0{VK0zJg2)9kSN# zLWaZ^mGK|$?wldb>`6zm_Xk7?T%5dLcSF3ej zung6MD#MsJ&n9C`s;Je2S=9T-4PDe$#%LC``4}wfUU(R~sK3^WJs3xSQ8RSw*Lqk8 z4`&zkH~MiLMtaSnR(Yku4lC;Q2y$>yE1Fz|&wN;DC_;a+F6_*Y!=J>-1N{V^oVAr9W>OBH$mbTxM5i`h4=2-2xy zQF+%-7wxzVovkX9?CSK2y5dSSa19N>rnnB)4D}M3UdppS2%d!$nO9U&;Zyxu^mqhf zH(NiMQLP{G53Wcmlwd_V0)klR^THvoBC}s(6CSek9LA8e78RaZ4;S_$vjZ{$&KuzzR@sN7*$SGoI>dRfjF?t^ z3$u8=>O<)_a$2aP)inD^L>*Uqa`wT}9_v>LCsrs}Nmu>f8YB0LPL1dr@LwQ@XQ%%mOVb<|%ZOcpBttaio_))H-q z!hB`3wMM9zO$#mst&wKrR#g#I2vP812Er67U$G{U__b;mX)%YHNdx+CvzpDStH8L= zS{&0mn8d7>kwFs0bi~|>5^p)urmAIDDKkd-9+NaE0=ufYl0NlprcFHt(`DA~V4A>0 z>fm5ZCaj(b7~h#dRi#y{iJnESC>_)W9v+w*{7e~6K9-7X|_*mMh;4ljoF$}5PD*%ns#Zbe9Os>IU=dNF~>oc z{C#kV4t1eYrmFWeZP}?xZ(--kK?Qg0+j-*LH_B65SB#;M{_wZ`0yNIpg1JTPvg^@E zREN!p>{htMEU(M2xCLj(OG~1c*A-M$mDc#YvCHeGEh(xlsi`h4iCSK#)<<#6>#}F1 z*I-mH<#2dbSFVk|5b<1Cpqe2gb1wrASE+bQ>oO~gZc*{l7zN5Gl5punoK{(Rc6ha* ziX8O~;niChkV@kwJj9K@;Vj}1Go^JnKR#gc9vV(!GO@xdQQVq?1~bhXqb%gyw~C`+ z6#9y=zp)oh(`ffwv40+z2zMTsIJ_!VJBr`fJ5#kJ{4(&%!Y>EERQ%>Oq-tLL5+()1 zv}@M&mzc}I2q*=p<^giD$iXQ(6PgQxtW+YY9M&Q;nWt=V8)3tdGAc9QTjb@GhdtCg zU?)TC?$f|#uEssSv-2`6d#=#-PYjJlYBWdG7RMO)#;~7XT3N>G^j*bqP`|_1l4;DF zsBesqImZO!*nIfH8}DX`YFaJAh&%tRB4vF+^Q~dVs6QsxWD{PaGU?7qATy5zZjHpT ze5K1kl_Ij?;$WVe{x^&^-#udgAdrFoU&?VFRvmkmrT(9PC|m7Mh;JGSY8Q|N^(pXW z6!GPkOw-a}pDVZ=NV=_pUkFYG|Fj>bxdvrcqBe!AA#)02)7FC!31cae-?K}R1Yw0e zS!;!bYM_}lbvD&qI5ewc0GW1_BcB!}JqIhv7;WnW#DuxCYD4|CWPnGj_C4(h(8Zur z`frp|wNzBj7#1x!L2nUa=3Fz(NEH)nKG}ihg)nxeYBz^_u3q_n@tmV=9?G**vki`U zwCen|h@j#OGU6D(NRHO@EyEhaR9P`gVHYZi8W{mSZMb5PiNMJntE{S9cEcGOKPWCgG%H(PB~9{j9hk>i2)k33kPc+l zdtVHU2-(#~nRY)o=T!Ok?Ak7{;hoJ1J_#h?C?!$4jwk?)6Xxq14;6ERh zwlq7$|9G|rcFCq)a>#Brgs@yMLVDindNCu(icbp*+SJi<2uw{$dh9Vs?@iU3`uZB9 zajXd!pfm+8nA*2m(^i@9eX9d86b^&rA|)ju6c$DuGl)7SNF76JUeYNP?s~+Lw{KrZ?npQ7Hu2)2h>@k21&{JsM%c$y8Tjnf^0i}h4TG7laH z64)8h(iwQ$znTx8o2c=6&>R+XfZ$x~UG%l)S=u4y zt3%IW6Ovrp5|YaN@vdzJN!BvI$I3G;crWv3S=)k$nIo#6Yg>Gojl>vQT-#EuWw;Uw zUNVx@twQE`*ls$a$!%hA#;le#UT)YknH{U#n zq<6fp=DP1=@`>r~`{`CrcHc+n182K?vyl6oRlchx*0@azb%kjTOAAl^`kZD$@EqyI zC3;Bm7K@qgAT1}~I!@2Npo)TS(7BHzJyf_Knq_X#<8ewKG8RS~gk_Q6%~M;I43y(x zVqbjQmJ5xHX%y$;eA@UsR%SQ^gd5BZE0)ZE?!EL4JT8adHHTJll2-r%446jzFc}9h1;X`t)Rb}=mhGnY7u;-t zJbFHoH{8j{5f zc|<7WUG9%H+<`%A2=uI{$PF$?IlSA=X(-wCyPLr>{SuV0 zH=YIuq0_jR!%>lA+RvO({aDa@yyBB8fBLfG1J?kdL)q_%SFv<~A4}k(7GBcD=-_)a zDN{i&(Z{!S{=Enju?L$PKZcgNKIn#Uci+YhX!V)4P?e$iVi?#i_g9ucBTOx@ zT*VxX@S0bkbk5-`PUxuDJ|C5pShrZ#xj$Ax+(>O3-qBLh4vc-LlN*nuG&<@cRgmMa zY;^b+9nqme5Nid@tKKs57AdVKbk_oQQn5bxA{m~ySzlz}elLi6H5EJ0FilyGP==k4 z@=$z$YnQPAr37Wq#-*HZMi?{j+SYmSX1s*14+@;unQ)U?w)@bt8?j4ZEP$cv9Wo2@ zMO|ja!>!&tsMw|BW<&JQR-6L-3bQZDuqmAdsNrl4EZH%*si^t1*6>}Nz}m&UABzDV zL$#5F(uLmT=%9TP$ohN-InBh{lavXjtS9xSV?x0gRZT%%`^`1MT1;&%y^2`e$Kbkh z=x14fFREImQYDTmXCCoWk$31eNYEJ{KolOe!+3d~S&J923ENJjLPT{8auJ$(Rv_Qb zH7sE>W%1|6%QQ{m;p_XZ@LBLU^9-fjo2_pHQoYc zpSx$KYwdD82#=#eh4eclL@ZGUvlk;+oPkmaO*Au9@_;8QP1=TZI76#^e%v@WF`^3F)kL`Eo*dAQMFaWgxS41B{ z&=-m2idp6WK{}i>3Zr{r0A0ThhsQn0S#-asHM@*|X7}}>-&3lO{()z%x=p1HZ-Z=* zQU~B*~KDM#vRgBxHy+on0w*5 zrPaQeB^9|9)fH9v0K~_l73wi^Nkvv^Wo?}7nHOe<#MQKi5JIFgEbMv<14VDHY0oiU zXTe-3?yXtQuLPy+n3dahI60Qrn;$=8m)8d)E#b4oS~668@z)~EVFhl8eWjNd)uk8J z_Xp~Po1?T?0xc~rtgS6o6tShnIW^18=OF?ufj^70AQRtJ874M{6`$O)ROwj5IAfH% zr@~vzTTV=uCOAZw)n=5I72yk4Oj+%mqPmKrC6%R7Wwn_VD@un*!G4Bi#x>g%k5i#h z)L@?q?KTN5s_eFmx*`ZQl-=g3tEnlAFS~7KP4%>DrH~n^E*VyKTi9D{*=^~SrA2it znGs>nGx2SvuBh^?RL}ctWbM3{!R)McyLX zH_)M*VYtG=NMk9R;ly93@-MxzroMDqzl0}yW;k&LDjf2)ELhty zfzcj?V{}zfu%1*E1u5eDAE#B9xQo2bD)1k49TEOwx}O#A=*g(N(FFxXOJ=ckThUcR zJ(*cOr_jv_o=S=;&HZ*VgN@_9)hhoN!rc~KfNFLNXv`|W)X#&xqogXgs2VjiwxnvB z4^lJ`M=Cxmc1?STVL)CLVGL~Ho8S;zQcnjrO#I*J;uT%vglS8XGGDhkj06D_IFCf zIErpH3t-2Ny?uaSqx_VQq~0kWsU| z8g?FB=BVuWKsz{lYU-5)YgB!40R&TTjQ~=3so3Nxw!Ro5zGgH-@i+Pgq<2_>r%q|0 z9#{mU;1*MhP8Ro{qR!&ce8^4@J!Yg25vZ48o)ZicQbqV4q@>Y8B~hzFuJP2=L729} z8(Uk0yDCfSi;HT9D$sU@HzF8bdQolBk_rk2tKgWMtsrpJ7N^(LR+QEct1S+TGM3hr z5Szf){~=h_MyH^B63z-6;aC`|Dyt08SfUEjeRcIU_(rQ509(jH+D8^3{F=J(mf@v6 z>QH5Ed69CA0FN3QmQ~wex@A|P1l32kFpp2bEg{B}1DRk{`MQ;@cqaqxz_{4OIobII zi`_E|^5(Oes6V=HhAaQ95t-;;q1v4m4AmNuW?GQSF$H0t3P`&+3C}A7U#Ru3$ka;T%6%fE1W(W z5vji@m=p)*pEZhO%Hj!=t;&kbSVyX_yES!bsIaWHW>#1=J7Q3*y9RM-)tDJfw>2Ka zSuw6ypdR~r=9N`_KBX)H*ea<9Year+QJs=ifz4QC zMcl|C(?<~r^~ZrW30(5e8m%&i-}S@3+((l!i6W3~)&JAJ*HfY3b?ioN$M+w2#V4%Pz>B<_UAiFzM6s3iGqVthI%-w`FCdhgsIr zE+Q*)*35!1TTNSM+GnTFnmNG!A=5tBJ+p9t{dU?rvOLpr+yw>h0Z!VRbhBr9+yjHs zj+yp((+Anxf1voB5uVsY*r7e35%|y^R!;L`PO`*@vlo-#fI2!E5SPH}U5KhafAO?} zg1qds!UA_bOHKW8P+%S7pEasFr?mPOB`}GCQgt|?vNjkzt`;e-tEly|`&c)^l#j8- zEy=DfFGcKTuSy{V%zqef^y18Hq&qv;J)otBA{$n+9P?4kc}giUVAg*XWn9VfEDTBg zE(}t$r!q`$(Jf}lhUzj~DQhVItdUEqOcAb-2ujqFDv<#VRb$7Js-Pq&?aT@+WN9mr zduAI~6&SRh%A)F^-3Ue!yQC_u!dvgb+_n;|1*jIn0isyjFP0OqdMwWMO6r?j#jGHtkzB`DZ4N}T2obYenA(MitJVcG&bhcm*;mp2FhWs( zmj)kzR%c0->DQc1Gfz@!KdhuGzqYh^4g@?^O6ibB2NyilRV*v58{m{dr%3ow5`QGl zlu%4!_X-T~W@@tNfN5c7MQLRT%DM@}IYJyZV4Dv7xNXJM(SsQQMExjENP3UZE9+o` zqeC7YkS66IWl#G8+DCyu40sa899n@7bGBfHJCAlup}7*vukk?^(R5lsr#OVn8Imly zOqYccwi@D1tD7Y33>@X+MKomLX4)ZJ=cC`Qsq}FaG98xCA*Q6NpkP*QzikO^qsbm; zEntFwWwZn-)B9n4zZc!}?naaAfnbyb))zV7qP}xlTCxo1}PqK*QTZEj} z!6rict+YqNaYU)MvS_8q?a^gBT}Je~)Zy4wX*ExQ(e*irCObXXyo<=RZtb_GWH4(o zsoTXmx3r|9$n1b`$HmsDk^r*nBxR#c4TDccu4?WZGhiH@lG zlI%BW%K|J?r{2O+-a!|Xy0`=rud;ly8|`Qq`k;*LG@0YDE~!5?8ljKkpVeMcpN3n8 zw%}bg{Ybu7P;ef9sraFU>QNMBQtdg8t7?x$Ou5X#O!igfc9hhc=Pjh6w~~)Y@R6H8 zo&AUU<0Rw=26z5h?d8iUcgYN}^F68xy%c7b=9IxftH|Y^qPik*S%Ao$%BE6m=q+9a z<5fcm#iA4VZmkXVH5r+he_L;upwdn6sj!HtDS>_`FU56We9EjT#`2g?!6j@>Nmh+Fhy5}9WLKjY(Y3&xi`U}P%3*v`z9`imTT>F8 z^GpbPz9tTF)Ko30Nvm1G{hT;#6cyE0TxISTp)vG=%}7@PCRn9)SoE1&NH#KW)e@(x zIm8V2{DE_e@vx5@Hr<_HP?+b&WF<3uI#aCv1`PQ2lI7VMVc8y8vV5-UpP8d7*P}|7 zr&VGSXO<-P_xdg$wZqg`lPH*=u)MVkN^@2{0}VY3?zShjdGcnLkN@%}t@A@H8I(W1 zZP?IvdA#^@3OWSsf|_7&tLViM>=x`2JSJ!e9u+(ycv$dF!TkfU{2}uD>h>VNeV6YO z_dSB`f~|tj32qnMD!4`P3Bk>Rj|x5{xJhuM;C+G{1lJ3$6I>(MB-kLhLeMK%D_AL5 zE?6RXv*5x(I8WXS1U(9|&#Uf-T?AcI_!?1I{z`V}vrZenj{9P<>-rkX6xVK#rd~$T zm3tJQB(P0wWG#e(>p4pIeAtDLuOko;8;|Gl!^LQP5X43~^s_6`LDY#H6*ue5Sk@Wp zd{K3VZyPqyehlrW2krUBx|AinX9%W-!bu|ic|m%#2)-$}UvQt`9>I3OR>9{4 zw+n6++#>jd;AX)`1s@XJB)C!VKEVxw>jl>dt`Te!Y!F-_=oPFLtQ0H}yjgIeV1dH& zCbr?2zXsbd>&YmVd#KOh8_V4z{&EDf1TzFv1*Zs37MvtFUU0177{MgL(SoA{69p3l z;{~094ne!1CfNIe)C<9G!7jmLf`;Hx!6Sl)1v>=a6x=VkPjHW5yI`x}bAsCiw+e0% zd_r)u;G=>M32qYHD0rXX2Ep}$>jc*bHVHNet`PJpWVt4?Tw{annQtuDTA`~HEEg;h zyjgIe;5@+sL62aLV3uHpV5;C0!O4P?1jh@G6&xd&Bsf}dlwhJ@f?&L$Q_vx37t{oM zpO<{G$^)OUHixVH*EC%9d3tKb&F zCj>VOJ}UT-;3mP1g7*n-5L_>~PH>H2lVF433PG=6tze~KxnPOl&4b<-%KJRQ0zr>p zj$oEx#vn|U_bGyt1t$rP7aS`%MleZmwBRVgM8O2XctNM2L(nd$3HClG^+K>)uuJfm zpdolv@QC1H!4APU1@{Z?6Wk-%F4!vgoZxoBt%6$wpAg(E_^9ARf|~?43f?EUL2$j` zI>9x9O@a-AD+IlQwStv`<$@)GHwy;CU#Q-3bptOrZ|l2!p12nXdIWO@VV1mS2&M{7 z8HAJNeZ1f#!Lfp41d{|u3yu;@6ig6|7jz0b1nq*FV6W(y>=Eo1>=HaCXb2t^JR*2_ z(0hlxzbUw1aG&5F!FIt`!RG|G3vLzMqLBT20{izLLEb>k`}oHG{RyGlJP02h^!|{% zZxY-nc%R?~!S#ac1lI^Q2{s6>5cCSx3RVi13zi7pEVxi`o?wBXM=(b)OE5z)RdCAJ z;AF9%BsgAhtl${IB*D>wqZF2>vS0t;55az&`E6%@hvrFqGw0bF?OzG5+4#nCNL1lq zZ4i|A#uYlo^P{*5P!b+)CsgLe1M%+2ZRxTSb?>Fk{a~Fh0 zF#k^q>EfgO2_%KeSIn8Fm2ZM!1Rye^ca%TD=igGUzOdJCE#Jr2jd=A(miO>^J)fhR zaj{JzbW|l!f<=#nI=S(+RFxCug<8qKHGgNhq%d=IBsjE%inpv+PB)5SeY zTO1ZjzE+5RK@aHiu-&&fL}`Xa+I%fN6wYFVm95Q0{P_cD`z}wAa*r2u3OW?B+~Zlk z=k!QB;i5_DU$QT|~5OzUIh4_Wwmx9LyaTHg%|6A~c;7P$A!Bc`?37!`075tCj z89^TCW4uQM|0(!^;D>@o1^*@Zk>JOIhG3`QCxQXNV}hRwekS<2;C{gag0Bm{A^4`? zKLp#MVdn(#E{KQ~Wdw zt`S@-c$eVag6jnRg7*mOg6joa1b-~}6Tw=++XU+b>jk}nKEY*z%LP{mt`xjo@JE6T zf{lW!1Xl~*ELbGCM6g(}M6gt_Oz;-La={A0rGmE#Rti=LRtwe$dIV<+<_YEt76=v! z&Jmm|I8SiC-~z!P3N92}BzTkHV!>3wX@Y5j>4F)8Zoy2!>4I5;*@8C;&JfHI%oUs| zI7@K6-~_>I1Sbkk61-OM`-0aAP8Pgg@CLyY!6|}M1^-9z2ZEyozax05;AMhIf|maMVQ?Uo!eT{||fb0vJ_s{g2Py-Rvuy>;@7DNHx~@;8_q< zG^j~nBOrl55?+cLAuB;1X|l^h2?Q6E^_mu~TCKLl*0z2tZK+y8d<8-ws8wE45Uf~e zd*h;w5G6olf1fimcb|D+>Hq)#{r*30a`()fIdkUBnKNe|cXsc0FU!9CiYu?Wv~R!u z0|pNI-ry_KI=Y5*l<*(puO5o5!_uy~_PXKM-|#KC%aP7CMZoNXCvX4O{u8|u2+MR2|4 zOVdA1BV1=qKer45<^_vLKV-VnRR((cOHL|dFS~x{dcgUXYo+r^Q}ka?YeW+Z-a$?A2LtoBwjmBg5v;Qo(TWVay8DY=A^ytEMu+g32=NN(f;2q&h6^dD=i1i9~(DX`=wmtJYb(}SeE)P%R0vcmKzKdzuBlIPgMS8n3Qsb z@v!}X{SSukC2e-Bb8Jxr{hdl)>MsoI9QBS0%TS}&GQ~dKnMYcT zNZ)IiX{UH)>c`1Xr>%25DdV4-?=xl~eY?@-oNhc~ztzx|dY@^F<0*yee#HKYa?)^b z3f17a#cjCU`LOX}WkVXpe_~v2c+=QJnTTA0l>i_#^PQy%5%52x%-t~I}xHpVu_1{z77Y`M&G zyJd=bin+uYv6Y?Ra>Ra}C0i*nJ&?xIb|W@dnZk9e>$li4!u*(pEG}q|$aqoF8bVTTIuRzzs5>`ZtF}d z{lZGVQj+$J)t#1Wy597n`OdUzXZO^noV%?1ty>%)+d{_gnhTRYalK>;Ik(z=Z1*O6 zlQnCrbvWvMt8ElMOKsD-_*(@k1-JNH3^*P+ynuzaAKJD!2>&SHyGdIdKep2!OV+9D z5Yxl4u*P-^=Qxpn>S<%6Vr!Dd*uG2|WBavfjO`5IV@dWjV`@t3kL_s;#%Wu60mKHn))@ zb~{@Ci2a8tlZ@hz+PIr(jpMi0pC#*@$JkDxHu~S=;gF7rz{jA~canzL^X+?VOYFiA zkS+en9_drPlJ}!`tWJrfdXpXk%@24PkHfmh*tRDryhWbmZ4n)&G~$@}wb5x zvp65h^=G@+kzrkl^ebgu);boLw=0oy5<`^l06dT=H}>-}c$vQ3vp$^Cl0{Zy}XuL^x8|N60rtEO+L+qgaveeZnt2sx# z6am$gQ`{#6lF0XXlb0u7l=hD7XJqNC!~H_nFtw2^Tegok>6a*DVyd7xV)t>I9iV*1 z`B4A-6!V5MrkA`rCE}fRt{uZ6ytFcCucqDpf5iSQ($>k+6ZyQ6dIafxQhsh91r6Wa zPJKwOTcPt=xa|oxrAuAMwU@|08uMfOQ&HnfbV?*lw7xDRd z(zET#-(Ehw#E8FYFZ3AqZ{7GvJI0n``?tB(HOBTi?lHDTE{&dRj!Wkl3-xpwWqxe` zRYLvq*e7WH)vkli`!Gu8v5#4U^N7--+>bD&>~_6`&-Y!soNqa6fja<8iR39`B2R2e zf6PXI;yT72cCEpz_XOTE^`uK<54swW_Y35H4A}ok+s^+;zIQMpMgAU#-;Vq}%RTVg zr2dAB4O<+~CrwRx3NZ5bl!0>o*zlKj+J>m2+b=f!!>IoDXouEAUL#UkV(5368CRr5 z{^BX3XZMNWEnRr8GvRMt@r6e_AK%Hy$mof?N4Jb#8EF|ADd8(4qgSt985yqr1V|}fL=~#W>W8rOlMMer__xiKhb>eP(1BGBN<@U(X5s(AB$lPsuIZb}2#(Gv%fW z*$BfkicHAnpuZm7dUON-u;4-pksY5IW+0$T+@x`9W~QPS&l!@iQSwq*BrR2ja%b=o z#Ruo9n4wm>pnZFEsx2w8EwhM2rUyd*`|k7|jEqdi1rbs~boG$_DpC?K%B>39}uMx=&oh0=%$ z79r{p{!|R2KKf^*Jw>Ad-&+(yN~RDQMudtO5jI0tpCQ?ioSZCmNdOAV$Vl&=-W``0=--AY1;Q~x@mP|D(vmEKo_~^m z>H!s!TwFpsdK_oY%>igdiBy+r&>Ldm!iOvie8}|Z(%Vc?(sT_-sAT9}j@mEgg13ow z1f&9xkV@&2*@z-0SJ-((6$J8Bx*}rm5bsD)I3ADcmK2XlrXVpj7=$83Zw8XfLqbU6 zh+YIDED2e5^rbsQ^c;RkLauSnHhS>sl|fb~ukVC;ihwX}(aFF{n79yE5D*frWRMqc zN%DZg3rb3uAy0^^HZT#>BtwvXUs6&kq(?4pwt^3#=#soB5&k;t0T3W*P$ynhCEO`)4Lp6j#b+LoRXVhCEA;bh^6> z7bJa-SsId%Qhq9mfu;-5mlPbPZ%d*M;1meVU3&H6y+(rGy?b=yao%VM@#d4c$r5{| zA%{YfAwnXr_!m4V5_|CiqCR?bqlnUr^5Tjn4o9LA!UaqEUhuWie?&?b;dp?%FA^iE zH&v5g5$i(;jy^n~!qJ;~F4TfwC`G6+T&_7hAj;MbrzkWh>}|HB>hh54#2-e9ZhVA@ zvZvPO|)5#j}7 zj=+6YxP)-=av4fJN3=i$85vXqDG$#Poi4Lt+K|Sl6b_OR5{Q`tNgknw zWM~grXc)k~lXAEws2t2AX{0vAUBdsbO?TQ-l_D#2$8$z8vXC|R?Aa@`ch8;* z@9WSFHysj7T>9iex7$dUfNSW{EnH`ki~sBVX-K1nq*fuDK^S#O)sw|sL&PW}(u9%) zN1i(-vjv)t)LPJ5EJ7UM`P5aiBQidV)w4t?2SM(;>67Rv3w?-U2?|s=4oQeEs(C>j z#gMb0Toj1SOT2MGOS-rSNE?>RkVt~ASge^ukn7is@h|og4ho+nmAo)U(pr~hxOC~u z7-2-xLj#19k&P3EKO!_dBp1MxoJ2K9!oVRW6&RhxWv00?O(*1VP2uQ2JwiANb0|!T zg4A6|spNdfFldqM;HD?4#0!a$pM;6J!fSLX4ylC{6;_W7NadL`&Ed@ksUWU{Bt9wU ze07WGqF}Zz+c=DdU{T?4u(y~q2r=UIiiy3x-pshD51(6pCvx#PudkeSh5?@j@V%8t zIb0qLiZCG2_QHUX-$IJg+YFPXh!f;C85I{P$dZx4MCnF@e!$*fa2O2okUi4UGYp0v z218FG%fyWn_Z0kp`RZe!Q~v)C6zViwYWVJDU`$^hFc_|Cw}`&&V*j^A_Jd^oJCtrf zhbb2lE@}=D=|GfwY~hgF$8x0tL+g~BEP#Li3y>2i6ik!R+~T_ zkBCr5Lh&?f@U4b#bFF9foszq_{yQ!&I&-`(82=6PXbKS)JQMM;ZJk(V$N8dp9qz

!^QH5jjb`P1@(GE{kO=oGlBL# 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 z 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 z�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¨*4(GG$?IBdCt~#-a)1xQ@d!TyHz!^v;-1ng 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

WEvaH(keHu3;$F6K5VKyKClRJmnDZ~Cp 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

109?q0UzehLd)t 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�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%0D$-txd(;V7sT zzTJ`e0M_ow)#ZV<&b9@ujhwLMk9p=0!Jo@Th4=AW3NQ`h3!Ce*4FO%PDyl&vYluZd zS}rvSVMS=9Av~Ngzg%Ji{*ODP?KL?4r`bre=R*viy?;OI_Ll zz0;bxt+2fvCW{OoBTbe?$<4AU;oz<~3jdV0faYgoGXIq3Kr^ks5NB?ye@&L@84IySrd4Pgk!-ahuSrlFCkjD&coXHH#4qz`J z&@OYz!mmYWa$^f}$|UetISkRjTuw@3i3WiZxCfM@>^$D(h0Wl{UFR#6QU9r+zM{mDM5Ax|T!b!RMUYgS9MM#X?AQ@GR^ zD#uQ`cF;EY5@FO=hHF|tA-1N3uU&|T@llS;R!1SBod`&5YhhOgph%I@23u8a{$|)j za@KSH2B)0u{ycOa@cT&nU${{%tN&fy$M{pVVgsD|VZ@)dUFkoPyoLT|rRb2290(q- z5^A{0W=W~yfC*lCz)E^hz2Wv^NY@BdZb03kw{aPTij5@i^Z>SMTYwZgRw8oYMI)`M z!pI)rjR8paRyFy2!MRIkP)*GMx406;pj!-=l?{cNO0-SWe6)q>3nTMGhggQ< zC+WJ>6=~#$F%Zgyp*%XrV6MTR3q}y8ZO^lBi4Tz@9J#D-~WO2EVA7NY1)21hwIqPk+s5eX{|it zv3>#8Cu^0>>MrUA@FFPI3ui0sAhoHS zE%gMB(5;W&E{@A+vwf|d_+!eH0&xN`%`4?5NUnGn0N-X)NJc5ux(lAUn{O9`}`f{sL0j^EOce2`T=b^bJ92iuMDqxDS$M1hzMS0v-5cMnhk!W zjWH1UQ?rUbu_XQ7@K4wN)(Iy@@E{=7TkYf9NqWWuMwhXMQU+HVKtyd9~V`7d>3M+Vh+z8&85J__3eIaJzf~A<2q9iGeGzLf) z0ZAzcVqxt?gBlMka70Peh&cw*=@j^-n|@Lj*V)O}0Y$$0aE8`G5-dSL5@OKyyT&ay zy_y@j>A})0gcs8)$0ClcAO|rQ!!H$nrW~wMn{;e;IPKL2FDZV=7X-B@UpGoYbTlJA z%LQMy)GkT1z~9zXKi!X)BjCLo-k*hcrZ?=ZO;L;Tzm$me2ty0w%3Q91u|au! zBrMqwz7#|@!53R8#8!u6;M9|bs5RExP1&J&Mn|2O6L-;ETs zpqb(y#(apB8R9`md81)-`Lo!iegg7WR@{iV+_=l)5+NIAiJ@^h;&Rs*k>#qw3l10I z{L?ydQQWBbE8;O~_l)S7))Uv0(39Si*)ybPc+Z7Bm-Kw5XK2q=J-76DdP;hVdy0DU zdv5D_#`uo$C*!2?ZR15#bz~I)yjfKSV4BT$GG0lK*{^hk|Kip}!Ju4u! zwbY88kev1aZVS|kQ*ixoX>Fhd=eY~g6XK7Z0*AlL;c{j`Vu5=G?hxE5_<7bK4Y=`e zU2yw>zX5RJO$Z0|knD0c zKuUttSq+>`^(X`U_TP$hAQ^Q54gkOIA!w_C2L+3K441OOBq>uyonPQE5nc#IDacEt z1eUCN57x(M|M=06{#hf+Y0e`OiaJ|bFm&>L1xm!xigpJTmzXLjh^9)d7cyO5UaAu0 zF27g)7AXI10n!(DIm(;+&CqbeF~*HOpGC1o;k?7#BGA&{17cF z>2uH~-H6P{bp>qb&&Fvw90Oo(D#ZSUDmq0+JujQlBbmpU9MQwGH}iyZ^U|0;ltUy~ zA}iNj6bM`Uk4+|(S`1)S;lPy4bZ5ePwq23ZJ*r?_U$% zkVi9*YIUCRFY>C4r$Ea*EDYXeMo-I{9l#1<0oJSjv$vJ3qSb}0Y+GBoQtV!fmMg{S zLCfeBTd@4eFsJ{54mq2f=n(~#^IIH_%PVnL<%pRbEqXyE^4Y&AhTaPE>1e%t8Vk~V zgU?T4e2}!XV#0dkiZ35=m4~-4QN3vVX1u6Wrpr}bmWgMruMihJ~cv`JlN9wTZ?4n5%~Fp3Dw z9S6^iTGIoSAlz!SZxy=KDh3nMw$D3sN05Ro%}_3ak3lJuL zfj1O5qrjz)OO)Fbs8`^#3hY$iH3dQnq%#xQlY|1TdNpV4!nEN;$W(;F%R8-PFpf_Pr^(D3MyhR{x8b(AVvovE z1i?hLLfZp)jYa54dip;ae zTzr#(P$C#~&SIs6wF;q&=JMdLF&^nmgA1qQ_CnpM1@9P@kgSv*ki_)@!N~58%t}gl zO`sJL#t~;`P~z~TqR1~aF9w~HDJfx9j8;Y%{=#qtD89I<70{{)1L}#0GN;;f6`V>& z#;l(tJ-cYNf&qHjAA9r!H0u4>j6tSgU*SQ5?xNrAQcJbzwkSEk7G}&@9p1E@RxvxFg})G82i6E+W-G`wAl0!M^PtSr@B#Bgx6>|SHo2rJ_>j_ z!sm+wd5{1H2Ooxb$nytyu}rE~!!zGeAY1Dd3N%MIL!c?F?`WtGizsoP2(&yg1|;43 z`CJg7#2%WW~8xqIr5h5duB(*$iZz|yBD5DpL?~Y+2#1GV= ztrJP=?d=XGxE;gY1{@9AfyFN|_}_&{5L=|`gcOllL1sh5N%@N)m=g)d7OLMa5qAM) zJ5cIuGs?xnW9pW*3g0-vwY46{c*mh_ z#FEUv?5pxE;2kePu$SBTZN2AU`mRnr_y z#JWLPB9{G_pe-|9k;eq}PLa`zOdkmg8eJ3cf^tJZj!m&7wTZ$espVW(A&#J9_Txyc zjd@)+ilp-T#zyE?29xC`;n6(Ea^yaA$OfIAz+^GRsZ`e6Lq=|dOgIII@?~jrzlapu z!NP5}MnTFqi6PF-FY@}CVkrC|Lg`-@VAste-LYM@WykGoVa913Q?~PSs?g#eiZPgo zIL*X?h&Y(Yb_>qzhc_ei)}k>MxiVAZ;^WrvnSH%OXkeGn>W(boZD_I9nKrUPK!o(z z#7H9H@Qk{qLWEcnYk{yytVDVQW#53#QEnUOr$hY!r2sEZk&Tf;EwAhpf{rEBHWgzN z7<9&7>ue`Q5J>`^4Nd+|906xLf-{=|OI?hYyEuh>?4XL>U7*bas?#R(H`7zbq$_R)Yqe9ci9Owl+

I|uyf2XHVVxa5T}7aXU`Q5X(CrZBBe6q$%FFK*^{ef@rqj;DKG3EkE8Jjr?cbK z5oZSWjXT?Y+viq@DabON9cPh9Cr*%R`qI{=0kWzbY@)Mg>JA)JY^C;FZ-yHsK(G_K zQzBq@d~GSNyC4-hJB7u}4U`u}fmN*oz$rmEogJs1MOO-rjt&wk2LhcPX$e~}kmj{5 zEJ2}AXgWJa1MdV#O}JcUKrb_Z5#})XOlQYzWUrE#%oYn@0$OzTviaCfBvvu^uw`=s zN`3^|QVXrjhtm#wXHFgLS?8s_R(8nN*#Sv|$mDO!-mXJ;p5a{f50&G~EMRU=F1@cR0&vP63iIYt2L3RfJ z954YbhR%+47qc_3l_<-FtLFz&7yG6H;(7TsN`W~N#Qz;@WGG=T+9|Cf;IePZ2)8M)T!F7C(5t|41(KhZm^UaePl5Xs zctU~w3cRO4>Mj}KY6a#f(4oLq1^!Ec-z)Gh1+Ms(j908cqXL^1cwT|uE0FYUiFu6z za~0@RV4DIzQs8$A#D7Od7^T201y(4qS%DuY@LL5wQQ(qiWW4DLELY$Q3cRAgX$3C& zuEd<9Kv04IP+*S&zgHmrS&2DGf!h_hPl0bJ@R|Z2DlqInWrQgTEK=aJ3OuF28wz}= zKt_*@FhPNZ3f!&0P6b|9;4cc~JSQXEs=yKjHY%`Nfp-)z6uA6*GQtc6niP0g0v;A| zCr~45Q~tQ5@@FK}Lj2i#h+zy-S{V~tpH7LP@HW)|^0>-k+~YcqK1t`Km&)Fz7snJQ z%VVaRZl)(M4C*t02F?N6si71e^H3o2eF%Nj{@cAredht*0Jj|O|AZcP%9is#E4!Mi zJ>2>Hzh`BkG>bSZ%a(RG>V)T$=8I%`c4vA|YR}l7n|fX`erUX4^nlYx;r4$KT>LW5 z!vLQ8QmqJqt2yvr50{}g3fZivFqkCB^Qf~VJxIvX%|_e8U|WIBGPUPul4676$}`)h z;f#|S(O7HWVG(OzyheTH3+#uknF_Q?5dSuk;(j-NX#TM@irCW#YZPN?`FL^1xuX_K zi$XOM_E{_~$|Yf%j#8jVfkp*3D$t|AFBL#~I;$~;u|$=34o%2-41|<$Nr+U0 zcFCV}l(V*=>tY6LjTGarj)`F2Uf2>dR4ul7eCC;$;VIJtoj7U9b2UUd8WSlEccE6` zAS7jS#iF&$i@BC~a-@t#*m^w-&HMgiBYD>Oy|dguO6bCHh2EbwE}I z(`-U`a!cbJ9}3zLOvGO}NdpgEsBrTFa@vo={i7UzkKJD*mH=MctNfn<+z*PD=VRx+8X-7MFKbdGFN7BkluIx3 zmOqaMLnSM-rY!T&XR*e_ea;pRPRt?w8>N3yeXt%%t4_bnIsKd9pKOjFMCKNfAD+?I zA~;&NA;dg)9zH{YXx!j}J{w$6A`R2l)K*1g2=29iT0b#g(04*S^O?yID3Qww#ZJt}CCv~(o z&#myp{Q`BW&*r~P`s+O#?SBY$xgGu}ICsvL)*-0=i9j!iQStOpKzYPUB6_ZqPaxT)Gi!&y-m zh$-LU89_ClLPBK(Fn2`HnN-~ z2BXS3hDRvnF-|$;#w3cZ01(A#L@5X`uS(lH2w7Jf&b#9nttCqgn%mLhAozuogRppe z7Pek3c0P>*wopIt^dE-GK`Y=EacUdR81gKs)zyK`v4A_|4xZ{Aa&ww;VY6iQ<48tE z=1hl(YVJB$#8Oy;K}4K6RQSut9&1WSf#*Y3cR8~p8}Z&WrUj)SggS36nIvF zUntP8z=+pmgj*D7P+*+`Pb=`M0w)z1{<@4XNr5{Qcu0Y#75J?JB0;#5Dec>uqD#0_ zL@KuCNvQZzN3kR{Ugm`G_FN$&VD|NSxZFV`0ZdVN7^y)n^-a2Z0h za0!mZM6~FcMQ~#_iRNyqNl%wyWK67d6H69C%VWlNjK9vh@|Xe|Q6QZeyP{D{ag8XD z)r{TID5mg66i9AHZxl+ZO_U=R z^=K>_ZY~|T);RT8R4@h-G!%JH7g%}~5vxmRBy(B890gSnW@UuwN+U`paT-yY283`<_=Vg+SAsu0>D9V{I!v|%>zB>0nh|ZX zWp8nT)NZ98(lnT#Ec(Va*&-$a(UVbKyt=_BPn+pfBJJ*Y;)-FpS>s3*(T2S^w`Whq zX>Z5F@VH`Gj%_LpNGM8FQfb7+Y01f5vS3b;yq&VoMlUXo8gEOuIz}2P)uoO8K}`eU z9#pH(vLGYXSg4T^Z`e5D%%e0GBV(a5fu`)^$O9rOi}7GE)`>9DorwDuI2aU%LwR!h z%Sq=lD23Weuqy1?*=lh;tpIIN63gnEWmL)HzVJZj;n3hR!n za~u=%*Do_I;kc5jFdyOqfXRwP$n#iAn&Glhu#>Qigj>vfAXT@M@iJUeM-P!a(X_!6 zM%AR5-y@(hYllX}lA%}#2+wwmjTzvrJuZns5|QOh&=;F=kFOu7 zLxCDWYY^;(-vwcGpy|zxR?&5#LCcTOp$L_mbI(9lLILK;swds2}mn-;`fK2mZ$zaW~*oN0tA@Z`FwH z5CcAqo-e!Sf2Zf$fiiQSNa^`_&gn2(ToGXTr7#x&$VSwtVUvbC0k>jwJ^|Q>Qk@1= zKfa!X7Mu@|;sq}$qcqbp15Y1gY=)MJRlsQpo@QF<($j3y2%scFU0<51A=DZr3j2`G zsg~2G>440eXVmtkLsthym{uwwz$`+lmzEOL^Dpo=OXRS@K~EMhL8``p#bWpY5E)~j zT1sed91n+HPT5!H+*cpe;|W$cG9FH1TL`m#7&;pw5cqHg?KlNi*~-Ba#cc>kktv!M zqggs?57V@-HgzN@0I!CBhVqwd6Rip17_tFDux5&^bDo!PR3LK<*<>YQ`m(57EPV3} z1PeoaYW!3pGQ^Bjy{&@6qUMhpq;>JB^GlYcWBTx<;PDtdVbaX{1FNc`?3b65W#M`e z-~k2ZcZufBe)yqY{pOkc=S-Nqjv7Fn4_j%JNEXAX~N`!N3m?cnK`5 zb+&-Rs+qx_rRD;C+Hd z3|ZP%2#=KZBhql#0+EkenfWrc)qCD3b@nGKm$le0*0 zJS8~VMIgE!CA;S5`(fth^MOZDiZ$O}%UNh}JbnjQ{?$%Mk^ z7)2BYVeuql|W2pi_5k^SnxJak<1 z`7>mKZSpIUYH0^20T?FrH+Rg#jV2+k6=N{jbKBt#KyEuc2*?Xz`!)QhhBv;g{5v&# zLc>33n08EsFV=9AhCkBq9~$2Dj>222VULEVG|c;*rla9kHGEmatlz8f*&05e;WHY( zsbSo4g*Q&a8Vw)T@MR4@)bRTMR`?4wd`QD@YxoBZQ~#jwN;T}#aIc0RX*dQ#75R9l zh7W6)CDQBy+ay8BCu+|n1Z+%K+5}>h<&V*V@>cYoiz6ECWaR&Wm-V#OCXP|2%HQR2 z;AX0gkz}Pbgr#0CnJ0@g?+z}nnv~+4lw9Iw;ePL|0_>nM^F=0NrWG_c%0|vn+q4J} zkzai+Kc&DzWQNCz4L?Er>0Bbh*ls(tK!c`LfNfN49O;e(jUEk2Nt2LZJhurP{E1=V z@oLfbdu$Xa8w_^VMlqyXG`>Mh==g%tq_CN(cxNJFN(-N{NH@E^ezOT(mustJm{Ia! zmQxR0j1{5hP*g=zjl3q+sPwNF{UI*rZZOtc2Ud>cdzhsXSQ|i=TqG8TK3cTJrT~@T%=I*J{MQyGoM&FmmJ_SMq6yQL zHV6YO#+@SCkPCT-YG!8(&hE#IC>Ne6Dp4q-FwJr^O)NQ9!C2whqb6xA#+@w0Z_zj9 zdIHir9;Ed9<}PJxh8)C=Gnw}&hK&&ezhhP*il4Q~R*J3fpmz{Qu4N)BB7(b7y(5Oz zjcK9{^*V&YBLxO?=aX$aGqSgdL)5syundq{*c(N#uT~7_XVn@Q0Yt~fb&mzG3)4w% zH$Eo0n(^mbXfbPQ3+fx#v)FZ73Z80 zu7g4notP$qpx)B8KREqDF%9%#0H+0q_pKq>+Wus*9&LYwihcgAf122jAv{g3qdw&bK3VKVe;6^Z!)NOd^5jel z1{ahw_SkZx*okPvozZY6fj2n^jWk&tiB3yhCC8d+&}i3*(}z-|SODIh`; zbBqEN3bZNkhyr^Rcvpd}J{e(>0(UC#fCArA;8zNKtiUB7$OzLFSfaoe73fvq0|kbi zl$cW#xKn`#75ISye^kJIN@8BAfLDR#3VcC<=M{Kc0YibjKgoEd3Uny2RRPWrs5z)i zV(hF*(PgENRSOM-yqF{eB3r8lpirV$hjrgocq3p)Aq5#25uh2`d+=L<~Wc=FcR@zd=r`N{H))l?<)mG};bC z?)+lIT<&mEe^7`XSBmXN!j1CP4(914Hpz zQ))Ci2?N8rxvur5M)}*0ECNM7(WrHr#u21rO9LfHrjR3*oNNM6SJHMxME28(W9cu6 z2j!(f7lW2mOp+B_5KiaBk+e+Jf!w6t3LH8o-Vml4)^uvspi%v5WC5%j_gLh|Xcj}9 ztA4Gyj)CYg6*;W!{V|*O5ECWbxS{Pb)_)M0rz{iEQh$+Y(BZ{M7w5@MrJmN$$t$8Z zZlDrzMh{3*V!&V0hDZUZEp~E)4Z>9Gvq9`Y@Iq(H28v@Bif98sYm7pR+>~OKLZfV~ zjcP*HeRiTirEbvK@{d*qbNOK%JJF!kjl~N~oM>dmj$=8yHY#HYQXNeqv=2k)Oe;Iq zjsVeVn1wDTx^sU(D;4DhMkjiPsY%q!L#<+rx`Bu~Gci?usON+FE$SvF4pS(^l~^7V z3Cg>uTb_FbkWHwCJJ{(EYV0Ro-ZKBJdup+IS|B#UMcE!~t8) zWeSm?e3iGxok(D->{?PAOSJJoqjRE>7JDFcvqXYoH0owGhEhvYs`a4;bfVFO*cCXq zXD(ICw?13~=H7O1YCm zLl7Qfct}-Qtml4On)Kth+DW6TR)~ckV!wCH&F7V=o3A&s!h5w!eWbaWq809T%v@Bq~iZd48cu5${mq)~aY!)L?`f?+Q<(LS(biC6T#8pl8gsTpif&ggz z{d^`0!B!Z&<@#Tg5NWtq4R6gSl7#%CJMh@6%>oVIzu}Vhg#tlD@QA;TCF zqZZP|CUhLWg0vrydnzXZxfd|*BL$ahxK+bnXqefr!slwZNy8s&=tc)6oe3J^7}5C* z22;eCKgZZ(@PkTtkAb}jXHVqHMRp~sWZ0XdcNrWJX=M5EM_7v&Hu)M>pt+-mlDp>8 z-Q{th%QwT~L~;T4!El6`r!Q#t`fyyGJg+ZXsC-@{toV1vXY-)GS)N;EbWZ8EF{aKvOX0vSza8ge`_5hJt67E1k;>{`TTGPjAG9M}$#+E5ycFeArDluzX^ z4we>Vv&2cN+g0>~R&-jp_>|Fa5mQFg!HO}@mCUnrp68kNjbchl9WK4lu$!4~M43Ib zNDH$A*op=j*4YXDn2IYbT;U5-#uEW1vOytoecllfwNxT}~X;+%}5N;~JGIx#|V zJvI*)WV5$Pk6xgJ|D+-)e;IdC7W{Cpm zN1V1Xg&AW|PZ6S1cur%>!mMM^MId3YMN1=(iG*3tpmQQ+MNNam#gK2%IdP%vGG`DX zVdysKoJbd+Wh`ebjMFhzu*2-J^yo-z4EqM1GmUIJHZ#T1f#?``jm*DBt{jKRg_1QA z6A@EVESXJqhVUE(`v<5D`!9qcE$>W?c=Vq&;sv-__&yDU{!sOK-|yajX`R^LG9Qg> zzQ~8$4Yvnw{J1(%bZea`sjd@iFR2q_TIY*Hm(__ngq5wFFRE{^6HRbCI_Haiz}(t8 zv9P92OdDH=>%sVjQ@_uswu2^tqZnG%sLxNa@DwI+CZ&nyR%tzxPc`~@K7!KhGz4C# z1GRO0DL`0a4qIhDkTUV25v*G&QN%{Q9AT+aezJrO4q(;r#_2Dc>_Xp#@Wp8b^YtUr zW+8AU3u_q%X-Z*!1UaOzHh4rxVH}`?@P@zG;& zf`PUu+CYH4yD);|!DOAY?I!uiKo)lg0#V%NR!4Ek`W}Q>PdPFtyWx>0&wF&J)ivl7 zaS!}+C?Cn(;ZCa`YZddgUX8QY#F2T3jnfMpTzyvJl*$fbhagPvM@SOh^jU^YVR$h! z2LT`rfhST3kWG-29D-S_LkJ#ficwKTJBCpEqm;+-ort4mjX_f+Jpmtd0cD1@xTVuC z&mZfw-$h^wvcvr#b(U-`44j7GJ3Q=*l^yo?IsZw4J6_aaC@8~t{Utz3XfFW5U>=O; z=7>Z*f^$LKI*hAc+&#nPMbyg^VyE~9Myw}sy7*b({gSK^H#qkQ?P`JwedSw4BWF#jzGeK7w$VRR>ROxU62S`z`OJ+J8%qee6u;~O{TzM7Da@Hl#|w>+85*3$Qk z@=y&DdqU=+cwj6)>y2zWlBc`UL-(C{3?{mLe^>i~D8b z-Nk2QUiS4}^`&=>lmFdaJOFlfzq@GPma6&Pryu+{IJ*0H-G%P*(BCR0M^cv?^7Hv} zG?5A2`$D(3zH2=Aap#+|9Xa_pTe5iSHdaY6zbf>)A_4aHsK3T8KUEbvfjZpf>C9Sp z%M=t^bdK0~3I8~mvF?^>(j#%>CH%u=Z5VwO6JD87|##uByV)-z?LI5wcn zK2nsm)ow4ky}xX0Z%SHfjzOB0X&I$$R%#c=5{r$}ln?17Ux_ya5 zch!z|In6CHy-1(J_2)|l#RNW%ROPjL3sf2AB)hjSMSYWxKwc{{MQX<(Qys>0Cdr~8 zu(idkS07G36bZUAYsY4~99Re*bE~)H2wJaJAR*j^(H)GwfO5R*767?|Tr+1`>$K2R zt5d-v)J+dN9A@LBisnUUj~f~>KiAMPgw{9b_KNeJVHUW}_f&fC?@7ud@+bMe)HoZl zE$f_T#pHaD(0ZLm^^!b^$g_XwUNbb;T4U&Y#FrfLxz)4Fk44xkbF&&+i6vxiZc7^w zjHZ2zpzs&7-m~ta1#z<-%^{cJDh_<)Y!104;A##zCE#uj#YrHgIg}!SjMC1kKSrRq zV)J6=i8E_KW*~0%8 z;?btu6u(sHY|ibZL$2oB&N>v=oa@vfcXMu>4y82bx^yTb+9dR!G=*Y+GV8f?=c8o3 zo~ytEYSrJKqwu5FhjD+jG6Qiv_kDH6qX#3Q zhUNESg@)PwnKSkJ1iKE$o44nb@AY*uYt63w|US?JAh`^SM2p&V2*PK^IB^2 zT05bY-cmjW!p$34jtAC>9(Vpd?z^c3^mHG%f^;#7= z)yPhf>0k`8w90oG?!eYYb&elJ9pgqfbeCDDuDkPKBzT9*vo_CNnV(ktme)}noSfuY z_wHLs7^I=Qjvp%y=DTb2)17ts83fhk=eXo&WU~AWO2yHtHh-|QHh(M@CRd;8jXLJv zmwd}Mmdm2ZpZkx+|BVdvdmMSwKLMe0YAsiV9rQE z=miNSBQzUtdOYj$-NnINceuT|2cXQ1M%ir(%zFRbX%63D!1jSNqO87PsjB9;X3kp& z^fjc;ME-D+S-?^~2+x*13LHdo-{3HA@T|@K(_rVVNrU5z#8dAZ-tY|n-G7QVx&nS% zzk~w`&}OXds_-*nr*EX0=QeX%gL$nIXfbn=<8!_7xkZ>lP-J#qOIZSbK}(1ix`Sg{ z(dOJD1f64=gxWAX93$?nn4_3>Tqo^_yVYg2z-hN&exkIX1V8_)1=Hel=lq{7m=oIq z&L~%d)Q`PYa<-U7F8>C2Rl{(XFUMaqWTr$Oz?Bxq^_HQV(P#c?V$X71YDvy<5b%{1 zdl!w!9oh__e<7x#TcJ)i_o#kAQ1_pTL}rFl+n~vW#)J50j=R#g%`9wJT;&w)fBtI59w+OLO`X5X?X@-C=ZROWs_5JW|@|RR_V}Dng!zu=5PX zKjEVVlC2m*m6c7;AG4KN*7B-q!)V4ETA2C`PkD=H_Rs4P4wq}9p> zezi>Zt0Nlt0%pO1t_Ailktt}Ek;o`4Uf&fvw;IPP*apeyKinLNuQx+srl&fJYn%?1 zc^XD<3q#8%LwCtw#+%+`a|`zvaL;YBc>aJ~*|{m6$L#S8Y&}pgy)N%SItZjLPo>~T z#tCb}ni~=}I&Lm#@oc(1u`2I?w}8P0k|8x2mN) zTU??+vI<%i560ol)39a})af)VIC{pIa6q|2H=}Kn(a8H|W3mE^8y%i|Up#G$oVRu| z`m+HS^G|*QUy9gOpzp1!1%QUzqtJMcNUQpm(0Ng4mWJ*ibV3wr;jSfgm_RY@Ij%rU zJJ0e=#3Pv%dy*g);9utsvmNK*-(>t-fPbs-?+g4ph<~~{_=|yaXMqp2s_R(fH$qGt zGb@ceqE+QH?LDLo-S(Q3fc34|O)>3LlXd0+MBwF(jqoTDm^WUEQVB!|=+c)iOpPpY zILf*ds-8IF%@jQK9TLOy%|i5NY9i~{MF40Sgx(> zXswF3WMLs0Zz|)95x0&BJUg28*#()#1?EpU2Xw)HkY>6n#zVyRszKwxWOfD%GHY|O z<6@Kh7xpq>C4feAGqnto?Hy!v33>s$Uf^D+8lNjZ*(F#IeVw! z1-8IDnOC~9wwODIZoXd`i;qXp!S}Paqfm%L^AXp@rx<+@|FjuTg*F?hff@xWb{HK@ zKLa4-smY#or)IEg2bPjclqNQS_aqx#c}`09O3HRgnTHgL(R#dw{BFFwGF~lX^>_`j z$7>1p5_`Oc==-v(`@_Bp;Mn=}l*bU$OUV*$mv;=ML1i`cG0p;WZN> zB@M%L``LVnrB%8702FBebARCHz}%3~5HS-23o{*MXO}w6L^CJzvRPa(yP0>TWVM)y z!G)<6k;Uz-ymfi|^!~KJJ4lR7`~b%*)lrtj(Mkam4|Cn*shINaKzTV}_rypB@8>qr zZRqC8F=GqWm6T#iaX#JW^{fk_bDWIJmT)q5#B(yppc2&@FacpWiRx^WR^{3(@-%iJ zOm<>%un5(2S2H@Jl&Gj}b}J5!aa&A)`jaUIw%C4~aWGO@2;o9D<7fIDkF0($1vino z^Dx*S;9wwPbf>0BBp6r)QY&?~K~Mfn=o&z4145f-;BAZsMA=7BM5Q+cp~ocD$qe}y zM;s90XQRFt5k7?Dwmu`qIXWXRN3&o$L{@bV5UJv-TE=Q|2siPc!%WS@aVJR)`_sWl z)iPEc#ChA~KZiLj( z9>z&5^CldhC><1*JkmLOrUN&x+uw`?9t6xsI523(*k2+%H$E|Tz z<{kGhK8_&=7#U=GZ#@BmMj-<(0>>0>#3kdf3U(8=XBc2O>oUBZVQgiMYUhcg*!5bn zW)x-3@ZwmP`c-ozcam=h(#!>J>NEPF1ds~yHL7K;M?szIFT<69iaRBk2c!|Q9r@W_ z_2N&UVEf?wB>KjT*WbwFWx##7eFkZV9=58$cIM=yN!t-=Lc2+GrVOU(j!bcfOuuwY!d%;y zY+Lg(tM^pIgOWL^@0DRGZ1$A@3@GX9Xle{y)%uA|K}VOSW@E*Js0Ijx6ZfhU)&Ely zkj5b&Qhx^|JSU2!&Wg>)c1b>;osT6+zU!Dz#87EH4+CoQe_)LQBuXsJXfP_$O?9Y- z9Va3bPALOE?=-qopHotS&H+cc?&3o2b~zOC4XuknR<+??# zeh$3`ruimKQ9RI|-Oics*3==6owDm?&IOlg&#iniqGDF0c4Ksz1c6a4w1+whzVL;?90=@kNLY zKrHJ=M5tNmfk=EiD0^g;jutZld_Xh z+{K6`*=3U#|F#!p=evUW$>!^lGo%g!B!yE(uT=q*64;ty>qEg|3pJz8K4mO!&c*zv z>JCw+(u1f&LZ!P@E*odByo(XBlo!4n^CcmL#l0Oy>Wt}TUW!-!V<@FTsBouXT+Ek* zJYv)DvC}VLy09r!=7?77kY-~2qM6oqqW6(Jumh^myw<+r{Il#URD7A6Nz-z!g|6vK zz3?>|58YK*GBS-T{KEOcewwX+H~lzPlUd*j9CqH?&S*cuNP-$;4R^sOYN8MInIewGe9f7xa4JqX0nkB+IDGJBf(JKFC%~sgxHZfUBn11^j?6iqchO zH8Y1A=CQaiFf~J?2QnPHb{ z01{FaI?-Bnl=a4DCS#Sjftp;FXfDch19wqo@{B4h9j~5XY&*xlv};K|UT=P+dUQS% zsWPxIe|rZ1Ge1MolX^lXu?SXlOVHWa$_i@4L}^f1(!OU5=Qg{h9+~S8q>Er0VSU0P^kgFh|;RKdS!hA?@NSJcz z1X7}V6P&Iq?^zQs%D`kvs1-QLuXy7>BC0$3$Rl{?;LhxXBdcanccb||RpXwDCv?PL zxfO-Th1}d|W1tU426m|H(WBhMFRLn~e#LaC)Ojd2?+C=L+Po%c$QwmNu2#Q27#i~3 zpCWOhf?T%fJIH0OQfSCc3|n+a=c5Xg<6p%}PlX!py&YrvBOx{T_@f*@Q498|L9wgq zG31IFm9$X9bmo&5bv=T__TG8XDz+nDm8bOe!eQvZLk)w7&2{5ne3D|d>xR?B>bzF1 z^FsYOj!1$VS5UrgW=8`z;QHcWb^1Hg9O~+;Ps;fmO70EPSYMJ>$+E4@0rn`v=xm0H zH@+NEk6wQ;;(v;;ucLBO{py-tvmL?Qc_LnB-weJ%h4{?~tj|Fi2v6PJ99iGUnF*;f zglhv$Scgsw==0Z2cBtEaX@V#ke7zpP(hJnn7YP@YZEkGoh3Y{a4=|Zq-*8ic!J^c< zoRnmINwgNXL{K%OI7bF-E7Z-pxShnWg_!^OmS%9zgtyVm%D`4YYXk2wLv5fIKZxzX zPke1)A7gUkX6ATa8O7v@G=52B3_Rb*zk38L?B;ci)DZem+KW;rjVL)8wBs&`r_|}yP^LK zJdF~lOvjMF1p7RwTFCFgy6n~WTCtpy^sP%@%9wSsSPowYxV|>|9w;$qE?#nS_rR50 z3<;)U!z>$*n|9t;n*MTBWbPTdP3`&#GW{+jj`~YuB(SlS;{=t;G6qDY;@`NP{WnsY zmytMJJ|4Cf&4YBb(Wa?d(*Iy|^6Kb*bwI5~t1M-7VXMC1e}ea+d95OpCC9dnOk+cz z=x+9(i;IP$l~~@rFPAdZ9tlyGw8qNF}1HZ31&DY?8y{msgV; zv?h?^z!G@SL0Y4vZM4$L(NCV^@gLHTNZLQFv}#FHCbYOnQcS`&2}|a;5Vgz zv_7;9*K{BxY{@)x#MXV6)IFMY-~S(VFOs_P$hocV?hVhvEP<0la~k#8zpzaoK|gir zV(-EeI%jdD<|%6vu}^Mz8#ClEE)3kA<1i8-&ZYPUm;&U=Vk+jd{2i3g9wKo_ zeSa|s^X?mAqawAL-f3p8LC)fq1vr)xWPtOe-uggxqV}>{)eX{H$_(Zgkjh)k4{$)N zQzHjp!G>_P*UlK@t_9qLnm=n@QKBGr@bWVXHjl z-xJ89KIsd6@fV0?uVY3ZE3Q);0L@-^qz!P709x7r69upWO}4VsWHL)l8^+xksA4&Z z7HZK9+?!4K;V3kui@KT*6Zn7{6UHf@2L@l>v52{xBy3@3L@^0`K&9E3R{}G8-6H_{ z+!*iW3}vrNiN+bS8X@UyPGFN($a*k%%S9!-$4rY9q+p`S7fe67Zm1ee$BAJO`D{uM zhEBLC3q*Q*R(uMuxoidgR&4gU%~yyXjx$yEZ=Ui8nD(J`A{9qa2FO`C%p4V{T(Eh$FRdhPjM>DZT28fw+T_u#F&zE=hb_5*gO$6`RZ2LvF5B z`5%LDmN5aK@d7dc3XekC&rlnn8xO+47Fo#? zslV(-hwn`DY6Au3Lf4$;RbLH|){HaMl~4d!<5|r%*Q%~(qSJC4+cS6Q50F=D)g*#G z=QzKN^75|qH3T88ghq?m(SLljrr1 zGOu?28cGhl7imX%&o{JMi~rgl|De_UI`Enj5PJ(X5ymO-UmvCphyDMnK&RdY=K%X+-R$4h0oikOvud+jJKAKz`c`SWnty=y-qij^N6Rn2|DJo}+NsId6iALz#-56XXh`x#NkoqHv z5gzjGr;VrQ38@XethCx_8W)ezHLwudrU$FOKZJqEyDG)AX)~^ryrF7I?=0!KFUv_Q z4(yNU#A%kU{MIy(*t|hlTW|cK3Hr#kev{OO;9peEYvGQmwc}cyar=+p&N_JGHQYSa zr@+Swpn~V@?bL3!LZuQ?Uu`3Qyt1Egq>x&RZd29L>Q$H6u#W)aW)3@uTmwpOrsJHf zd08iom20Ra)4|Jhm0MAPUdRxDvFA_*UWId>e>fxwu&q@$h}1aRzmcbecw;zVIS?7V zrOpyR+KK23I8b}lhI0-@t_~skH$>IJ-E!ra1Y(4g@&*vE#=WOZ4zBO8EI42On#ah$ zz;Z>A7`Q8ix(-o)1{NZ0T?knD`r#@BqteT>Rt_w%9C8niw>j1bxo=?%ZZC~W(-dxEIykeWt z&U}~B(pBh>SuL<#fNepyr;gP$xkjMPfO4lP7;n+4w#y2s()k##H+RW+&F6yT|EH_H zXJej2>MEqt&}PwKL|XvJCg2G6NdUZo4O*mnXmfKtE;MJrPC65KxpT6{CC86*d0_^X zHO?KMhyy&!T#hm=doDj_iEAA^jP_8VNh}?09Vv?bRi(!x+5g6t5>lh`k445qI=VOq z6jhf;2?D};D^iY*gLKqFsj@Mm{sQg?DZ-8YFE2S#=#D@~HnGL`nMGZ0N3~h)=a@mM zU+S8wzQooFqalnDXbyB!D;8viYmM{jP+;RK*5d0d^fPslc}8%1_DN7yS&-;jcGXXb}JO=HpN5|ZpUatioS%45V#y1^=wE1b=dg1VF5Ic zU64)ul3d!M0@MQ_=~0c8xQE;o# z3nSD1ljaEJa9>K>))G>Y@0!6JNYBl=^W8?*;7UqZ*eV_w3^!!~Zd_OwA=ROlcn%lh zF}ReafV=f{+&&r?vJu8)3Kj19*y%L7!9=jV|K6?078f4tf0lvY!r3FPzQOa5E3-U3 zlN6~2Qe>fuzVnBaMTAy2dmh@-FE!KfG>^k=KzkTyCXk+scv*Otq=1oPw;2qF`CmnT-056*zjXa){y(OvehC`QaofO@VbsQU5uD4q6 zdA5)tsrK=g(l2D#e|Cqgc21?hpYH{V& z0L6sAL)8#gA|0XaZ4AFnXZ`MoV>qyB>A#EEtihrRRgx)#M-0QF(fVxZJ8iVIoDpyC zTzaB6CUS9h;Kbl18J_YmB7rR@0*B*0_weOi;BY@r`4*JbFb`68;P5z4`EbOR9^QdO zV`9SuK$o646SB^d0iN=`*q@ee`4*Sxfx~g0dv<{2mL5I?wZ}SPgMVf#FF1MpQZ~;~2{B7mW^S1b#&j7;>h>gAioD%Z{2kMKCezB5D*lfCdJPx(~fu=ol1&Gxk#R?>n6p7Kjr%`&S!owHkv zGlaWv?W?DtM+0k;L*7-Kx+EflaBEiS!94*&LA-e5ixKs2@4-kzg9bzqzOWIX+kA%z z?`r@=p7i3g5?Y2q&Ro~E6+gw`#T73yHP?-uz_a!N>KrHd569is8FBx5suE$@Ywiq8 zNQ-O3@E>-9BZ1H=_~cx}DOLbPc)X{g5b(hGG-tzAx^&w9<*C4Ms1QaF!v5$julyW| zD>Elm&AyMu$DWGr7RbwmYWj(Yv-58|PGLGY{Ko;X6{8=|Y=UG3o5RAAXD+l^1eH`g z_LZg6?68H2m8T_o(_px$_LekRYQgGi3@$+#-p(b+CmE?-!nAm9E<_=tj(HM-b#EwQf z2+b}fI8k76lQfQ&r zq_(5?T2C4skgVdSNY%I$Z`Gt^840qrtD;@|D@xEKai0tvM*?*;_vA3lfd(-AO%(Ta z;Ifh_6F3Z)GZBrqE^zc1H6nYf%8>3IM)yJuX+%4unexaPSPmy;qFPN^Z?bH7TxGT! zaEU5_pm|*nkYQ%Jl2a+vvj0 zdRi31m{<2?d!|TzRFIh2Ar78`FdADYVU>T=viT!V5c|{}1jHpqV zFqpZUQ(J;#lB2fVI)iFzkMR=Os;`)Sd>`>eGkd1Jlh8=ep=U3%D4J7Ue()R|9 zYWk(bl~ST$pqL6t!_8wdYI8JD<5{R4q)A&_;hu^gk%qYX02~}UjHgh&Llm5HV8$87 z9Zs}1^?ofn1IL8Gw>lG8+~n}}sLFdIwoO%OoDWO}PC|txb1$)%w;+%CT?ZCoMORH+ zQC0Xf8}ZRQ*g*1D1oIH94(2^?PJI6O7iQtpxTcjV)rZdjLEoW%dv=TrbR%k!^1J-5 zG4pzGCEhy=EAi_>^;fa;)o=4=@S6D;4qhKY+Wqhg?1cf2DaIhbG}Q#hD05|fJjI;k zHoIkQpE6@=sne@YfG7Jm=v}+-G@Ze#=A#Z|ODV;AvSIZY{N~*2{l)~bX`tD}H|x>% zl~iMAjY;$Bd+3ld34LFyx3k8lnsT3IPERq%C95t!!JuxMn28K21ifv|;BkpMm??6M zz2zIUI;8xw_;&ykN0X_< zehJt}slSv*DcF=RIyWBz3ROJ!6V!Fk1JI3+882s=GX#Do;Hu@*Q;~6#eS7TpqgcaH zJEwiv3mm>hnABQ7!!T4TEV=4Z(t_ANfV>w%+X7>J*t6$Ab=*zFG|yV^Xo8?pdkh7H zJplYU2B66isXV7d8E^s0jn)JMh9`?K-9JKjmwSpSVz4vLMdQtx%bPh>?O|r-UkHnZ z$!6d|ObExum5GD|yfwfzP)k+5(_1A;qNp>wdhfxNV>XnQfvql`2lj2a^iFNDWA5Oz z7MBbK$Dx3)R{1bPO<%=BMqx?H2zwz^X*nAz(SJV~a{%cM1Rg+M1u)dGcLw?(YCg_) z;S{rhD)*%WBax=a((4^~>5ChxWt3bhU76N(pAW{JI8|Zk4vzP^YF(Lep0!VG1q#8q z59t7fMauZWakq90Lxs_+9uM(*6#V$xqU9#=g<&_oE=*hs*)&ex zAWG1Qpi@KL2)d1SODFPOvP0{SF-v&ajelf8v>|P(#BsQu<&Th?Ur+h_NMT&x1cT;Y zok4Q;l>Z9}q8Co(Ur+gyi1R$_DSrqdy$qec_Wli8(p!YA|9}YzH5I!kC*Y6`(0v4f z#y4q@8|GDRtSKZFZ+teQipJqs7*aO?i>9hmnfo!I0#>MDZdoFgfW^N3Mmp_Pyy|;! zyKp;1f9gs*kz}pU5dB)?(tb-K*-MrVECWZyezY_r@_BUD>?!MLzF)r0Nbonr`(WiJR()yV()` z6Mwfl!q?*nonoB942IiEOEHs{ZX-7TZgvEdOiy5&6A_dY^q3t*|8^;K2O2NOv2>ds z=)l8H+c~h^y>vU>*Whmk_JfJ;U?*4W;JDj7_Qf-ZgZS56ZM_AY4tCpQwv2d~6zeH3 zM>Ula_HTL&5NJI;YnL-Es#DXOPn{~=gTbp)e=pQj!8a(l&r2~<`PWlE0`b5SQU#n4 z;&xFzF-6nBN8rj_*L7+IAs~Ub2_aR~sXGZe~y@* z8>QUTH%6yfr#|xveRTzWb%XBA(skD1TtxWCfa8Tkoq9#0EnN_$9(^eW6VS9>knUo9 z6#!Hrh?jI@iy@DRMic~ljjhYVgHiKX)yPb-e5yC^&VhX(3)=zWzW-J1Qn}#MMwjds zpC?;Vpt}jFlbuQSa$OizGFZtM-_MZE8>Y<3bW2x3}!E->wK44#Bi%;ii zQ-j-PB9jP(y(kp!(ac4Df>6}2lz@z#c}7sx3H^xI0|HiH=|w`o{k4`Zrq7sJ+k9y1WM$&TT&dt|1ktV zl;Y{N+BAu?|JEzNV5`=--JMz*`u9J!gV<_947zSs?FzMM%Nb0xwWJ+DJ%E z-qnO1*ca83SBWk!R<}0d5eitI@@ZJlQ2Qlg6V-zsZ*=mXjQ5pB0S@2Q2v-U|0#u}V zDteI(U>hyP`r|gz5%H2PD3SES|3|aOLz#<*m3V8jLY}H1)3p;hx?QlC8a@M&;gODy z=6C)YDi<6+ORsmgR%=Lo4{aU>v;Nc6enS>OGKIJ^e~c~e{5Q294D8rXXdo*8#(@7M z-tLc#^YxbclBK@R?8v#$B7r6l+5}lqiV`JYMJMQ>&_JtE_Z*HfQn?XT$La(hzlA!% z<&z;(Xq}*SzZKwdExXa^jg{RFmRarlL*A=}$rQjAXj#Uwh}OAM4l$Mg9WDP}A9zPE z#5q_(71VP`1|0Op;}LDdtT6^3u8<%59MeWy+g6=|rdn|7vsbcKqi0Zl zspiKu$ZoX-xX6+XQiS}B^#@*u-oVypVk4zP%4d(|+433K)&jjkCP3=uwZpZzc4%#L z5zz^1DNZ?x?;q61;|c$3Cw{Y|xbEihVa5~Ib&)kCtNfbRV=70`{g0($ajD4_RD zIvB~1Ol-P-ngjGl;_~&-bx2Mx3eA*^%RC}Ibw>pA1f4!Q6TaMPg24;L zomgZjF$+r(_cvFtwkgPj=M^FKhEDTH+HOg^2xcE}3$Ii#9#>nL%LjvqoidZKs=!~mmH^(rouLJgCz zqAU*Ht!-{Cn+IQeArfBCT2?Ze1_K+)xk33lW2)ud(2+~^bt4J7L*PW_qQsy?LL;iljqt2fe&zZgLEY8?D_r0ItgJ+4Bd=0^{U@Bh z&VdapSe2perUoNOb1a$%@%J(OVn8m%>cq5k6k_7mo`E8zt>Tcw46qFFiYeLuHYQrk z;R`T_;Ok5PrDChWd{0k5276LA0rzD8QOT!R*{4;qA?Y~T3%DT-Nzga`7>SkgEB91r z$@WV@OabmRsP{~>V3Cf%RaR(Y-%meKKP9`*xuHVFcLb z2H~#;DUR=9vvU{u2CfGokW0*bljSVEdlBQoOp+jv0C;t5o7`rBq28Xt zdv}=wmdl4TE4gG53DQ(v-x>0HY{U~hv*3x5{8Bvk_4RM;2$;i2^Q;YFOL|bYq+0dy zIIfSkl5w-G=Yn^R^>Ey>cG(W#a}ocA^Cv#A0(TW*@&B zF&unA=++pEtwNZwq91V33oe9_E_iCNocGKG4jYIqous-ZA zP~9a2=_PIb5weqz`V%1i{UGsC{A28cQ=l>SY6Y81RiBR0=T=t-`1kT#mIq*-oop=i z8Zc0N2MrK6VP?qUGvpJE&>4Y9QQ2c#Q6~eQQI-~^!U-uhut8J@o{A>&jAq$HU2EdP z=jew9ZUaIES-C^BUVLZ%Nlf06zD`XjqLXPX!+UM1j}y)%b38=v~^_E>4ZYCu(@vrlZ=Mo#`#Y z7_IDjEYfgaG{2wX4qLP6KR{F~T;CpZJR`mT5=<-n1Wr|R0BG<6*XowhPC66Tt_fA} zQ7J931h1sB%=~mU627BwB_C0>I3N8}mIl%&>fnHW%wovgDeq~Iev+}S1YgP;!J+QFI zVHnZTJf164bDaRx506Mcqp1lwn3()@kcOSz#B_bYmv_6>Rhxe|Gp}p-fp<=unP0nL zW`052bg9vq`Sw3R9HtN2{cdKq0MM`&xaLbDv;1JBiL}!hbX9!$aT!06X6(5-TlYZ^ z>cF;57D9+@xaQO%Yfv@mnhT1;GclKir?*dH*4X+kMQLo^xxa5+CII0xO_9ei(+QZ( zaI*Oe+P3{NX&Yp$3$XP*!Y7csRSys?i1`damTAbkw_!3)wf(Nn6wA0S!`)F^tba$Zr_=ZB%JNEgbqq!3=WD;=8PF<(DlXvbC%ZjO|k7w;l z*29Z>B*F_{U4E*r2x7m(KREujt7Ot9qI8N;5KzvG9bluoz3$EsaIL=y`JCZi(lJLy zI2CeHijFwL?W{*fbodA5HAm%g>yF3ibJw&^9*w0xsI6zv17@OUr&V~q&A<9c!*I;H zKEvo~A9*ypCR1y-bh4Yuam=V16n>$yq2Sn4bp4oV^!m1uO;E)f@5n&$h1| zWgQy9B|<8U35^<6hSao?6g`Wbrz;>sYNWs?0nYAvDn7^XVlJo_fcCZ{c|DnW!zTQJ z80VrlZg4>8VqX`XK(hgxOttp9Q`FCvI2}W$i&`e6mOKgTQnX{8^}9P84JdW2UIi;= zb~nSje*QFE+Hb3Ipe}V)9Q3(zX;)yzoBm9&6|egHEA)S{8RMtbf~Bxc4aE~NISMmZ zGJPtO)*va|qqK{y9D+&}zUNr4>WB{NgBZqlu({ApJzfvqjLGQ?x5!x=j)Kl3&AbIW zY(a61#w%30RKkp4F5Fzo*0mB#kh`@288M!r63=usdP}b08AeCPHo{qGW8|RRt?5fB z>;CC$_|U+RJMqv~KZkh{>#F&PoY{GZ+x-Kq0IB7j9h&GE3;X9> zI5NJ%k>{8sUb~?SS-O?i)LI=<#h})QtSYqiAr>LS+y)b>r+gJcvIM}w(ZBYVQq(uF z>LHe}di?p&cntnKXje+Kl^(r^Kt_tSuGvk7J`(<|Ns%1hdnKVQqk>io7hX}^l3_K2fn!KJoirDH4Nv4)f$8+d?RR#N^{)sE1P{WlY zp#%6Ksso@7ce?gqn%x_&C_?H~DX$iNy-QsM>Yi3u;V1e!!$Im=n821y!0Z;N^i#M# zd>`kySRc1aKS&7FuGsr~hBXIRIOf94<>s{r#TGD{ zNw_mOfGVP6^bLyn@AY*CI`mirQD3N`Q#MBK^GIGxWFo|}*&KQn&Hl=JJ!vqW|5WBR zR^=V>maM_ht0Tt_VhO(XD<}w^?{@;%5Axobwy5$3HpLjVdI;QQHsh7!8RiG@P+apa zUe6vmdICxTOvl4;CF3pWi%L!>82IhO78Lb$q1Ao{DUF zCTA>!o!&&*M)I@2Hu^!|Ri_G|fXJ@*b(OV0#Ck#Z#Mxr&EEcW{x!m4)mYheF9NXDci zQXYmo9j|IQfia;$bvcU1WkQnq9?3Wri%d2~+pd@X2U|^eV?BwN*>rAfJ&W_DWiM`( z_o~6=tTZg|<`~j4bYW}Idy@o%3$@PJ%$a8%mq)tiu7l_*k~TmeV>xVo6N{)$KYCX` z4-j*T!B%F&!ki;nf5Q5U0+_V|S;I*JqMIy3mfidePsInCT|mU2!}sa)dGGMkY|@mx z`RM>sTm+-f=i+!&+i&gHY1z;fvux5^oHDHm}afev&x8pM!!6a(i+p8`*P> znr@eOJR*KWxS9QBW;&uuz+h{_C#3KZjO$Cd z25t3X%W22mx=y|R2H4VaE(nZl7ux1(W7u<$tp19`=$iT!Q^GoBnvU=4>zyBJ`1K;J ztiv+IDgmc*5FdQK=bhwQlQ(S{XtSj=gfk2h9jfVQX}oJCKUOj|W!r>eJ}2%ODs)vA3sdtoJ7Ya?oT zhx+wi1zqhUh~U!gbH_@>_$8`vA|{57uXKU`L^O;0bpk9byL%9lo;=7Cm^+=m>y;4FV_T ze%7j%K^H5gL+U}&0SjhEv+KU$1rAkmmP~m2LY0ID&kW1$+H$ek0HVGM!)t`{FX8(c z;@upwLVbT`v(t3@;d7VidZIuhF1Gc4Tw-hSDGt{qA$0*PwlIljAUJ@=TYJ>&s1k!c zUBBdZdn*3Q7Ix&T>i}+cJ>|6U&~fvMqQG1G*S9{dCYjAnf4$aI#08gtngU8cf z&zGixD(hkp*1yf$urdrdle4^M_v|O5c?jv3JUU20girUu#h(k`ztD>uyx-v?Q_@NSa}`)|0;G-2GWHXXqlg9jQc zO+jv}!Pl?UrE-3NoJDWFEL?Z-w@YD{s`49=Z&nnF3m3XNiKveU(rVno1@yH9HS%l? z%2}j>UFihUPFAl;QJA2+dxlwRZwF)bKS9*y2dV_7<8VMat_G zEWp9gitrJ^YWP3Nh!I@oNl8}IuxZwy_E5tEEKEhK3&bL+{+P~C!!1NPtgrVh`2)Js zN*MIufC^uHcx$x~3U1tKBnRL_2>zu!YiUA;c=5)MBdQBp0X-|wDu5=p7>hnhk8t0dJyBn7;Gc0v(xs43gMaA!F@zv*4dU&C8-tg^3}O*Ss@Vt|~U@*Po- z#biC@ZvjLb64~G`L?iGn5+jA_5s)q|-ZvMvNki}=sX(2FkuHJK$5Gm@K=qAA5(-o* zB1CH>T00%dkjRO!r10xw1?mSK;rpfnwI7l2@YrU?`8vWjOy`@5LSoZglBO%T7-=wX z2kmgL)jPS25Z6{Uc|HPa|G(vUCfi24LiHJTLD`=PFp}l{aiZi3!FCR(J3Y36GFP0> z@Nf7#2FK~UQD*vjP*Ue}FiCSC5y~tqZ5LItkmWU>&9Qs_C|Yctu}c2I;f7CtNx2!L zYVWW8EGsgo41aP4w(;y9|AYuBGV>qcT2|&+?mU99Fl}kh$07JnflcLPkj8unYk%3# zrKw$RSZ*>W(q2k@a6p}U^$SquTy(CSCx%3!;{k;X@t%4K0ccyhMN`hRQ${~`lq_Wgk; zo2Mgc&6%Vz?5R^^0a>4f8HO4WH27cE_(9+FZQ!uEa>h*RD8l7e4AVXy{(gx-qWiF^O0k zuRFcw7`InVKa7$1z21rXU2RDe&N?|j{=061duKc-1J%5Mwt3d!y~T7_ zO?ObI8eSyE`t9m+|D2eNk>LzKAe}~u+>+JgR-|dXTA%zU@RQ5*PL4Z>3)z@g+<|ZfPlte_g;WL zhTxZaf-CT=^UQ5{#UoFf)hg@=ZDR+`5A6NvA1$VVdT)ky4BYNKy_-SVX?oqS()R1S zm8Ym??HZGiJaiipwj)9BZ|EPs;^E)80DQ&i>loO$5CMnbdfgdL)li48LtvvJ(74x8 zs-91g2_U#w`D)|ff0S8+&TuDC3u|1-OzLi|$=J8iJK=v3ri3ljA<3J@qpy5RQ|*a5b(zng&Ktk1xi|&Ot|EC#}ZfI0I$Yj}?18<=>*k{4P+{#HOmk zpOJVC62YnS_Vdqys)?$qa6iCv@Sr6;x;F1;XQ8Q?!(5fwKUNa=R`VFmzXqK40Yj zOme$ed3*{t^+pV49G>jpA_?@+VlMNe+Nv38=J?c#ZMVnaZ35l&-yR>F;HsLDVUAC> zp>7+RpW)T_l6x7K7XP}bu}D*!+8rDHj01Xi2^L#+f8QQU$aVfpRx0$XLFo%|{bvbYT&{nL+q`=*&kfCb{XhC|`!Xn-BtTA&Sx8Q?kr0VC8 zY`OTPu#Y2O);K(c!>taeC~H!x_3rJ=4HOFDI9)C3U9q#yjz0mc0EyE{iA5bQ}&3;42ns6_K*ktU6G7P>#-Rc_PTO7^mrd*?9+;=Kwyw z#U@}NuI)qKde(R1=#DoI79miFeSYqaP2ln71*sve64G`6nLDKw`R3GwOv!d^!wE8Om!9NRp@AL{ulk3ghh0 zcx$=>MSIqbb7f1&_#-+!U$BiiP|NVKJ6!Y;0XNjdrG{oOpplh>@YmcRut{#uIy{XF zsZUQ6P>=3`br#+mmOOd@r-|A&p{gzH! zIB+Gf(!z;4LX|xZdo#X%H*o(!e*JFIA~prz=4lUG+RX>}O`%(dh5v}}+$CBFv!Oan zQ7vB!y65qCEmc!U{czUtNFChVqxY=dR>ThD*AJ(o$P)vNB>WwO2eaG4aoD81IS;6s z(=(BNCZ5rD2Nc-)GG>pP#@k>UR45%^Xm1(T>Jkl))(W}|-15A=+JM7e^*O#mXHIgZC;0~ABzZ5I!Can~p1T5m4NX*?B~i5jU!3{E}eZrIDR2~Xb| z(}d!U&qdS-Pn&ur+`VCCI_kD%*DZ6gt$abvhy6an1wV#%IMGvqEkoL()r_8sqo>7v zBcjAtxdc05BeG^KDEj0StS9%h5$4NG(+p+KCy_gI1D`v>mjP9Mzk`hMi28d5YVqM- z^hj1C+Lm>zT||7NxfmH6v*1~|HR~?sjz{iz>(xwmFwpGA#mQR#-X1Y{o#J(g`X!UM zC3ed9h)Dw=?vO>8IWQ=tixdPcpM40DFM7&pwt|S7@hKll>j;$P0^aH0ast*Yo&asG zbk~cDm{XpXw1WdGmhG~XsGlW^5|tky!uQz(jq+-ouOA`R4lXxTba4$tCjwj+UoY*lz%WKI;0QU1=ug}=d&;C;hYfCPm$h{%DbWx@pG^ip}M@y zgF!u2d7EVlGH=+Q^)7K?m!0aJ<1vdtWO;<7Bdz8pzylW+m^TIKX&N^}xDOwmRBA9P(S#CzH@ ze$!sYnjkNxG7NVuY1lYR&Wf{XJEzEYQP3N+REqB+;`%-L$83Q#&8c(V{Whh;7V0SZiAA-MI3={pQn~elsQ$i;PdT7U8}?u7e|8_P z|E|%~`d_NNMXH>MDjWEelzi~zJ5J++&qvgSNvH8a6XzW?O|#tfMc{*1mZS9e2u0zVGy0NtoVS;hVX zXf~=k^gX*#oNlO>08-86qGqF`e)Ts3x>llcs*L*om!cO+(dVG(0`=Hl%t(%&$9V#u z065GWw3x@wA8KJW9Ra`IHQ?=lo*~o_!S4zDs4V{tb{ry#^YxRk|LB3jevBrcLUL8! z+iE&)-9imbX-Kr6)^Pu);-((cs0RE^u4S}sQv*z7<;<-ypVU$LC600^PXsMpu6QCIEDD~E^g|4LE(ojc@PBts{MsCdS!>#WWE!~BDcPdwe99!-K9ni#|J_+G7&9Z878=ktr0dyb#IU4-IbwMP%S9L zacm&csQw74>s^SZAsX-NAkV9cK7_eEEkp)FFtGfsL0Um0ZN<`gtPco(-OBBSUmQx8 z?;r#8F+r9>2rcf14hZ2*jZp2UFkZ&O|?LDh&5)sO=)m zgHG3o6J5`Tr-AsKAWI0@RDD}_f#O1~9%5JKEO^NO^xGh^Lmmg2{f`1}>@xZ$JfbkO%wgF)l^UHy617hm-GjOel zx|YV)^(J0kQ~P%iB>V!-X%3hfeiVU8e)Dt|a}P6K&>NNQ6c;Dc569ReRH7gv%_UNX zhnHZbU9l3w(E;k-@JwgTUFSOCZ~U=t_!Gt-2x*iL*C*ZA>ux2EDWIBRdnP&#Rqr|FI zI5Fru5?riGG8{YP)`|DD`{84g{0vGO#E!`29dh1|`yn-28WY|b!;b%qv4F397E|1>uK(uqV3Yeo2P_eL#II>DQi~zJclJa_23Wx?hqxge~fd2ur$znBPT9`VyFG z;0ZKiJ=6v8f5qe@j_zxCXcf zob14_&TeildY$Yq0H-P3Z?U%i0lRzZ@NBRQY?sumWFla7Pb@esqmY<4@J{w}|LPik z24%-B?B#y@DEO`my(~u`)a#gkSebMZX`+vM8d0x$0*z5u;ExttuDJ+(+g4cOmX=&F zKiF3pz@s598YAaNt`UEYe*U9(SAUJd8sW1Q44M=EMfuwv=i0#H0}cavp#xrZ#x7Ql z58U_H#i^x>xcs#cYF7G@UrS2zIScCj@3oEHU`ld?Nd?BK+`ulH~W3Yiv0wrsfxuJ~-lNWX5Gc5iI#*3*Odyce%2NKs7GdgI$FkC zBpIjah>=g0VRUo`8R!7q9hD8maNoWHH=6PyD0q(_{fNP_9tu4`Fq{_Ngo(jJ7?#RW zB2?zNyUgMHQZLCw9FRmPG(iMce8RzPR8@D$@Mu}^c&H%(oocv9RN0oHwFmU4 z$NpE?UxymLI|JQrlNJXfxeBan5QNB3LoE}*%3ADi-SZn4W{ZE5emZ*-UBdW^q2&4^ z1lknAq-b1>yWl!i&ID+fuJs!!!ceUHF3c81t*+H~!hP?I-wyC7+8qnI8u-xSL8k~i zV7%j{&JcS%?j+18b+K1ifTn>!-3| z2C(|j){!WTM`YS>JeEZI?)DL;fEU5InMxRMbO?9WFI}AB6dj0*zI_S6pD%bA71B`d z?$mU&wlAhbRMQEn_DHk-CK28)LwKuI7ky9P!mjgSP%9nvqiWI3@eT!_Ge&pQcwgeh z`3;}uF5dW4ME%gpQKjb(ehQPFz@9)`1T8^;^6j%l30FZkd?ZLu;Y=-C0#^GjXHVuW z#hMY5V}fD_M`!QRlQMgKFcQ0fkJ(GLaPQN&^zR%_gkbvO(9L=lMaHvyc5zqnUFP4Q zN$Mgz%%O>zI?Jl3CvDlfS&@#6Txyj{BP+|<9w|f0#I}H;VEy(`P_WBEd$IO00(9|W zf2*a9jt!yXn?c8&*kPgLd8gCy+nfJmB&w`NwT;AmC!!`A`o z|9=^a3;vI>h|2bsG_Oj+jaKKp(HYJl41%E9b;nUJeB=CTtwcS5A+=+{FC_OfDgM(p zuB^%@S*zuQ#plArz8+&oYsv5QFD^dWSUV0Qe~`mS=cGtC%YdbYJd!?uM?+!fHmY6O`{1h70W#)*wf+^{Z1rmI0cXRSd@JK zw*htx(1UYw0vP1p65K9i{(w&+)P8$z@{!X!fvK0Q?vE%}y20?WK z&Eq?Wpgp%^<@4U=6&+m(^Dn+M43QNy`ZxI5XSxG6>M~qHq zjz^ILH_yxf{Y(ui!K*yx>fm~4Gqp8H$8^PW9k+QSn!gsAhdehf4WXoiMoY2f=Cx|LK_ zpRh_ywo1I0h&SQ+-_3I*V;SROQCF+hTSa!1l=&Ld6@B(DpXsqR+P0ygxtSY)ah_aN z4l>85>6>6G3pzM zs}996^D1PfsbdHg;7HH?5q?Txhn&~SP0_i*+7CP{Izc6bJwddo zD}yHkF`=qZfumv^;bRuZVWf|56__f-OG}&#d2gC`0B76SbY2o%WT!*uLOM=~r$t4OW?p9D0JhSo!7Vs8bcj(;oQ6A3_Aut=1q$&ra83+W+Ha%V3g6K2Tx>~E~?ZoJ4h1m z$JOJ^PAyL)AsJ#WSfTYjMt+!5e~;&N zYRLe^Y_<3Km`Lz%J6~@*UspLD42;1{Am;zT8x({0)qDRNFEa-3&HsUiw;?65cvZyH z@|XSH!V|w7&>x=QB8LfoO|$aqi1gP2Ha z8?L(%RQmpCoYcW$o;?Gb+1yr$RS5xn)0OvT>J^+0pyv93$m58d*NS~rzq*CgleYn# zpoY)0ZrZF<#lga#*0-R#AXIOKM?C8${#3m5*NEeeM9;cyo~M#L4{X7BbToHQplaab zo>bvk*w-+we?UF>2_K*khi^H;rxl)qirzuKLDDE#2i5{h{PzyX zANm8?ysY_Y@)=u`iMwYOZ`>YH*Bv_$$(!u^3grx|rpFTfN?dr2e22xCT(!96nP;Tb z+oe*hT+f3JO3O3(deyc;NGo3j~)YV8RVdg`Op*0{Zby?L+Uf=rQifQ`^i=44PNiS z4XC13E_xAI3$?`*3oqZNXaktqidvefxnZVZ)Pq3#SAZvThUZ z!;_6Z=SKbo4pQ+Hs(=9^ydB>_YFZ1s_J;d3OkH1sI&JEIz5@oqhp&%=x_@+;7nAze zP%XO?+3^A6@kBnI`Y&&zeq+|D^*hj>AT+A@@1y^N?mx#Jm(V?*-my)!C^@Q)2%!*? z^!@Eg(&s}P7(>#I|5uv+686@AIEa?QfN7U%g`KBG%R+G@@njt&;>HV4yifQBXmSGT zVP7${0OVO)aD)1;xH$r8|1gK2w8mMj7x88$$Ig|Bso|S}Huz}5vBhU$+n2)yqb_d5G8Wan$h)Q zB`M#??lZJGd}gUbef2iTq`q`kfr@_%p~eEhMsGr>b|x=*EwXFS28(7F>Y)|l%?4hB@vSD3{zxIl zC>^DsmguMbp2m$8zJCoh0YB}hSxpMQr+)e#H62Ro%0l!+7P|j~#>nbMeBdWo zJ(JNuIfeq|F5AGtES)u7y}XV!c%htE4etP$TjH%ba`|ky)R6jT{sMlq+TR1$M?W3- z83n9B0XAg6K&oRP9|@!~2J*H*xGCDXUKGe9fS{lEQ>2$dgGI@8Id1n8=zf4j#>QD- zY@Ef###vZQ+}_NG|M*`vbK&ni5A9SXNaw4-D%rGyFww++4rsJs4BYA$R7&Y6nGF8;F z3*e8@I5U{L2zr{=FnreI&NmQ>tiZ##{O&! z8#0fIbzg4*1!_o(xZ;+W>1Rxp!K7601!m5Cm5RzZJ_w_*BoxMW;!Uk8ao`OPrXmr8 z7!-5P4e;n2*|-Boi@?dFi#i5QHZ5_Rqv#9=ilPWSQp`|a)PT>t50&hD>SD;axq(_& z;AF)2u}rZp*L=JN&49Rk9=;A0ICXSULf}+WS^L1Luz~Ni;!C-?c(ii=nh4|VSz9%Xekd{4*# zBLpTw(1@t0LBW8cpi%=G2nnbhMnfPdASz;vsI<-~EvJ!50^@Bgil??#r5;M3YNcwG z0wNNaprWE8;t8om-Q%D}i5e+7?{BSr-;;pa_xY~t{pYJCbMMpIYoFI%r!7=@QMo^| zmk-|J0`i$;#|piZlO10yImwqD??6qLQIqW#_IE(ZXaJg3m|%YWe!Vw_p30FQ)zL_rOGk$bGcTV#S&%Z`_c}5 z4Rciv2%5)Urwf(|t}Ln9{`j1LeL`N46`tNr8>b_n5pmv~^5IJK%Kw--FGX8sBt+d5 zMueSuHg?&1C!sxH?4A1&@&4yQ~p(lVQ*(q`T> zH^cCxB8-j{SczZZsw0p`$+3a}*zv_{XMjkewu-;L`g#eho&i4fwX^s%+wSF=#wvD- zsHy*}2KRvc7 zSo;nAWC16N2hgb|57$c)Q8_XL;UaCZU}yIIAmZtJ1jc7LL=X0=J{t@X<5wBTX)C1lYubrVkcXw#2Nq0(SBP5ctiTz&dV zyU~P)vi6>o(=&2PY?vtXU^Asjyk065h4T^qNxV7r7dqwiyAR)OU^*q(1e-atz5RBE z?ze+pi0w6VTr7JY*fw-IM2(yNqtJ9SUt1o`U!Y+ zBync^`Ux{x;MYws;U_*yry+plpSk2|Wa(5fXDh`>w#H33q zA>6%v&#q_C>W%3^p0}0#6)bS~BTedqR~-30D)s|Be!T|{z(+6mc6MK-{g|NLpPZ;P zRH)ZLgA)~6#QPSa#rqaQ%KN@2^R4^E3dWg%-H|9w!?L#n7}Nnn1w}@1Nhu4VqUyHg z-X7xR%Gd^0p6T^}jl7D9J&b{eWUUe69*<)>D z-zU~gfkt(j;{Ono097l$veNsRX%^hf`r6&HDVeS=L}|NOPFV;zP57FfK&q0)nu{(8Q}eEb1;px(5)Nxvic4K-GlOtu$GC_7_IkQ2j!E2ueGjS;4atkR z+Nb_y`83Y@nQ0xUhMDOlGGKU?kRKjR{3a@@nYrQihP}|&z;$*$_YF^`w`8nP#Ypi5 z`VTLLyYlZ?{+-3Yv8kDGijJ>i4-i&sPdaZjVC%sqFb^TOd-X`cXr8?qL$$O z>r?U|@~gFOnFJrU%#lQ|l4#0QQsz;Q{>z5`?tk7yH)n`zrr-@ox|RzT=;m z8Hggi*ogHT;ZJeMw?<@*$Vm+voR+)ltDViOa&ubUd)WXTM^D3&{8hn}+gB~TPI28JJH}xgb7gfXZ zENvMdxyg;R4jE5sgOrLk00v@9fhMD8Ip}Of|bi+_G#O=Xs;}$aj_qK z^9I`}Dw|BCcIc7Xl|794HDR~3XoX8O;=T1Wg7dc&2 zqi~>^_BROBv3s~%kn>ntlBxPdt$Kg#0Ri=eB!9dQv0t*UAn|b<-Ozij;6*wzSbHa# zJ!<&0CtPZ{m9bQA8m7NICzR2LSff;8?17Kc5B7(4O!bQu`N9QG zc5Dt#qkG9k!2D?ibAU-UZICN?$TkhsRy||+KuUznaSwi!9@dV7FWjJl0l&;WxlZwH z!qfnJZceCt`C!fZ+ea9dmfCmc_3#>l*A|Q6Q@x>_^yY@*1M}CqxWJQ&bV%g#*f4?M zi}W;a-T#pgE6e+yNafYpW-fHagOV57H3qIQyDm) ziG7&7B}Qnw>3%uZo)_jk0;wV=yC@M6)v+U04pqeK04Vi!b-J^&eeo;d z_~SqV9XFOEF^9s?M?S*(r!Z20?WPDBK9h__ULZy@?1}0jKPPpLbECg#r-H`tTliB7 zxm$d20jy*u-)#p$Z!k}y?H4ltV$+Y0%Bdgahg0<4SM15s(>m{!m6ve3n@vRPo@?79 z7jHlI1{w(;6DDRjz?3x4vXC3l9r41CNtiyoY2$uQ;PQ!{u>57V{#HT6w@)C5cvPQA z!qo_y%kM8YVwT~H(icl&cd$t=-;dVz%-EcE^47Y1tCV8SR%8}K@nq|z$hW4B`o5vibP@s)p;>DYRqP0WYEH@#!jHIWOhFH zphlGwG=o$^FH2dHF1Mscy_aodohD*>!%4(Mw=63W+a^CiUvW7Cj0-Nu4xlOiip}f&#bDb6-8_(R0x?w$Ex`1jh2U3{-Ro zl=E6b zW-uGsOcJml*|vNs{cdg^MmLPz#;WfB@o1k}_&N`0j@Y$Z{I$GT!yfiOkTb3|vJfqQ zXd8qWQi@8Q^Rv=`@Y=S>?I!=&_Bh_q9{~}X861D%F3e96#F&BIije17D_)y@C4xX zvm`Vd?-&}IZGXZ0t(q@N`wJ;JH4uB%a=YADNy7F4 z9W|dlROwcyxYAtsjwoMv?+dMzUht^*YsJs~@Baw7+Z4I1dQZ8T#yG7AgiqJP3g-mq z|L7b)nwS>g>`FAG0t|J+eE0S@;&xaTYX|5Et~xAO_gS8(EIy9$9#>M0Og^C*9Pkpt!-ZM4U=9r zQ1ilL{0=M|xZi#$ze-0f*$w1)PJxqCAT0b?((fGNd?}{6rJO&OMT&Xu=vl zz9yE+H}h=DYCon+d^h^>9D&)dfB3k_>qns`e`-uMf(XOZ|y*#iIpbPeG%O$u8uM_tNjzrFc~;8pRk74uFJz5 zbWuX(rjkT8s)qZp@-}86M)!T~G>giP&HVX}`Gd#CZU@FLs~{FvM7NMhQ;Kw2hZov_ zzM&QQRZ%1-e9c625w&pG*$0iBC@Wf-mQx{FUG2k?axK?hlH8}_XKY2poQq;qY@^?; z+ZKeu)+|S-eGJ6DA9TAWg%@F60L2O=fN~wZz|~I9do3PYr9%*`nZ`)eyc?`tPF=Be zPw|(-AS$)1EUpV; zSB1>^EDfU5k)%_%QsBdClU%)dZkCH?$c=r=oHS8JHOI@oD_tj8CI7)655ZeyoYS{T zycbm~tRTg3q&CpQ@C+A2mZvPyALH1*4UT_iX#Q6?)-m8AQ{`pfFIvv!uO zt{%ME4l7S2TpY&#A^yj?huw*luF&AR2d!d6tlEHBkRH|`Jz>2kwa8&AJX9yTnJ#f} z{in&TKNGjz99|A}~F6Uh=Vfg|vmB(iN~v3EODThL%`7}kv@27mik zzy@nZ^Brr+TR1IP^R|8-8eIG#>VD~h+LP8^>}%R^v9CR7wf%R`vo?I>y4LtDZN9y{ zFOcu={CoR31Ya#jEj%Gu(~OUYm^mz1)52AUoe2-e8q*GMZPcEuqUM-6Ggxz(;9`0O zYkH8LynyIo;-zz8d9db6*lEMWx_04!V9j0v?O&m7G1D=)XdX}ph!e$NO*e&fRj}r6 z0gy{*fEdXJYl{5>xks?(dom}#C3V=T0u1c-lQf{G=DJ98wGYw9g!&ju$P8JF#%_rluQS$MagOLUhjS`S zxq|CMYK4_YB#+RXEseet8S)DA72=M`Nxv;_3gj27g%LT)FKMLA-74t=oo041T)>>I zFl)5f%jBsrkIT0-x2b;q4pl3i|6bOS>x)spSh7g2bxg(KK=3x(T=|AEkC`d{^oolG zy6My+QemodO{KlH_aO@>c?I=Irun@5s+n99XD`#Ul1awW#bUF?Vv8?)R&-eL3BsQh zPcr6V%Jb_)w}2HLlxyBVeoPGOYpKLlm=6(5Oing4lPb)1`6e~CO459h-X1XIi0`*`Ob?cM3*APd?x3QZPB zP>KhvP$j1?g?BA<@#r9_c4v4C_KRry>}5Vvtyg}x1}$R2n(Y!2 zo@jnYvMq`DEQ8qjQVEV&cy58rVl6opePOIBMFT3mtdhT$5UQ+%a60(V$FAXJLHT`- zIc}#iM;z`R+ldt2p+$QHq-btAQTYs+JjGF`i$o;12!`HV2$`wUBAE=5XwkY*&dSUCh(nJ7UFMGE{d7*=5Ix^Y=gBo5Nlret->l=B+D*XD|?{u&Ck{>HRS~H&qS~4 zBRKBZRwgMQj!~OGOnHVHa3yRaNIf7ouyr2;{2VQ6gTabV(14I zQDLsv*ji#u-(&Wr&G~)yr5j7l1?)Mp8urK^bQqAc+fswJv)pzF&wGNLe%o#AA;e-; zX6D!MAl~^AlRDG3HnU_Vu9P-Ef}TdI7rodoj>T(tTQ+IL~LWZG_y@G&R^$Q}+6H3G9IwaKttzpP}8%42h(v#*KHMF9*& z%1RXwPvgVnza&$-6R1#pOm#8zHBR`7akWO`DKkWr!bb=1Bgy0QTq^D6eh1jF2g`X? zrK``4f6w_SjYLsHt2wODY5!OsOp$5nD!|U*Grep&fA!r1uM^%LVrOhV2{bgr(O53? z`})e-Z#b2K;WhivYO!pcAV`_B!6r5Tz$W$=4aLPxF}w z^G!N~|FX=O`ZnApbQ})|dY!RYFw{Z7iMaTS%Zeb4$5%=aO7?Gyn24bAKmX*n!JPl4 zYml~@LDq@o%$|jaq6>{#%ezn*LWFISd?&ehTFBo&-X z=~M@c69am3$b3uN)Uo?bhh({8SpnVui-)uWq7xIS!OKIbl za&*tfV%j96@fQh?G>)wwiTqw|L|U9~=3$UP%!BnuIbR<2TlEe3$z!I$%Wg>Se^KrM z8GQ`yyKP~QY5Ymp`1l{40shU7Ho(g%Ai%Q}`2DTG!OaY1(upiczL&V)PVofWG0IP} z`rgXHL_D=;_wIDK#2cjnnd#8V2;9f$r1Bi)jW9x|aJ4}hdpEIG)&P)6peI)>h2Lh> zBd5FbWq`+8=~8aF=$x?-PjQ`1GHEl>A);jrtlVnQ`q&!T?tS6GsDPWtZ`L{21D^sC z8!`)sh_wjmm+GF0yfhODAh~nu^Mktbq0ZLnb5W5~t^b$UZ;=1@aecvD7>=&CUN5^( za_ZJXqwxMA?X)%6J0$SX3vF@lv1R^YGMj^o-T<9phsft*xi6Wc=zE@x`Yf{0IoTN{ z+v*WTD+FTXP?OxmVQ*4LRhTa{7y9g-TEtE_;-^58f9;%;E6j$tHue}UqrA!piBbm5 z3`G~JFt6HvxD+SvQ-30Pg-sqo^4SwA%n<;x>rJo4Arl}1!89@wzdZW*Bk+~Byn2hD zd{IXKUEe9>^8Sx|Xd#1kxa+j}wgTD>#VuABxAoxEZqOpaQ=3$Af%7T4pg4bFC;Aon zgdw;EBh6TtKziA1{)*$i$jQ#!N)%F$M~3~vM%lgA&^L5jH}aNLs++;zJtLM3%16bg z$`XHpI@4>d3tL;28x=W?1LTQWYg0SX*;|j_0ikxMId!|i0H!Ie&+IX(ioS^W;z94$ z553sAOY%5*tBbIp#{s(rWAj$~;W63r(Rr)jt@f}1XXGkBMld<%nWs3_&u)!0JMpH| zCfKlqUG->eYyXhS7h?f2U1OGshzUQTH6k$1L2e?m%=Q}^41?a)(}NRak{P7^5v(zS z-6^~e-?hTrzgYSx(<37bvZC`CjPPOdGMxN3$>dPXT_Jg`v7b}W#tP{zEUG87VhjD< zf;G|+cDU9Zml>|NoH`lf^j*FAs}GaBe3T4%WSRzcapfa$fez&P8db{;ji|FVu-OJq z)xhyKP%z14F%2!gfk~!6J&+1cGQH%tW1^0Uj`XC#&OX^!VjFiu=3wV*-sflm_TJdW zUi4LK{3aWJh-SJa2ZBX1P?r5163N};nDKh-F#hM%R|L??sOrsR37Km81V0`zyM9M} zk!F-x$$GW~{kh6#_Ery4xvI1yA}Ormx{^yB=e+O8+guqBH`(yO$u_!)cR6*-vH z&sak`gq9yXU6?)1@m%Gby)3B%XT*Esd=3*~_`PBWf!3CFc9l9Z8G0Vv(E!9;OM#k_ zO}o?PcK$%)Dl%ayW$lz+eM0S&E_0?fgWGa(`2%mwbsKGIl)l8+3%Iy#c}F%+$mQFG zA`zAOK&X1ph2|xRR)2?5XmA#U#nwzY-dt#-+xJfzNRncL^9B!-Qi};Lj+ztEmF(Fl zNdKaNBm50|-Q}IN`f*A`H<1Hsx}xf}SG|*bRm~6Z#mzV#)dpqDI(d$4PLCysd!25v zPqV{E$3FF|OI!ENcAGPyeu8v{u`^VNJps}-oM zMql_jFKg8fppanOPWSZOK=+9EL)E=Dhwu296&mIZEOT$n>N~MUWJ8i;UApQ@6hT~G zqc6U}d56c(8qB~)sZN9-$IJUc4QBuUX!W6bI0Xswxr8cOD$Ot6+ntVVMXqt@dST(Z zzSXV;BCJ<=xX)+GxJor7YnXo->sszmvPeZQEQ%Tz%inVu_)CHzb2W&XF-A?qm%@ap`jq2zg z3Aw8PKZhD;usy;ZN%*qH(p7zFetqex5K$p>H_7#-D+pvtG}G8>brI~0-RxAXFMRQ} z@9-7>nlJms3!DmgL2C=QzP68;*L~Sr*&N#xO)ip^)nvvF5Ow!m=FUR--AxYjidD_( zAYPSn)z#va=wjH-L-gd-T}W@h$l)Sh}uySU`=8gE_bM+YDn(w*KROiYB zZZscpQKK)+XVC33Bxbj0x}dc;*?i0in(3G!6wJ)zc`wLJUcF9cvaBx_n9tMOl^KZc z3X4i;(q<8eehSf$PC(dYS&DBA;-xp4kIHvJ6*4l^UKQue7V95zy%ugS*?k0$1;>9r z`we%-7VL!EX;5 zBRt_@PH>rfLRD0#DBAh0WOT}=Lp0^efzg|Hfq2VfhA#~9BwM)_EfbRY5VH;^KQ5?u zIgMG1MJ||eGY*1roU4R`^9s~VgU@UVRUN~r>#4-#EM#V&`I_U>i@FXuA92fqj}%#m zP`0Ik1UvaRwu_2qfx-5BE1ca7$+Xq!f6 zy5(n6en3%ExZnSm!u^;S@D{~AJBrC#4NN?@rr1!T?W-ul4Ye{<)kBs$rF~KGBcH_2v~0G+;pPd8k8yen z&o~ovP+NF6Geh45w1~MDCS-CRwU)^VSJj=Kt#USf^CN@Lr0oab^C}NUj_gIl_ z`e*7vXdQbHTKNZ{^|g!EC5qPfs}Dd+`$tbg9j1%XY;@_Ug!x9KA)>K-Y;`v3&76V> z^K?*pV83&hEDjkEyJ#|laTx%F9q`pg>4T+iWqK3~-OM)k1`NoNzu)cp9TDeo_sZ-V z?QB@0dXMyXzu2$>VUdRiIWM6hCEw}LP|Ju_g{zeaPu>pHPBW|}5u5->}Ith0_&#=r@$K2U5!EBzx z+TREf^h`FII3-iU**L=xt#bEnfC_?Zs2Gxk^V$w?M3xUlNG&E5oHB-SoA1z0a5bnJ6Qd10gux~!8_ zg)a8#VeTq3e*Xj1*?#-hPau8U5=K)d(T;c9%+HzY(Dm=8E8p$^4@j1o(&tao_1#$p zs_>xt1tOL>K&zqU29N7-R{QDbOh)FNb(H+_!n@}4#I*P$ zmDn9>@pooy%^vMo+ya@8d6<`}n(xFUE<}v)3E8k-L=FIxrn8v7eawWLoa%zBlfPFm zyWf(aP92fq#O6-NC2@Vpbn^$S2+YZs{eauy>0$+={7~1PgM)k^W3#-sv{HTJn_}ig zeDMRsF1i1Y{Ea;)-#*kR8;$VCslm#KBw8kwY-w{rOEz$cv+!dZH|lHmO%t7OVVU(+ zmKkJZe<(2ZMiYEah%?ay&IvwO+>YJ41dm(~K7-9G&pP|m81z~llIMl5{-P70_#2-z*TSITRhF;V#MQWHpg=KS0 z|4|>M)tlnA!KbIq;>7Ii)ZGDCn0wqM>u#~1C`JaKerfe^Ap{#u)2WOQw@Wc)iX63M z+N}73u#(BDc-gF(r?TzoV&XjAJmNXjG~QzP+i}X13Ks|leMewhc-gQ$k_9mNqtF}uAwx< ze#o44mBJUN-&eDXBuZxa%*WUp5q^U*V0uCPwfMexW98nz#W%;_a%CbrIKQg9nkda; zuMk~qGvk+XdA^UoB7r{&EaiINyi0ZsQ6@(xK1|NSdw&9rAhr4QD z=dQY;iVHK9-Ms; z_`+oQW$G$tuku}Xtb$LqV|8yb1)s?_R}EF}&BxA5g|E2G0lE2ZH~A3y-fk*&;q*uD zatOc1{e`h@DVpEH6O;2>X2y!TM6zQI?fB^AefT1`W%{ZIH3`Xj4ir*D^8Lr<)L?4R zGkU+xDggL@`5*1OY2$1L&5~2~VHv-AiEzHEpa0au59{Py>-5-_i-Y@VT-WQTDzRlg z${c3diQ-vS;O}I+#8$AzFIPCV3AHL>PBuO(J_QqV&C$XM;;C91TwnSWd)(FEvB#aX zi8{L%jR*&8H%nJw;2Jg`4Nx7G+NZskctkTW)IJx>CGCj9Q z(b>F1TVD~iQ2x_ZUU`ew&)+8dusr=Hz(tN%CCt=^w$y$^*UTPsn*@~NGtAEy3J?R9PT#|`vFt%U3Elo2t1d>_J8Kk?#Y=E~&BhJ8zS zvi9|g5ieaY%|M*GHl)=cjUC8dZOZy<7v53&V08Y2!e+^ae*F!b3+`VebN$!{<)NHG zPTf2r(|3u|o#qVK;qycyPWL4vW--8XX2G^NflTsHaImHqU%13wZ+^o_OxBw5M)^xY zPvfFnd>&C%@?dtI=nk|G@EOs zj@bJ4{YsbiE4|0-)@@p=i8IQ4-KiZLn&aH59UGeGWqZ$NyR2=trBT7n=3H7M-yVKE zhr8r(VVt+L#ksy>so>lnoK3w9Qt2N2#CBop+v;SS2f3=G`f*%vugErcN(eWzZFAft zaUDr~iuXSFn^56!s4O?}BqK1X&U8@X`V^EI5Op=_CS)qDObamVBcnP|A@H=A8mE0shrK8n;%8%FNhUlt|z{E*2L~K@-sEB&1hZ|V14Ni0`sg|B-)v}1>K@i%^u4=`d zWR5>6d0jey_2w_&LLj;}q7|~uiRJN`UY5&WC5!^566%0l8VY*4DSK@s-D&9_+bPXOGo%>5)_(&z! zd#JOH;LON>zG|&rJt+z(LYvLy~By^=R3Wug}*9u7W&W2*G?NR zLT&Q-wfR2&X7W|#CgB5LI-M;-PTkz9zJ$xobRr&l+1^D5q6Oi(! zx3jZ1VX%Beg(XBI-!joacXKRx^MkCdNoreMgtN5=o6 z{KP%ovpYHKJ`ofKYlOGDM8BN{s3HVwo+O%C*mZ>v=)szYBv@7{?ka+{qCjQ??Si#8 z6X0HPqUALYdI3`W?QY;)R%yO}knMP4W$@|qu7YN0AT~8l;y;pjd`-;6nx`dr2kU~! zt*w~>ahHHlj=0)2EG8%dcGfIeA0}(ar0IJ|`m##S%|UW*c7;U;Ca2kQa$|l9;?uGY zyF@`#MWic;qnK+f+LNA2q1qtqMJcf;Q=-p8j&UtRxGyb@<(LCqw?fWeqvN#dK$!oW-Wzg z{1!GSJIKZyH55W0LU|jIGiEVc^22xN%Embqhjw5|IqrON;^jH==s|g|yns-i=Y;a( z<@wm5^j%WY*UEBo*Z|e_*^5KeE1b@G>x7}i&!A>SO4t~Vlc%oUa7qe9Fj3++M|Aim zU0A}i?KC!oPf58KwrA)z7oMNzP+Likxk&6vMR)Dj56JZ}*Y4kz10VQ ze{<>t)J=z^zZ25n=;&NtZRi!7o5L0#o15#4pn#W$O=E0szE7x^i{-f--QSs~o9)Vs z;{grPJX_Q@U76|tia}~YSHk!$2gEUdH1LL@rtGmBV z4*J=g>E#f~jm?syH+!yJ0+6^~`hYzQfsiw%pm*yN_LV4|;S9PjOoLn@R-J9Y&NcBf z^;ys!KnZBX92?>1kXPNJ*v27p+AXE8&MFUtPhcpu&km#KqwaeoXe7eAGl%?v#h@~| zoQoS`pJx54Q}~GU!Y7^=K0P(6Xmn0^SbTKO@W`2o;=Wm_Q;SCDhWp1y=MImYpb@=` zM(5!_b#&hFNDqw&7LCpicj8fx;Ss+?h`WlMhNWkP`i4)CS0p&6=j5crJ!5ln)8V|> zoV;|nYiv$_IviLM>T5IW{?WvJV`zak`Ahb<^Znnx?R5Y49X6P}V^rgHIdy^s#@B%yiUns^f2m#9!`|y1L@CFB2iase;$^f#}Co(i6@5P!H5~bO(1-*UY!|Tg*7Bi7EE|>qz zh1@mVzlBfr0Gu#aQB0hD^lk2<0WK|P$f){gs)c~L| z>j$GN*;fw#jdHgEthuXhcN)`M`L5nK$#mxka9Sp~S--wS88bP~l!E>M_Vb%B&5i^; zZxju^d5yKKH>5;q^{M7-0S%Kaa!B>j#%Q4WH1mOc$O(Q3t`lF^K(()8Qgv3j88eNf ztxj2Q)2$DHrg8A}zG>qvP@;M`%UX0wdYRjXaiP*Dz}w-Oo`@(B=900>lxBVQGS^AO zI3jqrkVzuM z303oY0w*#3pVJ8Y&V~D{=uW|fzND)2fLWjPSoi-NYv@7KzwW;)tK$4oM@5^VjfYY zYX?rDMVE^HeqS7N2$PeaI{hhOZN@C9n1VuQAsrs&Z1e0RI%IK= zGx@LZb7vG8Rs_uL-)P_V^TLY=OW_Is6Tt3diaCu=O?6I;%9lzX!@jHyjVbqwT}$M4 z5na$1WzZg6(h_BTvy_PHNYBnEKN^;S8V;hn8^+JPgAr^Tx_wkXOPxJs8kzh@==Ke^n^``MXTE8anm7K(% zVOji{-?#l_TCOQ)5ssNj;Ty3`44*wf?i|6IGbOvcjMF~NKBf7(5wfrXnXez1B?I#R z#tJ$)xsPxBXXSJY)_%t)ZAQB@`MLW^t8zl7J?%`s+nTzS&*%b3kIroJq8~7W8Ng7A zoGf7$QjgOTWBP=P7WiE@Y-TVg+QDr1g$`yJ`Nzwa`h`1~UpQrUFgGhj|L zPMiY(Z$K|S2^JDZJ*GIWe3!I(%tT zZm$&C&dHUOOBkCs=0edqzs!ns)kkX9Gy1x%Ye*h1O1?)2|0th4=aSq&isrjnN{PBl zbe%4(uy}p?C6(|q?s(GVe2lKs^@d_|!c^F_GYVKV3wcmQ`s_xh(d{cP`L?gNf2Msk zf*cg;Erov6U3cx(x&I5VtLg~1?W!{Z%zY7q|3fP4W`{Y|iFpiz|K-Y$(stT+VJxES z^Z-U6l)#4+yV<*8H{ZkLi*4-f?)|Le3s^C+m($Md{^CyI3~|EsM)vFSU*Q|h=z-3> z+XDJvXMS{HsTjYd?41N3PUh5(;NdSB7kSy))T+13J?qu9Q`!Ig*nfQU&@RY+LH;Xz z$(cRS3EvusF5vag!=eiSmh1e7t3$4U`nUt2I#47HFmV>3I??DjErDKAj)D05(S7LJ z{_?=+`K2J*;C6F^bkn>=7SREU=!wpxVq}8_rlyl_=7-0p6a+33hi%nVeKc@GHSiZo}Ei&=OaWxnOKInH0es5Y2$U>x$(`&huh zp)q&2Nju)A`FfLf7-k}1hZNL>UaiobM!j0foxMWoK!&1BhoZex)<2as+A*>3ee+It zHn|gEle^BMa~OyG=p3D?-!tpG#jlmIUhJo`4r62Ar|me%DjEe&jDv{C6Q)e-O@0e5 zItq93LGkoip$%2Pu&uB?iO23!8xS)}jFhzpP4&974gDx=-9}SFC z_z*n{H|a5(bn7uB<;B+7Uhk}JKTjb$jhXo$+qjl{&b)&B3;xLp_w9XnGSp2Ik2w~w z*A$rTeLqTP^WH}sD+}(G>fk&serIyxywa5IOzf4t2;PJ*yDUI7Q4%40Z#G^QO5_?^ zU~U!|*(hHEK%Op?S4?u_dRNVpyDBP7FIaI&3-7Sua$uVmHiU~>!V_9Ia_ks0sV|bs z^>eVf^lpkljmNW7{aS(j)k_{B$@2bLbQ}FKP44Bp9pebk3zAVHrx-Lp~xj z{Ek%jCgwuo3a9C|7FdPcS*+YSL)8uZmU~G_FYb_qOQn|!%LB4M!ayxtDxF+do$Y-=Td%;Rj$Crok6a;)lN=L2LF>mc~zP<3Y^W!f%FS-Zti=udrL-ZSPi#{+N zzI9LA@Fnqiw+7BDp|4tL_8-G#6{x`X|n$N-?k6rZMqj-`r$Rlt4pYevqqeMBbsv<-ZZ5;q)VH}MK)m`kVaVm&I~TM zEu239$Js1eyJ#kS$hkFH$fjUzHC3lB7F@3)hqP3rf;u<{^~(jQ$;USO-Ja+xJ)sy5 z7sx-`4QNY?z}~foiER`KIq9KB^1b(+cNvQruWw=DKQSSLXXiUTE{lz@S zYCT(F!?54{M~@!sW2U&5$r<1+gm#fDbl7^Cmi~Ydy_+|N>ZUc8&&_|7%g@+Md zMcA$tnG)4>3i3`NuI?wnRNumm$)vilSJ8-}NG%%763M?(%2#mVZ!}TqMY6<4^cP*& zi^lUdx8V^ptFaQxp5p4ZNRJ1;Li3@x*tH{8Kq^qMMebj(AaD|sQbBgTu& zjvTt_%<)-z>!r#3^-F+nb`maGqpuUPswW_21mqRemBlMG6?=** zS{8JV&EMk-cM%JbpxHT&gQ~QdMYSp;u)P_)1>@iRMntn!sNke9H!)(#Sh^>>)D)Gr zEa*hpKiRSwvk9@q)qPia`8=*`_G7LfM^<$1c_^6;`X*TiCayPTmm^uq-Ur2T-(57I z#VLVWhMi(xaa2D~9H)LfEteFV4<1r`;u##3FidaiEqsYsq7&8JNj0%K6MW&5Vspp% z=E(pqBFZVAAUo#hqLMKSa*;VD@W)PE_Us9^E5TmWLbhb67cAmb z!)Kcrqzyr|!_b?a?|;W&Fb}txBZ;RYWk8B~%y&!V3_hc)l;8`qVQuXy{vL?2w0AfC zw&b^@c1az<-yC$MOSkDMA(1&LlvuY0@zcMxe(ZWQh0xIpqN1k%ii$kuf&BCVYtcmQ` zE#_Bu$g}FD+nnMt{OmWMb3p-=d1b=)^vyjv297l2kwHJt12rMLbY*OPcD!_DijmOj zD^?YTCSYV2uULh4aOm&t>MPdM<>tcODt+N?W?YaIqw-*iZ=h2%gNurye9L_Haf{)5 zPQFjxb7(PdEF)u+Gk=>is#qnt?PKnXycVa`1(Y!_9|y5RyF=wc|XQ*&z}EU>5tEUqW`z&|GWQ>&VS(iU(SDW{MYjzh54U6{{`~TcEiEv|5nR2 zuP@!|2|6CT20=&ZRtQ%lOWSh!AyM|SHs_f~sKN~nK2tmeQSx6$v0;?%=;JFEKWqHK zrMM+CtX~e<&n=z7kjK^s%($MGWqTZ#Q#Y!_jS3QFM!Y5a`c{Yk%dsJ%{BJvGR^v2_ zI-43@qS{BK(3p1H?`3XfL1(B4r!ow?zmOy7$aj>S=*?&I2Xs&m|L-RI%%L}^Oj?eu zox}pgqa2p)63U@jv@j!F13d?Oiuxap5b>aG#$vt^%#=1y76YGIe3(a*JYse6Z{=v1 zS|UdS8aEYH&vwon4P)0oft|+I){~@JnpmJ45C9}F(Alga!l&4WWnYq`q}g03kh6g7 zo+n$)EKa`+sj!hM7z0piHYZBf?Y9aNn@7l@ax(I()W0MthoqmTeVR=Z1d~%d8l{I$ z3;2><)e?TP!c#y`lU-fNxPsVZSp+Zi&HLwm{suAbH}YTM zUPWeLyw^&>efKByz-AleOjxPJ8%iZqu`4!zmoL&!gt;p{VQ#0RWC75Yfs^Xzt<0&9 z=+S*iayoS=MmH$+I*{`$KJtm2?9yE}On@U%+f@YqZEz7{cVH38^ZO~mcRW3_mQKvl zPN5<(h*>EE!?#nhi-16qz{r((v^2Sb#ha@@%tx-oZKr9|aJNCbX;3amY-SO)-O%Jx zmp$?}JUh7X^Gn7DYtQ8RCjA_&eUVnjUeUp@{OjN?qHlp#XOnIv+~Tri{>hdiVzM?2 zXbZ8|A`7~HFv=-lvj=>X_D3C4w(l<{fXOMu=X4>Xi{|5 zLky8GT%@5yR71-HI4AkWmlf%A(_H^CG#M}KQiW33;)wvJFu#&y{ZyX!6nP9);uv~AC`s{Vxr!} zZwtR)acj8{mEh%M44Ko5k>e&162#^PkoSs*DJ^UP*>AJ{1EiwMNfK5YzK5PSxhrzT zrZSxsmB$Rb1)oueM976}&z8b9xAe+(P{4PB>IOV*C0abZHa4fN077X`f)t zjWXn)G86vI4PCa`closqEY7#x6kYXaYQT8a0v-CkP!{2G%mciE?6S)p$V5~Wkh07` zl&v(k%!lz8XS#Tg+r^(lT(oxa>vT!-a<5*ux=2@Eq16@g?!Re;JYA}xe|`unswEws z;`ER(`nGKlsrev-hz_&)b5R>a5*K9U~W7|qDZLMUtTgk_4R;`unW;rJ#fRx_8#;YvR+S|3-+wEhU)2Y5~5ozs_3W&GX z9{JC|{!5SiYUe>cawnQ>3RQ;YsmYlh+2tbpA>>IbvS$jin?cBSe(}3H_S0On6w?Ua zV=^-#yR|wy6HaJbU1@7|@440OggR`kZZq>HHRXUtk81<{;rBC*u|2=}7i}8zNoA%n zJ6!1RI2Aiup;wCvpsV<{LEnZ`#?>5kU4}Kg)mL+p=z{KWURKk#b8x$&YC2^Y^Ea54 z5=6k(%Cj%G>IPT7EO(ZOaM13NJmqXr8J4pZS*tqDzd!jNZ=etB2v@sx@Z1ot$p$+m zgJoWyR}_1I9kM4Z5 z$VaDE2r3DIUuXG@=71(np?bH8ol(iar|CNs4tZFPBIew;b=Zf-hZZ0S@t!Ss7ijtXbw-J@D&xd-n!x7E1k)oKSjiMY13825JQor6tm zW4Cgj!nC5%H4xYJg_+*QULff0o2Vf727YAML*8j4(A_j8ptqReg=SFazl4a%01t zY?z5sq}p8JG8z_<_LfkG(6Jso@!Ckx$He)mS#{`3$_AExIgRbn>%!CAdd9I0I3|Ae z;G(OCD4U(mr;fq#k|D9VgAwSoP5{^X!jAtgk*d~6y{^K6gZL{8zk;qlVz5@3ltk{y z<9h#6fsB+mbrsq?5tCJ)6wJTB~jUP1I`MSI$xcan!r7dX`p{|oGl_P zl#Imz^W6?SCW$>W;7>o4@j%a~3l+356bQLQ(%3HA*nw?juUMlV zINnyVQP%ngbkt8yy}M955us8aS!)N)&HB7W7~}93GXx7ilfcssu4sdW&w&8~ijxIJ zJ{i)G{;6s={KueFNpaurg#SEJTGNyoW{dayQSnYcSA2~YZ?DBcCjdIG<|Y!6kytZ* zj)Nv-SZ{(Ra!ypL8qFWruY=D_nqn?Qc9p^etfJ~rZD}v_z=hJcXP=>c`w4|oN4Yys zB+sgX@^)KadC!b}cDwe#?-+qr`=-p3e*0!xt!lC+O#P&N=|ovjrs`cx`)|~Cs2wz7 z*5jsdM`#wt&}g(Kw$KM;C?vXEe@F zzXYDCRhz+QDX2w-^mgu&HtRcFI$yLa%pw2Ak;4K^wR+Zz`trZHLioV)a+{pRT$whzFFcA0S2XC&3V*AnH~A#5C;wM>cH$LKNHTRn zQ`Ot!RdP`^LxEw&AH$?<5}EsGD|0t}h=!H2hy?X1&W(D%$+eN!5NWn_x$Bzm zx@z8uL|TlD_#Q)bZSj3$b}PQG(ub}1 zG91x0x?CbdqTdA~gB;cVcB1!k&K2s*lSpJcJ6qNIhUbX`W!s)9po=?IsP=q!Y=TypMRi z;N|-`35AkA3=L^l2WcU{qKzuQ!p({DD@=+g*+%8i9T)XVr`6B!cQm({71;|{R}H3+ zH0MpTgjAVH!5SHK;=9}U*~FVQSBuZ8p{_Y1dX;G11E4o_?BEbb$H;;LGfFbvPDb8~ zI7La^ks&VRc2f!&A8{BOjmA1@Lcz#y-;tsw8(NgYgT)Kn?-aCLi}WnM)_R2MsCQ{+a`-+Yip97|UXrMUbKR*9C$)BFi~ zy1G5Z+iUO(f-+^YQvEH`eMtKBDuKLbfX>)Fow09e)bn0$ZD+71E|a0rtk%S}nm;nf zHfdmWG05~a7lDl8ab2bOMPxzJN!ZiH34ggQ=6W6HcJs9UAeDMnw9$g&H(+lg-sVvmrmK(RTrhm4I$WXIE4F0d!Pi z8z<<+0!cJ)Im-Fsi(JD#Xl|sCvl)r(kO}3SRRKbHHk1rX{D$Uyn~vYNk#>TGj&Kh@uL<&t`!nnFe3efmRi5*Q|5quPN}OwTj7)~o|+eYK;lRpyV{mb`Q0 zfwj)Fwfd^tnPXb(b@bM6{&9tL;gxQ!0>k`Cqi!K8wnhoQ$mP;jhiGl<=4rHbvRkWU za1sf1*psDgTLYH>>8g2Be^vJC_WZdD_&@Y~rq|EVsNU2Cb-0vs+!{`cH};?`675Sl z#?@v%VLE930L_r~ErwCflY%r?9$B5ApotzbNot1B7{#2jvPXUEMH8u1{U`_|je=R*-OLwERhh4DdVeKeWs!5|1 z!(fe2^)AID(@=2hN#YIZ;vOPkv!SG1t-CeYteO zUGz}ubhmsx<^ONR9@Ao%P|Q)wJn3`cm4MUjnsmpB+NsyOGcjE4PN1-+-e6NJ+|>~t zO%NZe_50U6U5^bt3lfM5ItsV4kW0??azSK;N z(l6uRG}G-Lh}x{CNI1k^nR|>PnkU6OCB9b1BJc>U-2|#uy`q8*-|WCaj#n~o0;Zac z5;4(_3%h*Nc`XVS@1ji5w=GJI=0sUPdV35xi)EsPOyzM%ipzKnq8Aqc<@?$u?=UyC zso`84l~~mLvhJ?~8CgE?GYB2qirVV^IOgH}vvf+%HKNIJGH}2u=OPnc^BtYr%dLmL z-6OsRcsasV=}{Zm{NR0w(ojrm?}A$;6QB;!G|-hEEA|ekR;L?0>Qy zR{!nIlTz*tDi4U-igbRp^;KHESVq#;#iF)j2QIU$}QMtddY?bY#v~H znkhdEc0?=Kiv=t^Rk4G6JOji66-jd|(8B=Q%XIu%pr1XF!L@@6bd>T1Gf*tlb2DK< z6)(Y09&P?k*`Mx#yIY~IWV+ZM@LmPs4Y1;X*ujZE2`)ZA!*QGng z78Z-kND<%YzT0SieThu>7?a9bwi0|C=RN*n6_StDLoeA_`3~^gi(fHa2waH0MsIh4 z_SV@iUL$%7MZ<3azj=11HJIFD;YaN}2HD8CvOr|Vv5i*MM!LjCKU81PhV;fW~F+b)cObN-@(M82clREZi~guT36*yU@==$ zru`fit_upwcfD!jXl^N9-|kq)v=ecuJMXcBpBt7d>PbSwZmVYl_;a&peFbasiCM?> z(3kAWm-Ha*|J(jFP8qK6TfeqIc6`ylod*7ac#VcZKSu%LF;szFq`<?HPzMyBuVU&sitI# zdDn}F)9y=_xka`}k@a2@jq@c7C24LT`1E4ou@7yhZVKBE%|cI)zNi%g+Thc73;xl4 z*_zlPy3eMn!%sqf%^MzzU#LQ6M2KcS3h0pI?Bb`8?NUi$2HNcZmffqSU~*l*=bVp{eJIkT7{FRR+yvlN#|T$U(oC$@|HRGQB&^8ksUAiL(! zkW*e+$P%F3db7AS0bOKU&`r*iH0;p6mYje-bShMFFdVQ%H5`kI1UNDDb{DKcXUuhUh{~T0Jjc9Ld{-jmfG0%>vD*75;tvJ#cxJtCWJw3F6>a8 zO9jjfUe66a(_`r1DZZISTO&sXpP9&U7B(xMQx;EW_k2#2IP1aRRf47v&??c}KZd<^q+%G3&V<(TVcbW1b1J0cN9O^J4zazzrya+N{ zOrG|OmB?XI&P#urbhMYR!sR|XZS(&9=pda@iC@1Tb$w7wE@ z$hMNw*Dirv=C>~lPm7u2aNhwBFeu>}G1EI(TgPW2_7Q&(R>6Ua@)eI6{-&A=cgk|;Bk%2UJI6gV|e67r=AnHo@aIIvp~=pE^3UJ+G;Zi%SWnk7mK zH2yvs?+$#u$dna->iU%e9(*Kxr!qeZXALG_n}m;T#pOaxe~OBkO6tReGtB5LJV9_h zP1BoIwb(0jw8lj#BQ<)onx%cQL$aj@1fMGl1fQGONlrC6VqJ-2gE>V^9OM$UfZHn+ zp8$y|r7L$V@n7L~{i#+8JVdJA}b7wZE@dF;-mvj%6mGn5%L z(p>(Sip=iE{z#|oA+iS9huvUzbp`&A*vZvCBLd@a>U3J|s96=}cS2kAKs*(6MvXLw zTUeRGopn9qAcbPF1%7$KHgjx3i?~$?2n4d3^VDMCB?oK%${=cQgukX+bf8O}WxFJ{ ze?j4!Y={AK+Y2PMuqXNv2(Y{5wVoNmPRYR@=tXuPj$lN%VY7NC^P}A$%*6vvUO`rF zHV>F&&5;M&0{u{!qd-4iImd(8?cx9fCqXA<1X)wFtbd`| zKjmL&E7oMr4&@;%WT-zlL&&1j}zKcRaxfIp$%%7^DqXpsi2KcR_cKPscBt(VL)8{PxZ^|SfBY2!eqp_TEn-^Ii> zP%RI)h=~0M>?3t&-J*7?mELPZXkcTbh>%ZnwH%mhN}F8!F?RH%)k*x#$~(L_O{SBl z?ve7dx5&A&itKix^-boT z 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%0D|q*J|NQXi;V(>D$1QpvEb9-Go5A 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�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 ?Ncb7#UEBvJ|Kl)v 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 diff --git a/Source/php4AppIntf.pas b/Source/php4AppIntf.pas index ef7a95215d094d8fd8e47cab2d0b5be4d597ed01..ea6d31f10aa73154900b6d21357c6ce357c86eb7 100644 GIT binary patch literal 3988 zcmc&$%Wl&^6g_Js{=qwF7ww`5q_U}@JSrhnk%$Ew6zrsla2yjSr4RAzz&SH=T;ehI zxNfVFy+dSmig)P7F>&9NSqGA0Y_&6J>vJUnj&v zIbC2W@=NLo%wBA|Q^E*XRvGserlw<_S3U+f=0A$gzgnMetxqWDLfY}d62=+1inn-v zW)?2F9x*SJC2dhx#1!vB~?0SuV|1PAG}-SG{Dt9j-{c!3EJG>XaR} zEBbJMOPghHvjsa&uh+%5nd@stJ0`LZ+YrU6|M}0A9X>qYk(JHuoPJF>AM&3IzJ0j9 z;@Js@va6o0cv;C0luVsIzP;zIMfZ{84`sEhpA1-S=k)53nO5YvPXxowsW#Q&pJCha z7_b)AJN!7d;nsge+>Em?Z@+xD_t%{FlKPaotiB4%FJ0~HsdgOqEu}cwYF1^YrXvS< zvbjS?oMrqzh>4f*f8YD6KmAR2R5zrmpImpy-RLg5cVF7;J9WPZ+m+f)d)pr6*4~_> g)yM{LcmASc-AGNfP{pan!POtSp{cg*_tYN#0xVBm&Hw-a literal 1952 zcmbtU%Wm5+5WMp%_Le3G`H&(7tV`9p4+BME#6}Li1dOz@h|(m>M;bfGzn4rCQI@G% zNp%rK%?yXTv%Eih-Sa^1;qX~}UA!%n;;f{WNns8V0BL3l*z4BGo2m`l_R+rk1h-pZZW{_J7WpMhymukl*7#P^M~8_IZA z%1xRTRs*xKR!t`p=M_w5k)uGH-QeW6Ils6#e>Xt(%-03s?12y`m<83S(EGWtbxugz z8sd!@_<^EYZ55iF)J~Kk8~}4qyTo4(jfLrBGuNndFt#cw=Q&YYmRLEBFp~nGkZ+#e z^I7DaCP|mLX2u8PifTr0IHs666yNCvz0}S-yjEpHy@TS4a<{+O-6Edg(;b%1qEB90 z{4?Wtpnn>TcYGg+ew5XaOps+X$ al + + {34B23B2E-657F-42AF-9898-5D22792F862D} + php4DelphiDRio.dpk + True + Debug + 1 + Package + VCL + 18.7 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + 1 + php4Delphi (design-time) + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + php4DelphiDRio + true + 1049 + false + true + true + false + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 00400000 + false + false + true + + + vcl;rtl;vclactnband;vclx;php4DelphiR2010;$(DCC_UsePackage) + php4DelphiD2010_Icon.ico + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + 0 + false + RELEASE;$(DCC_Define) + 0 + + + true + false + DEBUG;$(DCC_Define) + + + true + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + php4delphi;F:\переустановил\Рабочий стол 08.07.4016\soulengine-5554e3db061d08b94f439be26ed071a74c30071c;$(DCC_UnitSearchPath) + + + + MainSource + + + + + + + + + + + + +

dlgAbout + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiDRio.dpk + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + File C:\USERS\PUBLIC\DOCUMENTS\EMBARCADERO\STUDIO\18.0\bpl\dcllmdlegacy240.bpl not found + + + + True + + + + + 1 + + + 0 + + + + + classes + 1 + + + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\values-v21 + 1 + + + + + res\values + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + 12 + + + + + diff --git a/Source/php4DelphiRRio.dpk b/Source/php4DelphiRRio.dpk new file mode 100644 index 0000000..74a511b --- /dev/null +++ b/Source/php4DelphiRRio.dpk @@ -0,0 +1,50 @@ +package php4DelphiRRio; + +{$R *.res} +{$R 'php4delphi.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'php4Delphi (run-rime)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl; + +contains + ZENDAPI in 'ZENDAPI.pas', + DelphiFunctions in 'DelphiFunctions.pas', + php4delphi in 'php4delphi.pas', + PHPAPI in 'PHPAPI.pas', + phpModules in 'phpModules.pas', + PHPLibrary in 'PHPLibrary.pas', + PHPFunctions in 'PHPFunctions.pas', + PHPTypes in 'PHPTypes.pas', + ZENDTypes in 'ZENDTypes.pas', + phpClass in 'phpClass.pas', + PHPCommon in 'PHPCommon.pas'; + +end. diff --git a/Source/php4DelphiRRio.dproj b/Source/php4DelphiRRio.dproj new file mode 100644 index 0000000..b61998b --- /dev/null +++ b/Source/php4DelphiRRio.dproj @@ -0,0 +1,806 @@ + + + {E17417E2-2EC1-4971-BB34-C9C25AFF27A5} + php4DelphiRRio.dpk + True + Debug + 1 + Package + VCL + 18.7 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + 1 + php4Delphi (run-rime) + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + php4DelphiRRio + true + 1049 + false + true + true + true + false + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 00400000 + false + false + false + + + php4DelphiR2010_Icon.ico + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + 0 + false + RELEASE;$(DCC_Define) + 0 + + + true + false + DEBUG;$(DCC_Define) + + + true + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName) + php4delphi;$(DCC_UnitSearchPath) + + + + MainSource + + + + + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + php4DelphiRRio.dpk + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + File C:\USERS\PUBLIC\DOCUMENTS\EMBARCADERO\STUDIO\18.0\bpl\dcllmdlegacy240.bpl not found + + + + True + + + + + php4DelphiRRio.bpl + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\values-v21 + 1 + + + + + res\values + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + False + + 12 + + + + + diff --git a/Source/php4delphi.pas b/Source/php4delphi.pas index c999320..e3381b0 100644 --- a/Source/php4delphi.pas +++ b/Source/php4delphi.pas @@ -66,7 +66,7 @@ interface VCL.Dialogs, {$endif} {$ifend} - {$ENDIF} + {$ifend} PHPCommon, {$if CompilerVersion > 21} WinApi.WinSock, @@ -1705,13 +1705,22 @@ procedure TPHPEngine.PrepareEngine; FLibraryModule.request_shutdown_func := @rshutdown; FLibraryModule.request_startup_func := @rinit; + {$if defined(PHP5) and not defined(PHP520)} + FLibraryModule.global_id := 0; + {$ifend} FLibraryModule.module_started := 0; FLibraryModule._type := MODULE_PERSISTENT; FLibraryModule.Handle := nil; FLibraryModule.module_number := 0; - FLibraryModule.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); + {$ifdef PHP530} + {$ifndef COMPILER_VC9} + FLibraryModule.build_id := strdup(PAnsiChar(ZEND_MODULE_BUILD_ID)); + {$else} + FLibraryModule.build_id := DupStr(zend_pchar(ZEND_MODULE_BUILD_ID)); + {$endif} + {$endif} end; procedure TPHPEngine.RegisterConstants; diff --git a/Source/phpModules.pas b/Source/phpModules.pas index fdff4f1..43629c7 100644 --- a/Source/phpModules.pas +++ b/Source/phpModules.pas @@ -466,7 +466,15 @@ constructor TPHPExtension.Create(AOwner: TComponent); try if Assigned(OnCreate) and OldCreateOrder then OnCreate(Self); except - Forms.Application.HandleException(Self); + {$if defined(VCL) and (CompilerVersion > 21)} + VCL.Forms + {$elseif defined(FMX)} + FMX.Forms + {$elseif defined(KYLIX)} + QForms + {$elseif defined(VCL) or defined(LCL)} + Forms + {$ifend}.Application.HandleException(Self); end; end; end; @@ -477,9 +485,33 @@ constructor TPHPExtension.Create(AOwner: TComponent); procedure DoneVCLApplication; begin try - Forms.Application.OnException := nil; + {$if defined(VCL) and (CompilerVersion > 21)} + VCL.Forms + {$elseif defined(FMX)} + FMX.Forms + {$elseif defined(KYLIX)} + QForms + {$elseif defined(VCL) or defined(LCL)} + Forms + {$ifend}.Application.OnException := nil; {$IFDEF WINDOWS} - if Forms.Application.Handle <> 0 then ShowOwnedPopups(Forms.Application.Handle, False); + if {$if defined(VCL) and (CompilerVersion > 21)} + VCL.Forms + {$elseif defined(FMX)} + FMX.Forms + {$elseif defined(KYLIX)} + QForms + {$elseif defined(VCL) or defined(LCL)} + Forms + {$ifend}.Application.Handle <> 0 then ShowOwnedPopups({$if defined(VCL) and (CompilerVersion > 21)} + VCL.Forms + {$elseif defined(FMX)} + FMX.Forms + {$elseif defined(KYLIX)} + QForms + {$elseif defined(VCL) or defined(LCL)} + Forms + {$ifend}.Application.Handle, False); {$ELSE} Forms.Application.ShowHint := False; Forms.Application.Destroying; @@ -617,7 +649,15 @@ procedure TPHPApplication.OnExceptionHandler(Sender: TObject; procedure TPHPApplication.Run; begin - Forms.Application.OnException := OnExceptionHandler; + {$if defined(VCL) and (CompilerVersion > 21)} + VCL.Forms + {$elseif defined(FMX)} + FMX.Forms + {$elseif defined(KYLIX)} + QForms + {$elseif defined(VCL) or defined(LCL)} + Forms + {$ifend}.Application.OnException := OnExceptionHandler; end; From ded67100209d2a0c2332f8fe15e1728e5745ac9b Mon Sep 17 00:00:00 2001 From: lion Date: Sun, 19 Jul 2020 00:50:23 +0300 Subject: [PATCH 51/54] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 353fc1e..5821c1d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ PHP - Delphi interface and PHP extensions development framework { $Id: readme.txt,v 7.4 07/2020 delphi32 Exp $ } -PHP4Delphi is a Delphi interface to PHP for Delphi {2007, ..., Berlin} +PHP4Delphi is a Delphi interface to PHP for Delphi {2009, ..., Rio} PHP4Delphi consists of 3 big subprojects: @@ -30,11 +30,13 @@ More detail information available in php4Delphi manual php4Delphi.pdf This is a source-only release of php4Delphi. It includes -design-time and run-time packages for Delphi 2007 through Delphi Berlin +design-time and run-time packages for Delphi 2009 through Delphi Rio # History +7.5-rc1 2020 +* Compatible with Delphi 2009, 10.1 Seattle, 10.2 Berlin, 10.3 Tokyo 7.4 Mar 2019 From fd9e4a860555b4489d3e7fffbb169ee735f16f8f Mon Sep 17 00:00:00 2001 From: lion Date: Mon, 20 Jul 2020 02:25:48 +0300 Subject: [PATCH 52/54] Update README.md --- README.md | 311 ++++++++++++++++-------------------------------------- 1 file changed, 90 insertions(+), 221 deletions(-) diff --git a/README.md b/README.md index 5821c1d..9df90e1 100644 --- a/README.md +++ b/README.md @@ -8,246 +8,115 @@ PHP4Delphi is a Delphi interface to PHP for Delphi {2009, ..., Rio} PHP4Delphi consists of 3 big subprojects: -1. PHP scripting (using PHP as a scripting language in Delphi applications) -PHP4Delphi allows to execute the PHP scripts within the Delphi program using -TpsvPHP component directly without a WebServer. -It is a PHP extension that enables you to write client-side GUI applications. -One of the goals behind it was to prove that PHP is a capable general-purpose scripting -language that is suited for more than just Web applications. -It is used by "Delphi for PHP" from CodeGear. +1. PHP scripting (using PHP as a scripting language in Delphi applications)
+PHP4Delphi allows to execute the PHP scripts within the Delphi program using
+TpsvPHP component directly without a WebServer.
+It is a PHP extension that enables you to write client-side GUI applications.
+One of the goals behind it was to prove that PHP is a capable general-purpose scripting
+language that is suited for more than just Web applications.
+It is used by "Delphi for PHP" from CodeGear.
-2. PHP extensions development framework (using Delphi to extend PHP functionality) -Visual Development Framework gives possibility to create custom PHP -Extensions using Delphi. -PHP extension, in the most basic of terms, is a set of instructions that is -designed to add functionality to PHP. +2. PHP extensions development framework (using Delphi to extend PHP functionality)
+Visual Development Framework gives possibility to create custom PHP
+Extensions using Delphi.
+PHP extension, in the most basic of terms, is a set of instructions that is
+designed to add functionality to PHP.
-3. PHP4Applications (integrate PHP in any application) -Supports C, C++, Visual Basic, VBA, C#, Delphi, Delphi .NET, Visual Basic .NET etc. +3. PHP4Applications (integrate PHP in any application)
+Supports C, C++, Visual Basic, VBA, C#, Delphi, Delphi .NET, Visual Basic .NET etc.
-More detail information available in php4Delphi manual php4Delphi.pdf +More detail information available in
php4Delphi manual php4Delphi.pdf -This is a source-only release of php4Delphi. It includes -design-time and run-time packages for Delphi 2009 through Delphi Rio +This is a source-only release of php4Delphi.
+It includes design-time and run-time packages for Delphi 2009 through Delphi Rio

- - -# History -7.5-rc1 2020 +# Features * Compatible with Delphi 2009, 10.1 Seattle, 10.2 Berlin, 10.3 Tokyo +* PHP 5.0.0 - 5.6.x support +* Unicode support ( php 5.5 & up ) +
Version history -7.4 Mar 2019 - -* Compatible with PHP 5.5.0 -* Compatible with PHP 5.6.0 -* Compatible with PHP 5.6.x -* Compatible with Delphi 2011, XE8, Seattle, Berlin -* Added unicode support - -7.3 Jan 2019 - -* Compatible with PHP 5.4.0 - -7.2 Oct 2009 - -* Compatible with Delphi 2010 -* Compatible with PHP 5.2.11 -* Compatible with PHP 5.3.0 (VC6 and VC9 editions : see PHP.INC for more details) - -7.1 Oct 2008 - -* Compatible with Delphi 2009 - -7.0 Apr 2007 - -* Compatible with Delphi 2007 -* Compatible with PHP 5.2.1 -* Compatible with PHP 4.4.6 -* Thread safe TpsvPHP component -* New component TPHPEngine introduced -* RunCode method reimplemented to solve "black horror" of pipes. -* Not fully compatible with previous version due to multithreading, but migration is easy. - -6.2 Feb 2006 - -* Compatible with PHP 5.2.0 -* Compatible with Delphi 2006 -* Compatible with PHP 5.1.1 -* Compatible with PHP 5.1.2 -* Code reorganized, some crap was removed -* Added headers support (Michael Maroszek) -* New demo projects -* PHP4Applications revisited - -6.1 - -* Compatible with PHP 5.0.4 -* Compatible with PHP 5.1.0b3 -* Compatible with Delphi 2005 - -6.0 - -* Translated Zend II API -* New PHP Object Model support -* PHP classes support for PHP4 and PHP5 -* New demo projects -* TPHPClass component compatible with PHP4 and PHP5 -* Added new property DLLFolder to psvPHP component -* New component PHPSystemLibrary - -5.5 fix 1 - -* New property RegisterGlobals (boolean) added to psvPHP component -* New property MaxExecutionTime (integer) added to psvPHP component - Maximum execution time of each script, in seconds -* New property MaxInputTime (integer) added to psvPHP component - Maximum amount of time each script may spend parsing request data -* New property SafeMode (boolean) added to psvPHP component -* New property SafeModeGid (boolean) added to psvPHP component - When safe_mode is on, UID/GID checks are bypassed when - including files from this directory and its subdirectories. (directory must also be in include_path or full path must - be used when including) -* Memory leak fixed in phpModules unit -* php_class demo project errors fixed -* psvPHP can load now PHP modules using dl() function - -5.5 - -* New component TPHPClass added (only for PHP 4) -* Added support of PHP 5 -* Improved speed of unloading of the PHP extensions under Apache -* Decreased size of the compiled modules (based on API only and developed using Visual FrameWork) -* ZendAPI unit is splitted to ZendAPI and ZendTypes units -* PHPAPI unit is splitted to PHPAPI and PHPTypes units -* New version of php4App - php4Applications subproject. - php4Applications allows to use php scripts in VB, C, C++, etc applications. - Demo projects for Delphi, VC and MS Word included. -* New property UseDelimiters added to TpsvPHP component. If UseDelimiters = true (by default) the - syntax of RunCode method parameter ACode should include standard script delimiters "" - to make RunCode and Execute method compatible. -* New parameters for OnScriptError event (error type, file name and line number) - -5.4 - -* Minor bugs fixed -* Documentation improved -* New property IniPath (folder where php.ini located) added to TpsvPHP component -* New functions translated in ZendAPI unit - -5.3 -* Added new public property ExecuteMethod to psvPHP component. - if ExecuteMethod is emGet, psvPHP receives variables as $_GET["variable"], - if ExecuteMethod is emServer (default), psvPHP receives variables as $variable. - Can be used to debug real PHP scripts with GET parameters. -* Added possibility to access published property of Delphi components from PHP -* Fixed problem with loading of PHP extension compiled wihout PHP4DELPHI_AUTOLOAD - option. - -5.2 -* Added dynamic attachement of all exported functions from php4ts.dll - in PHPAPI.pas -* New function for safe dynamic functions linking PHPStubInit and ZendStubInit - This functions can be used if you are planning to work with beta-version of PHP, - for example -* New unit zend_dynamic_array.pas -* New unit logos.pas - -5.0.3 -* Fixed bug when php function without parameters does not return value. -* New classes: TZendVariable and TZendValue in phpFunctions.pas -* New subproject: php4App - Using php4App you can integrate PHP not only with Delphi, but with VB, for example - -5.0.2 -* Fixed problem with assembler code in ZENDAPI.pas for Delphi 7 - -5.0.1 -* Fixed problem with number of parameters of zend_getparameters_ex function - -5.0 -* First version written in Delphi - - -1.0 - 4.0 -* php4Delphi was written in C as a DLL with simple Delphi wrapper - # Prerequisites -Before using php4Delphi library: - -If you have no PHP installed, you have to download and -install PHP separately. It is not included in the package. -You can download the latest version of PHP from -http://www.php.net/downloads.php - -ZEND API documentation available at http://www.zend.com -PHP API documentation available at http://www.php.net - -You need to ensure that the dlls which php uses can be found. -php4ts.dll is always used. If you are using any php extension dlls then you -will need those as well. -To make sure that the dlls can be found, you can either copy them to the -system directory (e.g. winnt/system32 or windows/system). - -Copy the file, php.ini-dist to your %WINDOWS% directory on -Windows 95/98 or to your %SYSTEMROOT% directory under Windows NT, -Windows 2000 or Windows XP and rename it to php.ini. Your %WINDOWS% or -%SYSTEMROOT% directory is typically: -c:\windows for Windows 95/98 -c:\winnt or c:\winnt40 for NT/2000/XP servers +Before using php4Delphi library:
+ +If you have no PHP installed, you have to download and
+install PHP separately. It is not included in the package.
+You can download the latest version of PHP from
+https://php.net/downloads/
+or
+https://windows.php.net/downloads/releases/archives/
+ +ZEND API documentation available at http://www.zend.com
+PHP API documentation available at http://www.php.net
+ +You need to ensure that the dlls which php uses can be found.
+php5ts.dll is always used. If you are using any php extension dlls then you
+will need those as well.
+To make sure that the dlls can be found, you can either copy them to the
+system directory (e.g. winnt/system32 or windows/system).
+ +Copy the file, php.ini-release to your php installation path
+and rename it to php.ini. By default php is located in
+%WINDOWS% or %SYSTEMROOT% directory:
+c:\windows for Windows
+c:\winnt or c:\winnt40 for NT/2000/XP servers
# Building -Uninstall previous installed version of php4Delphi Library from Delphi IDE. -Remove previously compiled php4Delphi packages from your hard disk. - -Select PHP version you are going to use. php4Delphi supports PHP 5.x, -but not at the same time. You have to compile php4Delphi for selected target version of PHP. - -Open PHP.INC file. -If you are using PHP5: -a) Uncomment (remove dot) from definition of suitable php, VC and widgetset version -b) Uncomment (remove dot) from definition of prefered features in the feature block of the PHP.INC file -c) Save PHP.INC file - -Use "File\Open..." menu item of Delphi IDE to open php4Delphi runtime -choose suitable Runtime package php4DelphiR(Your Delphi Version).dpk; In "Package..." window click "Compile" button to -compile packages. -Put compiled BPL file into directory that is accessible through the search PATH (i.e. DOS -"PATH" environment variable; -for example, in the Windows\System directory). - -After compiling php4Delphi run-time package you must install design-time -package into the IDE. - -Use "File\Open..." menu item to open design-time package php4DelphiD(Your Delphi Version).dpk -In "Package..." window click "Compile" button to compile the package -and then click "Install" button to register php4Delphi Library -components on the component palette. +Uninstall previous installed version of php4Delphi Library from Delphi IDE.
+Remove previously compiled php4Delphi packages from your disk.
+ +Select PHP version you are going to use. php4Delphi supports PHP 5.x,
+but not at the same time - this behaviour is legacy, and therefore will be removed.
+You have to compile php4Delphi for selected target version of PHP.
+ +a) Edit PHPver.INC file.
+ Specify PHPver constant:
+ PHPver = 05604; // php 5.6.4 -> 05 6 04
+b) Edit PHP.INC file.
+ Remove dot from preferred features
+ +Use "File\Open..." menu item of Delphi IDE to open php4Delphi group
+choose suitable group from /package directory;
+In "Package..." window select php4DelphiR,
+click "Compile" button to compile BPL.
+Put compiled BPL file into directory that is accessible through the search PATH
+("PATH" environment variable;
+for example, in the Windows\System directory).
+ +After compiling php4Delphi run-time package you must install design-time
+package into the IDE.
+ +In "Package..." window select php4DelphiD,
+click "Compile" button to compile the package
+and then click "Install" button to install php4Delphi components.
# Credits -Since this is a freeware you are strongly encouraged to look -at the source code and improve on the components if you want to. -Of course I would appreciate it if you would send me back the -changes and bug fixes you have made. +Since this is a freeware you are strongly encouraged to look
+at the source code and improve on the components if you want to.
+Of course we would appreciate if you create pull request with the
+changes and bug fixes you have made.
-For more information on the PHP Group and the PHP project, -please see . +For more information on the PHP Group and the PHP project,
+please see .
-PHP4Delphi forum -http://sourceforge.net/forum/forum.php?forum_id=324242 +PHP4Delphi forum
+http://sourceforge.net/forum/forum.php?forum_id=324242
-Authors: -Serhiy Perevoznyk -Belgium -serge_perevoznyk@hotmail.com -http://users.telenet.be/ws36637 -http://delphi32.blogspot.com +Authors:
+Serhiy Perevoznyk
+Belgium
+serge_perevoznyk@hotmail.com
+http://users.telenet.be/ws36637
+http://delphi32.blogspot.com
-Lew Zienin -Poland -levzenin@pm.me +Lew Zienin
+Ukraine
+levzenin@pm.me
-Nikita Ganzikov -Ukraine +Nikita Ganzikov
+Ukraine
pig-l@mail.ru - From 4440f17a4052e8d8979a30bf3c96e9c0ff5aea3f Mon Sep 17 00:00:00 2001 From: lion Date: Mon, 20 Jul 2020 02:43:10 +0300 Subject: [PATCH 53/54] Create versions.md --- versions.md | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 versions.md diff --git a/versions.md b/versions.md new file mode 100644 index 0000000..9af88d4 --- /dev/null +++ b/versions.md @@ -0,0 +1,141 @@ +## 7.5-rc1 +* Some of the ZVAL_*Type procedures moved: + ZVAL_*Type -> ZVALVAL( z: pzval, what: Type ) +* Major bug fixes (AV, Range Checking, NullPointer, php executing order, etc.) +* Introduced metatypes, so the types can be used regardless of Delphi version (x64/32, dcc version, other) +* Replaced assembler calls with pointer math +* Added procedures:
HFunc - hook library function
LFunc - load library function + +## 7.4 Mar 2019 + +* Compatible with PHP 5.5.0 +* Compatible with PHP 5.6.0 +* Compatible with PHP 5.6.x +* Compatible with Delphi 2011, XE8, Seattle, Berlin +* Added unicode support + +## 7.3 Jan 2019 + +* Compatible with PHP 5.4.0 +* Removed PHP 4 support + +## 7.2 Oct 2009 + +* Compatible with Delphi 2010 +* Compatible with PHP 5.2.11 +* Compatible with PHP 5.3.0 (VC6 and VC9 editions : see PHP.INC for more details) + +## 7.1 Oct 2008 + +* Compatible with Delphi 2009 + +## 7.0 Apr 2007 + +* Compatible with Delphi 2007 +* Compatible with PHP 5.2.1 +* Compatible with PHP 4.4.6 +* Thread safe TpsvPHP component +* New component TPHPEngine introduced +* RunCode method reimplemented to solve "black horror" of pipes. +* Not fully compatible with previous version due to multithreading, but migration is easy. + +## 6.2 Feb 2006 + +* Compatible with PHP 5.2.0 +* Compatible with Delphi 2006 +* Compatible with PHP 5.1.1 +* Compatible with PHP 5.1.2 +* Code reorganized, some crap was removed +* Added headers support (Michael Maroszek) +* New demo projects +* PHP4Applications revisited + +## 6.1 + +* Compatible with PHP 5.0.4 +* Compatible with PHP 5.1.0b3 +* Compatible with Delphi 2005 + +## 6.0 + +* Translated Zend II API +* New PHP Object Model support +* PHP classes support for PHP4 and PHP5 +* New demo projects +* TPHPClass component compatible with PHP4 and PHP5 +* Added new property DLLFolder to psvPHP component +* New component PHPSystemLibrary + +## 5.5 fix 1 + +* New property RegisterGlobals (boolean) added to psvPHP component +* New property MaxExecutionTime (integer) added to psvPHP component - Maximum execution time of each script, in seconds +* New property MaxInputTime (integer) added to psvPHP component - Maximum amount of time each script may spend parsing request data +* New property SafeMode (boolean) added to psvPHP component +* New property SafeModeGid (boolean) added to psvPHP component - When safe_mode is on, UID/GID checks are bypassed when + including files from this directory and its subdirectories. (directory must also be in include_path or full path must + be used when including) +* Memory leak fixed in phpModules unit +* php_class demo project errors fixed +* psvPHP can load now PHP modules using dl() function + +## 5.5 + +* New component TPHPClass added (only for PHP 4) +* Added support of PHP 5 +* Improved speed of unloading of the PHP extensions under Apache +* Decreased size of the compiled modules (based on API only and developed using Visual FrameWork) +* ZendAPI unit is splitted to ZendAPI and ZendTypes units +* PHPAPI unit is splitted to PHPAPI and PHPTypes units +* New version of php4App - php4Applications subproject. + php4Applications allows to use php scripts in VB, C, C++, etc applications. + Demo projects for Delphi, VC and MS Word included. +* New property UseDelimiters added to TpsvPHP component. If UseDelimiters = true (by default) the + syntax of RunCode method parameter ACode should include standard script delimiters "" + to make RunCode and Execute method compatible. +* New parameters for OnScriptError event (error type, file name and line number) + +## 5.4 + +* Minor bugs fixed +* Documentation improved +* New property IniPath (folder where php.ini located) added to TpsvPHP component +* New functions translated in ZendAPI unit + +## 5.3 +* Added new public property ExecuteMethod to psvPHP component. + if ExecuteMethod is emGet, psvPHP receives variables as $_GET["variable"], + if ExecuteMethod is emServer (default), psvPHP receives variables as $variable. + Can be used to debug real PHP scripts with GET parameters. +* Added possibility to access published property of Delphi components from PHP +* Fixed problem with loading of PHP extension compiled wihout PHP4DELPHI_AUTOLOAD + option. + +## 5.2 +* Added dynamic attachement of all exported functions from php4ts.dll + in PHPAPI.pas +* New function for safe dynamic functions linking PHPStubInit and ZendStubInit + This functions can be used if you are planning to work with beta-version of PHP, + for example +* New unit zend_dynamic_array.pas +* New unit logos.pas + +## 5.0.3 +* Fixed bug when php function without parameters does not return value. +* New classes: TZendVariable and TZendValue in phpFunctions.pas +* New subproject: php4App + Using php4App you can integrate PHP not only with Delphi, but with VB, for example + +## 5.0.2 +* Fixed problem with assembler code in ZENDAPI.pas for Delphi 7 + +## 5.0.1 +* Fixed problem with number of parameters of zend_getparameters_ex function + +## 5.0 +* First version written in Delphi + + +## 1.0 - 4.0 +* php4Delphi was written in C as a DLL with simple Delphi wrapper + From aefc942ba993133b1b5e574ec30aef551a01d1a1 Mon Sep 17 00:00:00 2001 From: Leo Date: Mon, 20 Jul 2020 15:16:39 +0300 Subject: [PATCH 54/54] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9df90e1..216be78 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Extensions using Delphi.
PHP extension, in the most basic of terms, is a set of instructions that is
designed to add functionality to PHP.
-3. PHP4Applications (integrate PHP in any application)
+3. PHP4Applications (integrate PHP in any application)
Supports C, C++, Visual Basic, VBA, C#, Delphi, Delphi .NET, Visual Basic .NET etc.