summaryrefslogtreecommitdiff
path: root/it_auto_prepend.php
diff options
context:
space:
mode:
authorChristian Schneider2007-11-09 18:40:56 +0000
committerChristian Schneider2007-11-09 18:40:56 +0000
commit6e2681528377b7bda3199b683f0aaa90de010fec (patch)
tree6c9e370c863b6eec31a5f46c6bbfda6df80165c2 /it_auto_prepend.php
parent49eff48cf8ce1e4d734287f4f5305746b02ea26f (diff)
downloaditools-6e2681528377b7bda3199b683f0aaa90de010fec.tar.gz
itools-6e2681528377b7bda3199b683f0aaa90de010fec.tar.bz2
itools-6e2681528377b7bda3199b683f0aaa90de010fec.zip
Added it_autoprepend.php, it_syntaxconverter.class and convertsyntax.php
Diffstat (limited to 'it_auto_prepend.php')
-rw-r--r--it_auto_prepend.php183
1 files changed, 183 insertions, 0 deletions
diff --git a/it_auto_prepend.php b/it_auto_prepend.php
new file mode 100644
index 0000000..3f69096
--- /dev/null
+++ b/it_auto_prepend.php
@@ -0,0 +1,183 @@
+<?php
+/*
+** $Id$
+**
+** Copyright (C) 1995-2007 by the ITools Authors.
+** This file is part of ITools - the Internet Tools Library
+**
+** ITools is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 3 of the License, or
+** (at your option) any later version.
+**
+** ITools is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+define('IT_CONVERT_DIR', "/tmp/it_syntaxconverter");
+
+#$debug_itclassloader = true;
+it_initialize();
+
+function it_initialize()
+{
+ static $it_initrecursion;
+
+ if (!$it_initrecursion++)
+ {
+ if ($_SERVER['REMOTE_ADDR']) # Web?
+ {
+ $GLOBALS['ULTRAHOME'] = dirname($_SERVER['SCRIPT_FILENAME']);
+ umask(0002); # Work around bugs.php.net/bug.php?id=28401
+ $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
+ }
+ else # Shell
+ $GLOBALS['ULTRAHOME'] = dirname(preg_match('|^/|', $argv[0]) ? $argv[0] : getcwd() . '/' . $argv[0]);
+
+ $needsconvert = !@eval("return is_array(42=>69,);"); # Check if PHP is patched to support our syntax, see http://cschneid.com/php/
+
+ $include_path = ini_get('include_path');
+ $it_path = dirname(__FILE__);
+
+ if ($autoloader = function_exists('spl_autoload_register') && spl_autoload_register('it_classloader'))
+ {
+ ini_set('include_path', "$it_path:$include_path");
+ require_once("$it_path/auto_prepend.php");
+ }
+ else
+ {
+ ini_set('include_path', "$it_path/..:$include_path");
+ require("itools.lib"); # PHP 4 fallback
+ }
+
+ @set_error_handler("it_errorhandler", E_USER_ERROR | E_RECOVERABLE_ERROR | E_WARNING | E_USER_WARNING | E_NOTICE | E_USER_NOTICE);
+ ini_set('include_path', IT_CONVERT_DIR . ":$it_path:$include_path");
+ $user_includes = explode(":", $include_path);
+
+ # XXX Note: Comment this out if you want system wide include path converted and auto_prepend.php considered
+ $user_includes = array_diff($user_includes, array_diff(explode(":", get_cfg_var('include_path')), array(".")));
+
+ foreach (array_reverse($user_includes) as $include)
+ {
+ if ($include == ".")
+ $include = dirname($_SERVER['SCRIPT_FILENAME']);
+
+ if ($needsconvert)
+ it_convert($include);
+
+ if (file_exists($autoprepend = "$include/auto_prepend.php"))
+ {
+ if ($needsconvert && ($include != $it_path))
+ $autoprepend = it_convert($autoprepend);
+
+ require_once($autoprepend);
+ }
+ }
+
+ if (!isset($GLOBALS['it_html']))
+ new it_html;
+
+ if ($needsconvert)
+ {
+ # Convert syntax and start
+ $converted = it_convert($_SERVER['SCRIPT_FILENAME']);
+
+ /* XXX Disabled as DB not always there
+ if (!$autoloader) # PHP 4 fallback
+ it_dbi::createclasses();
+ */
+
+ require($converted);
+ exit;
+ }
+ }
+}
+
+function it_convert($source)
+{
+ if (is_dir($source) && !is_link($source))
+ {
+ foreach (glob("$source/*") as $file)
+ it_convert($file);
+ }
+ else if (is_readable($source))
+ {
+ $converted = IT_CONVERT_DIR . "/$source";
+
+ if (@filemtime($converted) < filemtime($source))
+ {
+ $converter = new it_syntaxconverter(file_get_contents($source));
+ $parts = explode("/", dirname($converted));
+
+ for ($i = 1; $i <= count($parts); $i++)
+ @mkdir(join("/", array_slice($parts, 0, $i)));
+
+ if ($output = fopen($converted, "w"))
+ {
+ fputs($output, $converter->output);
+ fclose($output);
+ chmod($converted, 0666);
+ }
+
+ clearstatcache();
+ }
+ }
+
+ return $converted;
+}
+
+function it_classloader($classname)
+{
+ if ($file = @fopen("$classname.class", "r", true)) # Check for file in include path, do not use @include to get failures on inheritance
+ {
+ include("$classname.class");
+ fclose($file);
+ }
+ else
+ it_dbi::createclass($classname);
+
+ EDC('ultraclassloader', $classname, it_debug::backtrace());
+}
+
+function it_errorhandler($errno, $errstr, $errfile, $errline, $errcontext)
+{
+ if ($result = error_reporting() & $errno) # Is this error enabled?
+ {
+ static $it_errnames = array();
+
+ if (!$it_errnames)
+ {
+ foreach (get_defined_constants() as $name => $no)
+ {
+ if (preg_match('/^E_/', $name))
+ $it_errnames[$no] = "$name: ";
+ }
+ }
+
+ $error = array(
+ 'title' => $it_errnames[$errno] . $errstr,
+ 'locals' => $errcontext,
+ 'file' => $errfile,
+ 'line' => $errline,
+ 'backtraceskip' => 1,
+ );
+
+ switch ($errno)
+ {
+ case E_USER_ERROR: case E_RECOVERABLE_ERROR:
+ it::fatal($error);
+ break;
+
+ default:
+ it::error($error);
+ break;
+ }
+ }
+
+ return $result; # True means do not execute standard PHP error handler
+}