diff options
author | Christian Schneider | 2007-11-09 18:40:56 +0000 |
---|---|---|
committer | Christian Schneider | 2007-11-09 18:40:56 +0000 |
commit | 6e2681528377b7bda3199b683f0aaa90de010fec (patch) | |
tree | 6c9e370c863b6eec31a5f46c6bbfda6df80165c2 /it_auto_prepend.php | |
parent | 49eff48cf8ce1e4d734287f4f5305746b02ea26f (diff) | |
download | itools-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.php | 183 |
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 +} |