OSDN Git Service

NP_Moblog v1.17
[nucleus-jp/nucleus-plugins.git] / trunk / NP_Moblog / sharedlibs / PEAR.php
index 69f55d1..19e5b5e 100644 (file)
-<?php
-/**
- * PEAR, the PHP Extension and Application Repository
- *
- * PEAR class and PEAR_Error class
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category   pear
- * @package    PEAR
- * @author     Sterling Hughes <sterling@php.net>
- * @author     Stig Bakken <ssb@php.net>
- * @author     Tomas V.V.Cox <cox@idecnet.com>
- * @author     Greg Beaver <cellog@php.net>
- * @copyright  1997-2006 The PHP Group
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version    CVS: $Id: PEAR.php,v 1.1 2008-05-04 07:04:50 hsur Exp $
- * @link       http://pear.php.net/package/PEAR
- * @since      File available since Release 0.1
- */
-
-/**#@+
- * ERROR constants
- */
-define('PEAR_ERROR_RETURN',     1);
-define('PEAR_ERROR_PRINT',      2);
-define('PEAR_ERROR_TRIGGER',    4);
-define('PEAR_ERROR_DIE',        8);
-define('PEAR_ERROR_CALLBACK',  16);
-/**
- * WARNING: obsolete
- * @deprecated
- */
-define('PEAR_ERROR_EXCEPTION', 32);
-/**#@-*/
-define('PEAR_ZE2', (function_exists('version_compare') &&
-                    version_compare(zend_version(), "2-dev", "ge")));
-
-if (substr(PHP_OS, 0, 3) == 'WIN') {
-    define('OS_WINDOWS', true);
-    define('OS_UNIX',    false);
-    define('PEAR_OS',    'Windows');
-} else {
-    define('OS_WINDOWS', false);
-    define('OS_UNIX',    true);
-    define('PEAR_OS',    'Unix'); // blatant assumption
-}
-
-// instant backwards compatibility
-if (!defined('PATH_SEPARATOR')) {
-    if (OS_WINDOWS) {
-        define('PATH_SEPARATOR', ';');
-    } else {
-        define('PATH_SEPARATOR', ':');
-    }
-}
-
-$GLOBALS['_PEAR_default_error_mode']     = PEAR_ERROR_RETURN;
-$GLOBALS['_PEAR_default_error_options']  = E_USER_NOTICE;
-$GLOBALS['_PEAR_destructor_object_list'] = array();
-$GLOBALS['_PEAR_shutdown_funcs']         = array();
-$GLOBALS['_PEAR_error_handler_stack']    = array();
-
-@ini_set('track_errors', true);
-
-/**
- * Base class for other PEAR classes.  Provides rudimentary
- * emulation of destructors.
- *
- * If you want a destructor in your class, inherit PEAR and make a
- * destructor method called _yourclassname (same name as the
- * constructor, but with a "_" prefix).  Also, in your constructor you
- * have to call the PEAR constructor: $this->PEAR();.
- * The destructor method will be called without parameters.  Note that
- * at in some SAPI implementations (such as Apache), any output during
- * the request shutdown (in which destructors are called) seems to be
- * discarded.  If you need to get any debug information from your
- * destructor, use error_log(), syslog() or something similar.
- *
- * IMPORTANT! To use the emulated destructors you need to create the
- * objects by reference: $obj =& new PEAR_child;
- *
- * @category   pear
- * @package    PEAR
- * @author     Stig Bakken <ssb@php.net>
- * @author     Tomas V.V. Cox <cox@idecnet.com>
- * @author     Greg Beaver <cellog@php.net>
- * @copyright  1997-2006 The PHP Group
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version    Release: 1.4.9
- * @link       http://pear.php.net/package/PEAR
- * @see        PEAR_Error
- * @since      Class available since PHP 4.0.2
- * @link        http://pear.php.net/manual/en/core.pear.php#core.pear.pear
- */
-class PEAR
-{
-    // {{{ properties
-
-    /**
-     * Whether to enable internal debug messages.
-     *
-     * @var     bool
-     * @access  private
-     */
-    var $_debug = false;
-
-    /**
-     * Default error mode for this object.
-     *
-     * @var     int
-     * @access  private
-     */
-    var $_default_error_mode = null;
-
-    /**
-     * Default error options used for this object when error mode
-     * is PEAR_ERROR_TRIGGER.
-     *
-     * @var     int
-     * @access  private
-     */
-    var $_default_error_options = null;
-
-    /**
-     * Default error handler (callback) for this object, if error mode is
-     * PEAR_ERROR_CALLBACK.
-     *
-     * @var     string
-     * @access  private
-     */
-    var $_default_error_handler = '';
-
-    /**
-     * Which class to use for error objects.
-     *
-     * @var     string
-     * @access  private
-     */
-    var $_error_class = 'PEAR_Error';
-
-    /**
-     * An array of expected errors.
-     *
-     * @var     array
-     * @access  private
-     */
-    var $_expected_errors = array();
-
-    // }}}
-
-    // {{{ constructor
-
-    /**
-     * Constructor.  Registers this object in
-     * $_PEAR_destructor_object_list for destructor emulation if a
-     * destructor object exists.
-     *
-     * @param string $error_class  (optional) which class to use for
-     *        error objects, defaults to PEAR_Error.
-     * @access public
-     * @return void
-     */
-    function PEAR($error_class = null)
-    {
-        $classname = strtolower(get_class($this));
-        if ($this->_debug) {
-            print "PEAR constructor called, class=$classname\n";
-        }
-        if ($error_class !== null) {
-            $this->_error_class = $error_class;
-        }
-        while ($classname && strcasecmp($classname, "pear")) {
-            $destructor = "_$classname";
-            if (method_exists($this, $destructor)) {
-                global $_PEAR_destructor_object_list;
-                $_PEAR_destructor_object_list[] = &$this;
-                if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
-                    register_shutdown_function("_PEAR_call_destructors");
-                    $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
-                }
-                break;
-            } else {
-                $classname = get_parent_class($classname);
-            }
-        }
-    }
-
-    // }}}
-    // {{{ destructor
-
-    /**
-     * Destructor (the emulated type of...).  Does nothing right now,
-     * but is included for forward compatibility, so subclass
-     * destructors should always call it.
-     *
-     * See the note in the class desciption about output from
-     * destructors.
-     *
-     * @access public
-     * @return void
-     */
-    function _PEAR() {
-        if ($this->_debug) {
-            printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));
-        }
-    }
-
-    // }}}
-    // {{{ getStaticProperty()
-
-    /**
-    * If you have a class that's mostly/entirely static, and you need static
-    * properties, you can use this method to simulate them. Eg. in your method(s)
-    * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
-    * You MUST use a reference, or they will not persist!
-    *
-    * @access public
-    * @param  string $class  The calling classname, to prevent clashes
-    * @param  string $var    The variable to retrieve.
-    * @return mixed   A reference to the variable. If not set it will be
-    *                 auto initialised to NULL.
-    */
-    function &getStaticProperty($class, $var)
-    {
-        static $properties;
-        return $properties[$class][$var];
-    }
-
-    // }}}
-    // {{{ registerShutdownFunc()
-
-    /**
-    * Use this function to register a shutdown method for static
-    * classes.
-    *
-    * @access public
-    * @param  mixed $func  The function name (or array of class/method) to call
-    * @param  mixed $args  The arguments to pass to the function
-    * @return void
-    */
-    function registerShutdownFunc($func, $args = array())
-    {
-        // if we are called statically, there is a potential
-        // that no shutdown func is registered.  Bug #6445
-        if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
-            register_shutdown_function("_PEAR_call_destructors");
-            $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
-        }
-        $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
-    }
-
-    // }}}
-    // {{{ isError()
-
-    /**
-     * Tell whether a value is a PEAR error.
-     *
-     * @param   mixed $data   the value to test
-     * @param   int   $code   if $data is an error object, return true
-     *                        only if $code is a string and
-     *                        $obj->getMessage() == $code or
-     *                        $code is an integer and $obj->getCode() == $code
-     * @access  public
-     * @return  bool    true if parameter is an error
-     */
-    function isError($data, $code = null)
-    {
-        if (is_a($data, 'PEAR_Error')) {
-            if (is_null($code)) {
-                return true;
-            } elseif (is_string($code)) {
-                return $data->getMessage() == $code;
-            } else {
-                return $data->getCode() == $code;
-            }
-        }
-        return false;
-    }
-
-    // }}}
-    // {{{ setErrorHandling()
-
-    /**
-     * Sets how errors generated by this object should be handled.
-     * Can be invoked both in objects and statically.  If called
-     * statically, setErrorHandling sets the default behaviour for all
-     * PEAR objects.  If called in an object, setErrorHandling sets
-     * the default behaviour for that object.
-     *
-     * @param int $mode
-     *        One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
-     *        PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
-     *        PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
-     *
-     * @param mixed $options
-     *        When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
-     *        of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
-     *
-     *        When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
-     *        to be the callback function or method.  A callback
-     *        function is a string with the name of the function, a
-     *        callback method is an array of two elements: the element
-     *        at index 0 is the object, and the element at index 1 is
-     *        the name of the method to call in the object.
-     *
-     *        When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
-     *        a printf format string used when printing the error
-     *        message.
-     *
-     * @access public
-     * @return void
-     * @see PEAR_ERROR_RETURN
-     * @see PEAR_ERROR_PRINT
-     * @see PEAR_ERROR_TRIGGER
-     * @see PEAR_ERROR_DIE
-     * @see PEAR_ERROR_CALLBACK
-     * @see PEAR_ERROR_EXCEPTION
-     *
-     * @since PHP 4.0.5
-     */
-
-    function setErrorHandling($mode = null, $options = null)
-    {
-        if (isset($this) && is_a($this, 'PEAR')) {
-            $setmode     = &$this->_default_error_mode;
-            $setoptions  = &$this->_default_error_options;
-        } else {
-            $setmode     = &$GLOBALS['_PEAR_default_error_mode'];
-            $setoptions  = &$GLOBALS['_PEAR_default_error_options'];
-        }
-
-        switch ($mode) {
-            case PEAR_ERROR_EXCEPTION:
-            case PEAR_ERROR_RETURN:
-            case PEAR_ERROR_PRINT:
-            case PEAR_ERROR_TRIGGER:
-            case PEAR_ERROR_DIE:
-            case null:
-                $setmode = $mode;
-                $setoptions = $options;
-                break;
-
-            case PEAR_ERROR_CALLBACK:
-                $setmode = $mode;
-                // class/object method callback
-                if (is_callable($options)) {
-                    $setoptions = $options;
-                } else {
-                    trigger_error("invalid error callback", E_USER_WARNING);
-                }
-                break;
-
-            default:
-                trigger_error("invalid error mode", E_USER_WARNING);
-                break;
-        }
-    }
-
-    // }}}
-    // {{{ expectError()
-
-    /**
-     * This method is used to tell which errors you expect to get.
-     * Expected errors are always returned with error mode
-     * PEAR_ERROR_RETURN.  Expected error codes are stored in a stack,
-     * and this method pushes a new element onto it.  The list of
-     * expected errors are in effect until they are popped off the
-     * stack with the popExpect() method.
-     *
-     * Note that this method can not be called statically
-     *
-     * @param mixed $code a single error code or an array of error codes to expect
-     *
-     * @return int     the new depth of the "expected errors" stack
-     * @access public
-     */
-    function expectError($code = '*')
-    {
-        if (is_array($code)) {
-            array_push($this->_expected_errors, $code);
-        } else {
-            array_push($this->_expected_errors, array($code));
-        }
-        return sizeof($this->_expected_errors);
-    }
-
-    // }}}
-    // {{{ popExpect()
-
-    /**
-     * This method pops one element off the expected error codes
-     * stack.
-     *
-     * @return array   the list of error codes that were popped
-     */
-    function popExpect()
-    {
-        return array_pop($this->_expected_errors);
-    }
-
-    // }}}
-    // {{{ _checkDelExpect()
-
-    /**
-     * This method checks unsets an error code if available
-     *
-     * @param mixed error code
-     * @return bool true if the error code was unset, false otherwise
-     * @access private
-     * @since PHP 4.3.0
-     */
-    function _checkDelExpect($error_code)
-    {
-        $deleted = false;
-
-        foreach ($this->_expected_errors AS $key => $error_array) {
-            if (in_array($error_code, $error_array)) {
-                unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
-                $deleted = true;
-            }
-
-            // clean up empty arrays
-            if (0 == count($this->_expected_errors[$key])) {
-                unset($this->_expected_errors[$key]);
-            }
-        }
-        return $deleted;
-    }
-
-    // }}}
-    // {{{ delExpect()
-
-    /**
-     * This method deletes all occurences of the specified element from
-     * the expected error codes stack.
-     *
-     * @param  mixed $error_code error code that should be deleted
-     * @return mixed list of error codes that were deleted or error
-     * @access public
-     * @since PHP 4.3.0
-     */
-    function delExpect($error_code)
-    {
-        $deleted = false;
-
-        if ((is_array($error_code) && (0 != count($error_code)))) {
-            // $error_code is a non-empty array here;
-            // we walk through it trying to unset all
-            // values
-            foreach($error_code as $key => $error) {
-                if ($this->_checkDelExpect($error)) {
-                    $deleted =  true;
-                } else {
-                    $deleted = false;
-                }
-            }
-            return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
-        } elseif (!empty($error_code)) {
-            // $error_code comes alone, trying to unset it
-            if ($this->_checkDelExpect($error_code)) {
-                return true;
-            } else {
-                return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
-            }
-        } else {
-            // $error_code is empty
-            return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
-        }
-    }
-
-    // }}}
-    // {{{ raiseError()
-
-    /**
-     * This method is a wrapper that returns an instance of the
-     * configured error class with this object's default error
-     * handling applied.  If the $mode and $options parameters are not
-     * specified, the object's defaults are used.
-     *
-     * @param mixed $message a text error message or a PEAR error object
-     *
-     * @param int $code      a numeric error code (it is up to your class
-     *                  to define these if you want to use codes)
-     *
-     * @param int $mode      One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
-     *                  PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
-     *                  PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
-     *
-     * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
-     *                  specifies the PHP-internal error level (one of
-     *                  E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
-     *                  If $mode is PEAR_ERROR_CALLBACK, this
-     *                  parameter specifies the callback function or
-     *                  method.  In other error modes this parameter
-     *                  is ignored.
-     *
-     * @param string $userinfo If you need to pass along for example debug
-     *                  information, this parameter is meant for that.
-     *
-     * @param string $error_class The returned error object will be
-     *                  instantiated from this class, if specified.
-     *
-     * @param bool $skipmsg If true, raiseError will only pass error codes,
-     *                  the error message parameter will be dropped.
-     *
-     * @access public
-     * @return object   a PEAR error object
-     * @see PEAR::setErrorHandling
-     * @since PHP 4.0.5
-     */
-    function &raiseError($message = null,
-                         $code = null,
-                         $mode = null,
-                         $options = null,
-                         $userinfo = null,
-                         $error_class = null,
-                         $skipmsg = false)
-    {
-        // The error is yet a PEAR error object
-        if (is_object($message)) {
-            $code        = $message->getCode();
-            $userinfo    = $message->getUserInfo();
-            $error_class = $message->getType();
-            $message->error_message_prefix = '';
-            $message     = $message->getMessage();
-        }
-
-        if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) {
-            if ($exp[0] == "*" ||
-                (is_int(reset($exp)) && in_array($code, $exp)) ||
-                (is_string(reset($exp)) && in_array($message, $exp))) {
-                $mode = PEAR_ERROR_RETURN;
-            }
-        }
-        // No mode given, try global ones
-        if ($mode === null) {
-            // Class error handler
-            if (isset($this) && isset($this->_default_error_mode)) {
-                $mode    = $this->_default_error_mode;
-                $options = $this->_default_error_options;
-            // Global error handler
-            } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
-                $mode    = $GLOBALS['_PEAR_default_error_mode'];
-                $options = $GLOBALS['_PEAR_default_error_options'];
-            }
-        }
-
-        if ($error_class !== null) {
-            $ec = $error_class;
-        } elseif (isset($this) && isset($this->_error_class)) {
-            $ec = $this->_error_class;
-        } else {
-            $ec = 'PEAR_Error';
-        }
-        if ($skipmsg) {
-            $a = &new $ec($code, $mode, $options, $userinfo);
-            return $a;
-        } else {
-            $a = &new $ec($message, $code, $mode, $options, $userinfo);
-            return $a;
-        }
-    }
-
-    // }}}
-    // {{{ throwError()
-
-    /**
-     * Simpler form of raiseError with fewer options.  In most cases
-     * message, code and userinfo are enough.
-     *
-     * @param string $message
-     *
-     */
-    function &throwError($message = null,
-                         $code = null,
-                         $userinfo = null)
-    {
-        if (isset($this) && is_a($this, 'PEAR')) {
-            $a = &$this->raiseError($message, $code, null, null, $userinfo);
-            return $a;
-        } else {
-            $a = &PEAR::raiseError($message, $code, null, null, $userinfo);
-            return $a;
-        }
-    }
-
-    // }}}
-    function staticPushErrorHandling($mode, $options = null)
-    {
-        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
-        $def_mode    = &$GLOBALS['_PEAR_default_error_mode'];
-        $def_options = &$GLOBALS['_PEAR_default_error_options'];
-        $stack[] = array($def_mode, $def_options);
-        switch ($mode) {
-            case PEAR_ERROR_EXCEPTION:
-            case PEAR_ERROR_RETURN:
-            case PEAR_ERROR_PRINT:
-            case PEAR_ERROR_TRIGGER:
-            case PEAR_ERROR_DIE:
-            case null:
-                $def_mode = $mode;
-                $def_options = $options;
-                break;
-
-            case PEAR_ERROR_CALLBACK:
-                $def_mode = $mode;
-                // class/object method callback
-                if (is_callable($options)) {
-                    $def_options = $options;
-                } else {
-                    trigger_error("invalid error callback", E_USER_WARNING);
-                }
-                break;
-
-            default:
-                trigger_error("invalid error mode", E_USER_WARNING);
-                break;
-        }
-        $stack[] = array($mode, $options);
-        return true;
-    }
-
-    function staticPopErrorHandling()
-    {
-        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
-        $setmode     = &$GLOBALS['_PEAR_default_error_mode'];
-        $setoptions  = &$GLOBALS['_PEAR_default_error_options'];
-        array_pop($stack);
-        list($mode, $options) = $stack[sizeof($stack) - 1];
-        array_pop($stack);
-        switch ($mode) {
-            case PEAR_ERROR_EXCEPTION:
-            case PEAR_ERROR_RETURN:
-            case PEAR_ERROR_PRINT:
-            case PEAR_ERROR_TRIGGER:
-            case PEAR_ERROR_DIE:
-            case null:
-                $setmode = $mode;
-                $setoptions = $options;
-                break;
-
-            case PEAR_ERROR_CALLBACK:
-                $setmode = $mode;
-                // class/object method callback
-                if (is_callable($options)) {
-                    $setoptions = $options;
-                } else {
-                    trigger_error("invalid error callback", E_USER_WARNING);
-                }
-                break;
-
-            default:
-                trigger_error("invalid error mode", E_USER_WARNING);
-                break;
-        }
-        return true;
-    }
-
-    // {{{ pushErrorHandling()
-
-    /**
-     * Push a new error handler on top of the error handler options stack. With this
-     * you can easily override the actual error handler for some code and restore
-     * it later with popErrorHandling.
-     *
-     * @param mixed $mode (same as setErrorHandling)
-     * @param mixed $options (same as setErrorHandling)
-     *
-     * @return bool Always true
-     *
-     * @see PEAR::setErrorHandling
-     */
-    function pushErrorHandling($mode, $options = null)
-    {
-        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
-        if (isset($this) && is_a($this, 'PEAR')) {
-            $def_mode    = &$this->_default_error_mode;
-            $def_options = &$this->_default_error_options;
-        } else {
-            $def_mode    = &$GLOBALS['_PEAR_default_error_mode'];
-            $def_options = &$GLOBALS['_PEAR_default_error_options'];
-        }
-        $stack[] = array($def_mode, $def_options);
-
-        if (isset($this) && is_a($this, 'PEAR')) {
-            $this->setErrorHandling($mode, $options);
-        } else {
-            PEAR::setErrorHandling($mode, $options);
-        }
-        $stack[] = array($mode, $options);
-        return true;
-    }
-
-    // }}}
-    // {{{ popErrorHandling()
-
-    /**
-    * Pop the last error handler used
-    *
-    * @return bool Always true
-    *
-    * @see PEAR::pushErrorHandling
-    */
-    function popErrorHandling()
-    {
-        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
-        array_pop($stack);
-        list($mode, $options) = $stack[sizeof($stack) - 1];
-        array_pop($stack);
-        if (isset($this) && is_a($this, 'PEAR')) {
-            $this->setErrorHandling($mode, $options);
-        } else {
-            PEAR::setErrorHandling($mode, $options);
-        }
-        return true;
-    }
-
-    // }}}
-    // {{{ loadExtension()
-
-    /**
-    * OS independant PHP extension load. Remember to take care
-    * on the correct extension name for case sensitive OSes.
-    *
-    * @param string $ext The extension name
-    * @return bool Success or not on the dl() call
-    */
-    function loadExtension($ext)
-    {
-        if (!extension_loaded($ext)) {
-            // if either returns true dl() will produce a FATAL error, stop that
-            if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) {
-                return false;
-            }
-            if (OS_WINDOWS) {
-                $suffix = '.dll';
-            } elseif (PHP_OS == 'HP-UX') {
-                $suffix = '.sl';
-            } elseif (PHP_OS == 'AIX') {
-                $suffix = '.a';
-            } elseif (PHP_OS == 'OSX') {
-                $suffix = '.bundle';
-            } else {
-                $suffix = '.so';
-            }
-            return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
-        }
-        return true;
-    }
-
-    // }}}
-}
-
-// {{{ _PEAR_call_destructors()
-
-function _PEAR_call_destructors()
-{
-    global $_PEAR_destructor_object_list;
-    if (is_array($_PEAR_destructor_object_list) &&
-        sizeof($_PEAR_destructor_object_list))
-    {
-        reset($_PEAR_destructor_object_list);
-        if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) {
-            $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
-        }
-        while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
-            $classname = get_class($objref);
-            while ($classname) {
-                $destructor = "_$classname";
-                if (method_exists($objref, $destructor)) {
-                    $objref->$destructor();
-                    break;
-                } else {
-                    $classname = get_parent_class($classname);
-                }
-            }
-        }
-        // Empty the object list to ensure that destructors are
-        // not called more than once.
-        $_PEAR_destructor_object_list = array();
-    }
-
-    // Now call the shutdown functions
-    if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) {
-        foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
-            call_user_func_array($value[0], $value[1]);
-        }
-    }
-}
-
-// }}}
-/**
- * Standard PEAR error class for PHP 4
- *
- * This class is supserseded by {@link PEAR_Exception} in PHP 5
- *
- * @category   pear
- * @package    PEAR
- * @author     Stig Bakken <ssb@php.net>
- * @author     Tomas V.V. Cox <cox@idecnet.com>
- * @author     Gregory Beaver <cellog@php.net>
- * @copyright  1997-2006 The PHP Group
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version    Release: 1.4.9
- * @link       http://pear.php.net/manual/en/core.pear.pear-error.php
- * @see        PEAR::raiseError(), PEAR::throwError()
- * @since      Class available since PHP 4.0.2
- */
-class PEAR_Error
-{
-    // {{{ properties
-
-    var $error_message_prefix = '';
-    var $mode                 = PEAR_ERROR_RETURN;
-    var $level                = E_USER_NOTICE;
-    var $code                 = -1;
-    var $message              = '';
-    var $userinfo             = '';
-    var $backtrace            = null;
-
-    // }}}
-    // {{{ constructor
-
-    /**
-     * PEAR_Error constructor
-     *
-     * @param string $message  message
-     *
-     * @param int $code     (optional) error code
-     *
-     * @param int $mode     (optional) error mode, one of: PEAR_ERROR_RETURN,
-     * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
-     * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
-     *
-     * @param mixed $options   (optional) error level, _OR_ in the case of
-     * PEAR_ERROR_CALLBACK, the callback function or object/method
-     * tuple.
-     *
-     * @param string $userinfo (optional) additional user/debug info
-     *
-     * @access public
-     *
-     */
-    function PEAR_Error($message = 'unknown error', $code = null,
-                        $mode = null, $options = null, $userinfo = null)
-    {
-        if ($mode === null) {
-            $mode = PEAR_ERROR_RETURN;
-        }
-        $this->message   = $message;
-        $this->code      = $code;
-        $this->mode      = $mode;
-        $this->userinfo  = $userinfo;
-        if (function_exists("debug_backtrace")) {
-            if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) {
-                $this->backtrace = debug_backtrace();
-            }
-        }
-        if ($mode & PEAR_ERROR_CALLBACK) {
-            $this->level = E_USER_NOTICE;
-            $this->callback = $options;
-        } else {
-            if ($options === null) {
-                $options = E_USER_NOTICE;
-            }
-            $this->level = $options;
-            $this->callback = null;
-        }
-        if ($this->mode & PEAR_ERROR_PRINT) {
-            if (is_null($options) || is_int($options)) {
-                $format = "%s";
-            } else {
-                $format = $options;
-            }
-            printf($format, $this->getMessage());
-        }
-        if ($this->mode & PEAR_ERROR_TRIGGER) {
-            trigger_error($this->getMessage(), $this->level);
-        }
-        if ($this->mode & PEAR_ERROR_DIE) {
-            $msg = $this->getMessage();
-            if (is_null($options) || is_int($options)) {
-                $format = "%s";
-                if (substr($msg, -1) != "\n") {
-                    $msg .= "\n";
-                }
-            } else {
-                $format = $options;
-            }
-            die(sprintf($format, $msg));
-        }
-        if ($this->mode & PEAR_ERROR_CALLBACK) {
-            if (is_callable($this->callback)) {
-                call_user_func($this->callback, $this);
-            }
-        }
-        if ($this->mode & PEAR_ERROR_EXCEPTION) {
-            trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
-            eval('$e = new Exception($this->message, $this->code);throw($e);');
-        }
-    }
-
-    // }}}
-    // {{{ getMode()
-
-    /**
-     * Get the error mode from an error object.
-     *
-     * @return int error mode
-     * @access public
-     */
-    function getMode() {
-        return $this->mode;
-    }
-
-    // }}}
-    // {{{ getCallback()
-
-    /**
-     * Get the callback function/method from an error object.
-     *
-     * @return mixed callback function or object/method array
-     * @access public
-     */
-    function getCallback() {
-        return $this->callback;
-    }
-
-    // }}}
-    // {{{ getMessage()
-
-
-    /**
-     * Get the error message from an error object.
-     *
-     * @return  string  full error message
-     * @access public
-     */
-    function getMessage()
-    {
-        return ($this->error_message_prefix . $this->message);
-    }
-
-
-    // }}}
-    // {{{ getCode()
-
-    /**
-     * Get error code from an error object
-     *
-     * @return int error code
-     * @access public
-     */
-     function getCode()
-     {
-        return $this->code;
-     }
-
-    // }}}
-    // {{{ getType()
-
-    /**
-     * Get the name of this error/exception.
-     *
-     * @return string error/exception name (type)
-     * @access public
-     */
-    function getType()
-    {
-        return get_class($this);
-    }
-
-    // }}}
-    // {{{ getUserInfo()
-
-    /**
-     * Get additional user-supplied information.
-     *
-     * @return string user-supplied information
-     * @access public
-     */
-    function getUserInfo()
-    {
-        return $this->userinfo;
-    }
-
-    // }}}
-    // {{{ getDebugInfo()
-
-    /**
-     * Get additional debug information supplied by the application.
-     *
-     * @return string debug information
-     * @access public
-     */
-    function getDebugInfo()
-    {
-        return $this->getUserInfo();
-    }
-
-    // }}}
-    // {{{ getBacktrace()
-
-    /**
-     * Get the call backtrace from where the error was generated.
-     * Supported with PHP 4.3.0 or newer.
-     *
-     * @param int $frame (optional) what frame to fetch
-     * @return array Backtrace, or NULL if not available.
-     * @access public
-     */
-    function getBacktrace($frame = null)
-    {
-        if (defined('PEAR_IGNORE_BACKTRACE')) {
-            return null;
-        }
-        if ($frame === null) {
-            return $this->backtrace;
-        }
-        return $this->backtrace[$frame];
-    }
-
-    // }}}
-    // {{{ addUserInfo()
-
-    function addUserInfo($info)
-    {
-        if (empty($this->userinfo)) {
-            $this->userinfo = $info;
-        } else {
-            $this->userinfo .= " ** $info";
-        }
-    }
-
-    // }}}
-    // {{{ toString()
-
-    /**
-     * Make a string representation of this object.
-     *
-     * @return string a string with an object summary
-     * @access public
-     */
-    function toString() {
-        $modes = array();
-        $levels = array(E_USER_NOTICE  => 'notice',
-                        E_USER_WARNING => 'warning',
-                        E_USER_ERROR   => 'error');
-        if ($this->mode & PEAR_ERROR_CALLBACK) {
-            if (is_array($this->callback)) {
-                $callback = (is_object($this->callback[0]) ?
-                    strtolower(get_class($this->callback[0])) :
-                    $this->callback[0]) . '::' .
-                    $this->callback[1];
-            } else {
-                $callback = $this->callback;
-            }
-            return sprintf('[%s: message="%s" code=%d mode=callback '.
-                           'callback=%s prefix="%s" info="%s"]',
-                           strtolower(get_class($this)), $this->message, $this->code,
-                           $callback, $this->error_message_prefix,
-                           $this->userinfo);
-        }
-        if ($this->mode & PEAR_ERROR_PRINT) {
-            $modes[] = 'print';
-        }
-        if ($this->mode & PEAR_ERROR_TRIGGER) {
-            $modes[] = 'trigger';
-        }
-        if ($this->mode & PEAR_ERROR_DIE) {
-            $modes[] = 'die';
-        }
-        if ($this->mode & PEAR_ERROR_RETURN) {
-            $modes[] = 'return';
-        }
-        return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
-                       'prefix="%s" info="%s"]',
-                       strtolower(get_class($this)), $this->message, $this->code,
-                       implode("|", $modes), $levels[$this->level],
-                       $this->error_message_prefix,
-                       $this->userinfo);
-    }
-
-    // }}}
-}
-
-/*
- * Local Variables:
- * mode: php
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- */
-?>
+<?php\r
+/**\r
+ * PEAR, the PHP Extension and Application Repository\r
+ *\r
+ * PEAR class and PEAR_Error class\r
+ *\r
+ * PHP versions 4 and 5\r
+ *\r
+ * LICENSE: This source file is subject to version 3.0 of the PHP license\r
+ * that is available through the world-wide-web at the following URI:\r
+ * http://www.php.net/license/3_0.txt.  If you did not receive a copy of\r
+ * the PHP License and are unable to obtain it through the web, please\r
+ * send a note to license@php.net so we can mail you a copy immediately.\r
+ *\r
+ * @category   pear\r
+ * @package    PEAR\r
+ * @author     Sterling Hughes <sterling@php.net>\r
+ * @author     Stig Bakken <ssb@php.net>\r
+ * @author     Tomas V.V.Cox <cox@idecnet.com>\r
+ * @author     Greg Beaver <cellog@php.net>\r
+ * @copyright  1997-2006 The PHP Group\r
+ * @license    http://www.php.net/license/3_0.txt  PHP License 3.0\r
+ * @version    CVS: $Id: PEAR.php,v 1.7 2006/09/29 14:44:16 hsur Exp $\r
+ * @link       http://pear.php.net/package/PEAR\r
+ * @since      File available since Release 0.1\r
+ */\r
+\r
+/**#@+\r
+ * ERROR constants\r
+ */\r
+define('PEAR_ERROR_RETURN',     1);\r
+define('PEAR_ERROR_PRINT',      2);\r
+define('PEAR_ERROR_TRIGGER',    4);\r
+define('PEAR_ERROR_DIE',        8);\r
+define('PEAR_ERROR_CALLBACK',  16);\r
+/**\r
+ * WARNING: obsolete\r
+ * @deprecated\r
+ */\r
+define('PEAR_ERROR_EXCEPTION', 32);\r
+/**#@-*/\r
+define('PEAR_ZE2', (function_exists('version_compare') &&\r
+                    version_compare(zend_version(), "2-dev", "ge")));\r
+\r
+if (substr(PHP_OS, 0, 3) == 'WIN') {\r
+    define('OS_WINDOWS', true);\r
+    define('OS_UNIX',    false);\r
+    define('PEAR_OS',    'Windows');\r
+} else {\r
+    define('OS_WINDOWS', false);\r
+    define('OS_UNIX',    true);\r
+    define('PEAR_OS',    'Unix'); // blatant assumption\r
+}\r
+\r
+// instant backwards compatibility\r
+if (!defined('PATH_SEPARATOR')) {\r
+    if (OS_WINDOWS) {\r
+        define('PATH_SEPARATOR', ';');\r
+    } else {\r
+        define('PATH_SEPARATOR', ':');\r
+    }\r
+}\r
+\r
+$GLOBALS['_PEAR_default_error_mode']     = PEAR_ERROR_RETURN;\r
+$GLOBALS['_PEAR_default_error_options']  = E_USER_NOTICE;\r
+$GLOBALS['_PEAR_destructor_object_list'] = array();\r
+$GLOBALS['_PEAR_shutdown_funcs']         = array();\r
+$GLOBALS['_PEAR_error_handler_stack']    = array();\r
+\r
+@ini_set('track_errors', true);\r
+\r
+/**\r
+ * Base class for other PEAR classes.  Provides rudimentary\r
+ * emulation of destructors.\r
+ *\r
+ * If you want a destructor in your class, inherit PEAR and make a\r
+ * destructor method called _yourclassname (same name as the\r
+ * constructor, but with a "_" prefix).  Also, in your constructor you\r
+ * have to call the PEAR constructor: $this->PEAR();.\r
+ * The destructor method will be called without parameters.  Note that\r
+ * at in some SAPI implementations (such as Apache), any output during\r
+ * the request shutdown (in which destructors are called) seems to be\r
+ * discarded.  If you need to get any debug information from your\r
+ * destructor, use error_log(), syslog() or something similar.\r
+ *\r
+ * IMPORTANT! To use the emulated destructors you need to create the\r
+ * objects by reference: $obj =& new PEAR_child;\r
+ *\r
+ * @category   pear\r
+ * @package    PEAR\r
+ * @author     Stig Bakken <ssb@php.net>\r
+ * @author     Tomas V.V. Cox <cox@idecnet.com>\r
+ * @author     Greg Beaver <cellog@php.net>\r
+ * @copyright  1997-2006 The PHP Group\r
+ * @license    http://www.php.net/license/3_0.txt  PHP License 3.0\r
+ * @version    Release: 1.4.9\r
+ * @link       http://pear.php.net/package/PEAR\r
+ * @see        PEAR_Error\r
+ * @since      Class available since PHP 4.0.2\r
+ * @link        http://pear.php.net/manual/en/core.pear.php#core.pear.pear\r
+ */\r
+class PEAR\r
+{\r
+    // {{{ properties\r
+\r
+    /**\r
+     * Whether to enable internal debug messages.\r
+     *\r
+     * @var     bool\r
+     * @access  private\r
+     */\r
+    var $_debug = false;\r
+\r
+    /**\r
+     * Default error mode for this object.\r
+     *\r
+     * @var     int\r
+     * @access  private\r
+     */\r
+    var $_default_error_mode = null;\r
+\r
+    /**\r
+     * Default error options used for this object when error mode\r
+     * is PEAR_ERROR_TRIGGER.\r
+     *\r
+     * @var     int\r
+     * @access  private\r
+     */\r
+    var $_default_error_options = null;\r
+\r
+    /**\r
+     * Default error handler (callback) for this object, if error mode is\r
+     * PEAR_ERROR_CALLBACK.\r
+     *\r
+     * @var     string\r
+     * @access  private\r
+     */\r
+    var $_default_error_handler = '';\r
+\r
+    /**\r
+     * Which class to use for error objects.\r
+     *\r
+     * @var     string\r
+     * @access  private\r
+     */\r
+    var $_error_class = 'PEAR_Error';\r
+\r
+    /**\r
+     * An array of expected errors.\r
+     *\r
+     * @var     array\r
+     * @access  private\r
+     */\r
+    var $_expected_errors = array();\r
+\r
+    // }}}\r
+\r
+    // {{{ constructor\r
+\r
+    /**\r
+     * Constructor.  Registers this object in\r
+     * $_PEAR_destructor_object_list for destructor emulation if a\r
+     * destructor object exists.\r
+     *\r
+     * @param string $error_class  (optional) which class to use for\r
+     *        error objects, defaults to PEAR_Error.\r
+     * @access public\r
+     * @return void\r
+     */\r
+    function PEAR($error_class = null)\r
+    {\r
+        $classname = strtolower(get_class($this));\r
+        if ($this->_debug) {\r
+            print "PEAR constructor called, class=$classname\n";\r
+        }\r
+        if ($error_class !== null) {\r
+            $this->_error_class = $error_class;\r
+        }\r
+        while ($classname && strcasecmp($classname, "pear")) {\r
+            $destructor = "_$classname";\r
+            if (method_exists($this, $destructor)) {\r
+                global $_PEAR_destructor_object_list;\r
+                $_PEAR_destructor_object_list[] = &$this;\r
+                if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {\r
+                    register_shutdown_function("_PEAR_call_destructors");\r
+                    $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;\r
+                }\r
+                break;\r
+            } else {\r
+                $classname = get_parent_class($classname);\r
+            }\r
+        }\r
+    }\r
+\r
+    // }}}\r
+    // {{{ destructor\r
+\r
+    /**\r
+     * Destructor (the emulated type of...).  Does nothing right now,\r
+     * but is included for forward compatibility, so subclass\r
+     * destructors should always call it.\r
+     *\r
+     * See the note in the class desciption about output from\r
+     * destructors.\r
+     *\r
+     * @access public\r
+     * @return void\r
+     */\r
+    function _PEAR() {\r
+        if ($this->_debug) {\r
+            printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));\r
+        }\r
+    }\r
+\r
+    // }}}\r
+    // {{{ getStaticProperty()\r
+\r
+    /**\r
+    * If you have a class that's mostly/entirely static, and you need static\r
+    * properties, you can use this method to simulate them. Eg. in your method(s)\r
+    * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');\r
+    * You MUST use a reference, or they will not persist!\r
+    *\r
+    * @access public\r
+    * @param  string $class  The calling classname, to prevent clashes\r
+    * @param  string $var    The variable to retrieve.\r
+    * @return mixed   A reference to the variable. If not set it will be\r
+    *                 auto initialised to NULL.\r
+    */\r
+    function &getStaticProperty($class, $var)\r
+    {\r
+        static $properties;\r
+        return $properties[$class][$var];\r
+    }\r
+\r
+    // }}}\r
+    // {{{ registerShutdownFunc()\r
+\r
+    /**\r
+    * Use this function to register a shutdown method for static\r
+    * classes.\r
+    *\r
+    * @access public\r
+    * @param  mixed $func  The function name (or array of class/method) to call\r
+    * @param  mixed $args  The arguments to pass to the function\r
+    * @return void\r
+    */\r
+    function registerShutdownFunc($func, $args = array())\r
+    {\r
+        // if we are called statically, there is a potential\r
+        // that no shutdown func is registered.  Bug #6445\r
+        if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {\r
+            register_shutdown_function("_PEAR_call_destructors");\r
+            $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;\r
+        }\r
+        $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);\r
+    }\r
+\r
+    // }}}\r
+    // {{{ isError()\r
+\r
+    /**\r
+     * Tell whether a value is a PEAR error.\r
+     *\r
+     * @param   mixed $data   the value to test\r
+     * @param   int   $code   if $data is an error object, return true\r
+     *                        only if $code is a string and\r
+     *                        $obj->getMessage() == $code or\r
+     *                        $code is an integer and $obj->getCode() == $code\r
+     * @access  public\r
+     * @return  bool    true if parameter is an error\r
+     */\r
+    function isError($data, $code = null)\r
+    {\r
+        if (is_a($data, 'PEAR_Error')) {\r
+            if (is_null($code)) {\r
+                return true;\r
+            } elseif (is_string($code)) {\r
+                return $data->getMessage() == $code;\r
+            } else {\r
+                return $data->getCode() == $code;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+\r
+    // }}}\r
+    // {{{ setErrorHandling()\r
+\r
+    /**\r
+     * Sets how errors generated by this object should be handled.\r
+     * Can be invoked both in objects and statically.  If called\r
+     * statically, setErrorHandling sets the default behaviour for all\r
+     * PEAR objects.  If called in an object, setErrorHandling sets\r
+     * the default behaviour for that object.\r
+     *\r
+     * @param int $mode\r
+     *        One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,\r
+     *        PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,\r
+     *        PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.\r
+     *\r
+     * @param mixed $options\r
+     *        When $mode is PEAR_ERROR_TRIGGER, this is the error level (one\r
+     *        of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).\r
+     *\r
+     *        When $mode is PEAR_ERROR_CALLBACK, this parameter is expected\r
+     *        to be the callback function or method.  A callback\r
+     *        function is a string with the name of the function, a\r
+     *        callback method is an array of two elements: the element\r
+     *        at index 0 is the object, and the element at index 1 is\r
+     *        the name of the method to call in the object.\r
+     *\r
+     *        When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is\r
+     *        a printf format string used when printing the error\r
+     *        message.\r
+     *\r
+     * @access public\r
+     * @return void\r
+     * @see PEAR_ERROR_RETURN\r
+     * @see PEAR_ERROR_PRINT\r
+     * @see PEAR_ERROR_TRIGGER\r
+     * @see PEAR_ERROR_DIE\r
+     * @see PEAR_ERROR_CALLBACK\r
+     * @see PEAR_ERROR_EXCEPTION\r
+     *\r
+     * @since PHP 4.0.5\r
+     */\r
+\r
+    function setErrorHandling($mode = null, $options = null)\r
+    {\r
+        if (isset($this) && is_a($this, 'PEAR')) {\r
+            $setmode     = &$this->_default_error_mode;\r
+            $setoptions  = &$this->_default_error_options;\r
+        } else {\r
+            $setmode     = &$GLOBALS['_PEAR_default_error_mode'];\r
+            $setoptions  = &$GLOBALS['_PEAR_default_error_options'];\r
+        }\r
+\r
+        switch ($mode) {\r
+            case PEAR_ERROR_EXCEPTION:\r
+            case PEAR_ERROR_RETURN:\r
+            case PEAR_ERROR_PRINT:\r
+            case PEAR_ERROR_TRIGGER:\r
+            case PEAR_ERROR_DIE:\r
+            case null:\r
+                $setmode = $mode;\r
+                $setoptions = $options;\r
+                break;\r
+\r
+            case PEAR_ERROR_CALLBACK:\r
+                $setmode = $mode;\r
+                // class/object method callback\r
+                if (is_callable($options)) {\r
+                    $setoptions = $options;\r
+                } else {\r
+                    trigger_error("invalid error callback", E_USER_WARNING);\r
+                }\r
+                break;\r
+\r
+            default:\r
+                trigger_error("invalid error mode", E_USER_WARNING);\r
+                break;\r
+        }\r
+    }\r
+\r
+    // }}}\r
+    // {{{ expectError()\r
+\r
+    /**\r
+     * This method is used to tell which errors you expect to get.\r
+     * Expected errors are always returned with error mode\r
+     * PEAR_ERROR_RETURN.  Expected error codes are stored in a stack,\r
+     * and this method pushes a new element onto it.  The list of\r
+     * expected errors are in effect until they are popped off the\r
+     * stack with the popExpect() method.\r
+     *\r
+     * Note that this method can not be called statically\r
+     *\r
+     * @param mixed $code a single error code or an array of error codes to expect\r
+     *\r
+     * @return int     the new depth of the "expected errors" stack\r
+     * @access public\r
+     */\r
+    function expectError($code = '*')\r
+    {\r
+        if (is_array($code)) {\r
+            array_push($this->_expected_errors, $code);\r
+        } else {\r
+            array_push($this->_expected_errors, array($code));\r
+        }\r
+        return sizeof($this->_expected_errors);\r
+    }\r
+\r
+    // }}}\r
+    // {{{ popExpect()\r
+\r
+    /**\r
+     * This method pops one element off the expected error codes\r
+     * stack.\r
+     *\r
+     * @return array   the list of error codes that were popped\r
+     */\r
+    function popExpect()\r
+    {\r
+        return array_pop($this->_expected_errors);\r
+    }\r
+\r
+    // }}}\r
+    // {{{ _checkDelExpect()\r
+\r
+    /**\r
+     * This method checks unsets an error code if available\r
+     *\r
+     * @param mixed error code\r
+     * @return bool true if the error code was unset, false otherwise\r
+     * @access private\r
+     * @since PHP 4.3.0\r
+     */\r
+    function _checkDelExpect($error_code)\r
+    {\r
+        $deleted = false;\r
+\r
+        foreach ($this->_expected_errors AS $key => $error_array) {\r
+            if (in_array($error_code, $error_array)) {\r
+                unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);\r
+                $deleted = true;\r
+            }\r
+\r
+            // clean up empty arrays\r
+            if (0 == count($this->_expected_errors[$key])) {\r
+                unset($this->_expected_errors[$key]);\r
+            }\r
+        }\r
+        return $deleted;\r
+    }\r
+\r
+    // }}}\r
+    // {{{ delExpect()\r
+\r
+    /**\r
+     * This method deletes all occurences of the specified element from\r
+     * the expected error codes stack.\r
+     *\r
+     * @param  mixed $error_code error code that should be deleted\r
+     * @return mixed list of error codes that were deleted or error\r
+     * @access public\r
+     * @since PHP 4.3.0\r
+     */\r
+    function delExpect($error_code)\r
+    {\r
+        $deleted = false;\r
+\r
+        if ((is_array($error_code) && (0 != count($error_code)))) {\r
+            // $error_code is a non-empty array here;\r
+            // we walk through it trying to unset all\r
+            // values\r
+            foreach($error_code as $key => $error) {\r
+                if ($this->_checkDelExpect($error)) {\r
+                    $deleted =  true;\r
+                } else {\r
+                    $deleted = false;\r
+                }\r
+            }\r
+            return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME\r
+        } elseif (!empty($error_code)) {\r
+            // $error_code comes alone, trying to unset it\r
+            if ($this->_checkDelExpect($error_code)) {\r
+                return true;\r
+            } else {\r
+                return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME\r
+            }\r
+        } else {\r
+            // $error_code is empty\r
+            return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME\r
+        }\r
+    }\r
+\r
+    // }}}\r
+    // {{{ raiseError()\r
+\r
+    /**\r
+     * This method is a wrapper that returns an instance of the\r
+     * configured error class with this object's default error\r
+     * handling applied.  If the $mode and $options parameters are not\r
+     * specified, the object's defaults are used.\r
+     *\r
+     * @param mixed $message a text error message or a PEAR error object\r
+     *\r
+     * @param int $code      a numeric error code (it is up to your class\r
+     *                  to define these if you want to use codes)\r
+     *\r
+     * @param int $mode      One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,\r
+     *                  PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,\r
+     *                  PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.\r
+     *\r
+     * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter\r
+     *                  specifies the PHP-internal error level (one of\r
+     *                  E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).\r
+     *                  If $mode is PEAR_ERROR_CALLBACK, this\r
+     *                  parameter specifies the callback function or\r
+     *                  method.  In other error modes this parameter\r
+     *                  is ignored.\r
+     *\r
+     * @param string $userinfo If you need to pass along for example debug\r
+     *                  information, this parameter is meant for that.\r
+     *\r
+     * @param string $error_class The returned error object will be\r
+     *                  instantiated from this class, if specified.\r
+     *\r
+     * @param bool $skipmsg If true, raiseError will only pass error codes,\r
+     *                  the error message parameter will be dropped.\r
+     *\r
+     * @access public\r
+     * @return object   a PEAR error object\r
+     * @see PEAR::setErrorHandling\r
+     * @since PHP 4.0.5\r
+     */\r
+    function &raiseError($message = null,\r
+                         $code = null,\r
+                         $mode = null,\r
+                         $options = null,\r
+                         $userinfo = null,\r
+                         $error_class = null,\r
+                         $skipmsg = false)\r
+    {\r
+        // The error is yet a PEAR error object\r
+        if (is_object($message)) {\r
+            $code        = $message->getCode();\r
+            $userinfo    = $message->getUserInfo();\r
+            $error_class = $message->getType();\r
+            $message->error_message_prefix = '';\r
+            $message     = $message->getMessage();\r
+        }\r
+\r
+        if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) {\r
+            if ($exp[0] == "*" ||\r
+                (is_int(reset($exp)) && in_array($code, $exp)) ||\r
+                (is_string(reset($exp)) && in_array($message, $exp))) {\r
+                $mode = PEAR_ERROR_RETURN;\r
+            }\r
+        }\r
+        // No mode given, try global ones\r
+        if ($mode === null) {\r
+            // Class error handler\r
+            if (isset($this) && isset($this->_default_error_mode)) {\r
+                $mode    = $this->_default_error_mode;\r
+                $options = $this->_default_error_options;\r
+            // Global error handler\r
+            } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {\r
+                $mode    = $GLOBALS['_PEAR_default_error_mode'];\r
+                $options = $GLOBALS['_PEAR_default_error_options'];\r
+            }\r
+        }\r
+\r
+        if ($error_class !== null) {\r
+            $ec = $error_class;\r
+        } elseif (isset($this) && isset($this->_error_class)) {\r
+            $ec = $this->_error_class;\r
+        } else {\r
+            $ec = 'PEAR_Error';\r
+        }\r
+        if ($skipmsg) {\r
+            $a = &new $ec($code, $mode, $options, $userinfo);\r
+            return $a;\r
+        } else {\r
+            $a = &new $ec($message, $code, $mode, $options, $userinfo);\r
+            return $a;\r
+        }\r
+    }\r
+\r
+    // }}}\r
+    // {{{ throwError()\r
+\r
+    /**\r
+     * Simpler form of raiseError with fewer options.  In most cases\r
+     * message, code and userinfo are enough.\r
+     *\r
+     * @param string $message\r
+     *\r
+     */\r
+    function &throwError($message = null,\r
+                         $code = null,\r
+                         $userinfo = null)\r
+    {\r
+        if (isset($this) && is_a($this, 'PEAR')) {\r
+            $a = &$this->raiseError($message, $code, null, null, $userinfo);\r
+            return $a;\r
+        } else {\r
+            $a = &PEAR::raiseError($message, $code, null, null, $userinfo);\r
+            return $a;\r
+        }\r
+    }\r
+\r
+    // }}}\r
+    function staticPushErrorHandling($mode, $options = null)\r
+    {\r
+        $stack = &$GLOBALS['_PEAR_error_handler_stack'];\r
+        $def_mode    = &$GLOBALS['_PEAR_default_error_mode'];\r
+        $def_options = &$GLOBALS['_PEAR_default_error_options'];\r
+        $stack[] = array($def_mode, $def_options);\r
+        switch ($mode) {\r
+            case PEAR_ERROR_EXCEPTION:\r
+            case PEAR_ERROR_RETURN:\r
+            case PEAR_ERROR_PRINT:\r
+            case PEAR_ERROR_TRIGGER:\r
+            case PEAR_ERROR_DIE:\r
+            case null:\r
+                $def_mode = $mode;\r
+                $def_options = $options;\r
+                break;\r
+\r
+            case PEAR_ERROR_CALLBACK:\r
+                $def_mode = $mode;\r
+                // class/object method callback\r
+                if (is_callable($options)) {\r
+                    $def_options = $options;\r
+                } else {\r
+                    trigger_error("invalid error callback", E_USER_WARNING);\r
+                }\r
+                break;\r
+\r
+            default:\r
+                trigger_error("invalid error mode", E_USER_WARNING);\r
+                break;\r
+        }\r
+        $stack[] = array($mode, $options);\r
+        return true;\r
+    }\r
+\r
+    function staticPopErrorHandling()\r
+    {\r
+        $stack = &$GLOBALS['_PEAR_error_handler_stack'];\r
+        $setmode     = &$GLOBALS['_PEAR_default_error_mode'];\r
+        $setoptions  = &$GLOBALS['_PEAR_default_error_options'];\r
+        array_pop($stack);\r
+        list($mode, $options) = $stack[sizeof($stack) - 1];\r
+        array_pop($stack);\r
+        switch ($mode) {\r
+            case PEAR_ERROR_EXCEPTION:\r
+            case PEAR_ERROR_RETURN:\r
+            case PEAR_ERROR_PRINT:\r
+            case PEAR_ERROR_TRIGGER:\r
+            case PEAR_ERROR_DIE:\r
+            case null:\r
+                $setmode = $mode;\r
+                $setoptions = $options;\r
+                break;\r
+\r
+            case PEAR_ERROR_CALLBACK:\r
+                $setmode = $mode;\r
+                // class/object method callback\r
+                if (is_callable($options)) {\r
+                    $setoptions = $options;\r
+                } else {\r
+                    trigger_error("invalid error callback", E_USER_WARNING);\r
+                }\r
+                break;\r
+\r
+            default:\r
+                trigger_error("invalid error mode", E_USER_WARNING);\r
+                break;\r
+        }\r
+        return true;\r
+    }\r
+\r
+    // {{{ pushErrorHandling()\r
+\r
+    /**\r
+     * Push a new error handler on top of the error handler options stack. With this\r
+     * you can easily override the actual error handler for some code and restore\r
+     * it later with popErrorHandling.\r
+     *\r
+     * @param mixed $mode (same as setErrorHandling)\r
+     * @param mixed $options (same as setErrorHandling)\r
+     *\r
+     * @return bool Always true\r
+     *\r
+     * @see PEAR::setErrorHandling\r
+     */\r
+    function pushErrorHandling($mode, $options = null)\r
+    {\r
+        $stack = &$GLOBALS['_PEAR_error_handler_stack'];\r
+        if (isset($this) && is_a($this, 'PEAR')) {\r
+            $def_mode    = &$this->_default_error_mode;\r
+            $def_options = &$this->_default_error_options;\r
+        } else {\r
+            $def_mode    = &$GLOBALS['_PEAR_default_error_mode'];\r
+            $def_options = &$GLOBALS['_PEAR_default_error_options'];\r
+        }\r
+        $stack[] = array($def_mode, $def_options);\r
+\r
+        if (isset($this) && is_a($this, 'PEAR')) {\r
+            $this->setErrorHandling($mode, $options);\r
+        } else {\r
+            PEAR::setErrorHandling($mode, $options);\r
+        }\r
+        $stack[] = array($mode, $options);\r
+        return true;\r
+    }\r
+\r
+    // }}}\r
+    // {{{ popErrorHandling()\r
+\r
+    /**\r
+    * Pop the last error handler used\r
+    *\r
+    * @return bool Always true\r
+    *\r
+    * @see PEAR::pushErrorHandling\r
+    */\r
+    function popErrorHandling()\r
+    {\r
+        $stack = &$GLOBALS['_PEAR_error_handler_stack'];\r
+        array_pop($stack);\r
+        list($mode, $options) = $stack[sizeof($stack) - 1];\r
+        array_pop($stack);\r
+        if (isset($this) && is_a($this, 'PEAR')) {\r
+            $this->setErrorHandling($mode, $options);\r
+        } else {\r
+            PEAR::setErrorHandling($mode, $options);\r
+        }\r
+        return true;\r
+    }\r
+\r
+    // }}}\r
+    // {{{ loadExtension()\r
+\r
+    /**\r
+    * OS independant PHP extension load. Remember to take care\r
+    * on the correct extension name for case sensitive OSes.\r
+    *\r
+    * @param string $ext The extension name\r
+    * @return bool Success or not on the dl() call\r
+    */\r
+    function loadExtension($ext)\r
+    {\r
+        if (!extension_loaded($ext)) {\r
+            // if either returns true dl() will produce a FATAL error, stop that\r
+            if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) {\r
+                return false;\r
+            }\r
+            if (OS_WINDOWS) {\r
+                $suffix = '.dll';\r
+            } elseif (PHP_OS == 'HP-UX') {\r
+                $suffix = '.sl';\r
+            } elseif (PHP_OS == 'AIX') {\r
+                $suffix = '.a';\r
+            } elseif (PHP_OS == 'OSX') {\r
+                $suffix = '.bundle';\r
+            } else {\r
+                $suffix = '.so';\r
+            }\r
+            return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);\r
+        }\r
+        return true;\r
+    }\r
+\r
+    // }}}\r
+}\r
+\r
+// {{{ _PEAR_call_destructors()\r
+\r
+function _PEAR_call_destructors()\r
+{\r
+    global $_PEAR_destructor_object_list;\r
+    if (is_array($_PEAR_destructor_object_list) &&\r
+        sizeof($_PEAR_destructor_object_list))\r
+    {\r
+        reset($_PEAR_destructor_object_list);\r
+        if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) {\r
+            $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);\r
+        }\r
+        while (list($k, $objref) = each($_PEAR_destructor_object_list)) {\r
+            $classname = get_class($objref);\r
+            while ($classname) {\r
+                $destructor = "_$classname";\r
+                if (method_exists($objref, $destructor)) {\r
+                    $objref->$destructor();\r
+                    break;\r
+                } else {\r
+                    $classname = get_parent_class($classname);\r
+                }\r
+            }\r
+        }\r
+        // Empty the object list to ensure that destructors are\r
+        // not called more than once.\r
+        $_PEAR_destructor_object_list = array();\r
+    }\r
+\r
+    // Now call the shutdown functions\r
+    if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) {\r
+        foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {\r
+            call_user_func_array($value[0], $value[1]);\r
+        }\r
+    }\r
+}\r
+\r
+// }}}\r
+/**\r
+ * Standard PEAR error class for PHP 4\r
+ *\r
+ * This class is supserseded by {@link PEAR_Exception} in PHP 5\r
+ *\r
+ * @category   pear\r
+ * @package    PEAR\r
+ * @author     Stig Bakken <ssb@php.net>\r
+ * @author     Tomas V.V. Cox <cox@idecnet.com>\r
+ * @author     Gregory Beaver <cellog@php.net>\r
+ * @copyright  1997-2006 The PHP Group\r
+ * @license    http://www.php.net/license/3_0.txt  PHP License 3.0\r
+ * @version    Release: 1.4.9\r
+ * @link       http://pear.php.net/manual/en/core.pear.pear-error.php\r
+ * @see        PEAR::raiseError(), PEAR::throwError()\r
+ * @since      Class available since PHP 4.0.2\r
+ */\r
+class PEAR_Error\r
+{\r
+    // {{{ properties\r
+\r
+    var $error_message_prefix = '';\r
+    var $mode                 = PEAR_ERROR_RETURN;\r
+    var $level                = E_USER_NOTICE;\r
+    var $code                 = -1;\r
+    var $message              = '';\r
+    var $userinfo             = '';\r
+    var $backtrace            = null;\r
+\r
+    // }}}\r
+    // {{{ constructor\r
+\r
+    /**\r
+     * PEAR_Error constructor\r
+     *\r
+     * @param string $message  message\r
+     *\r
+     * @param int $code     (optional) error code\r
+     *\r
+     * @param int $mode     (optional) error mode, one of: PEAR_ERROR_RETURN,\r
+     * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,\r
+     * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION\r
+     *\r
+     * @param mixed $options   (optional) error level, _OR_ in the case of\r
+     * PEAR_ERROR_CALLBACK, the callback function or object/method\r
+     * tuple.\r
+     *\r
+     * @param string $userinfo (optional) additional user/debug info\r
+     *\r
+     * @access public\r
+     *\r
+     */\r
+    function PEAR_Error($message = 'unknown error', $code = null,\r
+                        $mode = null, $options = null, $userinfo = null)\r
+    {\r
+        if ($mode === null) {\r
+            $mode = PEAR_ERROR_RETURN;\r
+        }\r
+        $this->message   = $message;\r
+        $this->code      = $code;\r
+        $this->mode      = $mode;\r
+        $this->userinfo  = $userinfo;\r
+        if (function_exists("debug_backtrace")) {\r
+            if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) {\r
+                $this->backtrace = debug_backtrace();\r
+            }\r
+        }\r
+        if ($mode & PEAR_ERROR_CALLBACK) {\r
+            $this->level = E_USER_NOTICE;\r
+            $this->callback = $options;\r
+        } else {\r
+            if ($options === null) {\r
+                $options = E_USER_NOTICE;\r
+            }\r
+            $this->level = $options;\r
+            $this->callback = null;\r
+        }\r
+        if ($this->mode & PEAR_ERROR_PRINT) {\r
+            if (is_null($options) || is_int($options)) {\r
+                $format = "%s";\r
+            } else {\r
+                $format = $options;\r
+            }\r
+            printf($format, $this->getMessage());\r
+        }\r
+        if ($this->mode & PEAR_ERROR_TRIGGER) {\r
+            trigger_error($this->getMessage(), $this->level);\r
+        }\r
+        if ($this->mode & PEAR_ERROR_DIE) {\r
+            $msg = $this->getMessage();\r
+            if (is_null($options) || is_int($options)) {\r
+                $format = "%s";\r
+                if (substr($msg, -1) != "\n") {\r
+                    $msg .= "\n";\r
+                }\r
+            } else {\r
+                $format = $options;\r
+            }\r
+            die(sprintf($format, $msg));\r
+        }\r
+        if ($this->mode & PEAR_ERROR_CALLBACK) {\r
+            if (is_callable($this->callback)) {\r
+                call_user_func($this->callback, $this);\r
+            }\r
+        }\r
+        if ($this->mode & PEAR_ERROR_EXCEPTION) {\r
+            trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);\r
+            eval('$e = new Exception($this->message, $this->code);throw($e);');\r
+        }\r
+    }\r
+\r
+    // }}}\r
+    // {{{ getMode()\r
+\r
+    /**\r
+     * Get the error mode from an error object.\r
+     *\r
+     * @return int error mode\r
+     * @access public\r
+     */\r
+    function getMode() {\r
+        return $this->mode;\r
+    }\r
+\r
+    // }}}\r
+    // {{{ getCallback()\r
+\r
+    /**\r
+     * Get the callback function/method from an error object.\r
+     *\r
+     * @return mixed callback function or object/method array\r
+     * @access public\r
+     */\r
+    function getCallback() {\r
+        return $this->callback;\r
+    }\r
+\r
+    // }}}\r
+    // {{{ getMessage()\r
+\r
+\r
+    /**\r
+     * Get the error message from an error object.\r
+     *\r
+     * @return  string  full error message\r
+     * @access public\r
+     */\r
+    function getMessage()\r
+    {\r
+        return ($this->error_message_prefix . $this->message);\r
+    }\r
+\r
+\r
+    // }}}\r
+    // {{{ getCode()\r
+\r
+    /**\r
+     * Get error code from an error object\r
+     *\r
+     * @return int error code\r
+     * @access public\r
+     */\r
+     function getCode()\r
+     {\r
+        return $this->code;\r
+     }\r
+\r
+    // }}}\r
+    // {{{ getType()\r
+\r
+    /**\r
+     * Get the name of this error/exception.\r
+     *\r
+     * @return string error/exception name (type)\r
+     * @access public\r
+     */\r
+    function getType()\r
+    {\r
+        return get_class($this);\r
+    }\r
+\r
+    // }}}\r
+    // {{{ getUserInfo()\r
+\r
+    /**\r
+     * Get additional user-supplied information.\r
+     *\r
+     * @return string user-supplied information\r
+     * @access public\r
+     */\r
+    function getUserInfo()\r
+    {\r
+        return $this->userinfo;\r
+    }\r
+\r
+    // }}}\r
+    // {{{ getDebugInfo()\r
+\r
+    /**\r
+     * Get additional debug information supplied by the application.\r
+     *\r
+     * @return string debug information\r
+     * @access public\r
+     */\r
+    function getDebugInfo()\r
+    {\r
+        return $this->getUserInfo();\r
+    }\r
+\r
+    // }}}\r
+    // {{{ getBacktrace()\r
+\r
+    /**\r
+     * Get the call backtrace from where the error was generated.\r
+     * Supported with PHP 4.3.0 or newer.\r
+     *\r
+     * @param int $frame (optional) what frame to fetch\r
+     * @return array Backtrace, or NULL if not available.\r
+     * @access public\r
+     */\r
+    function getBacktrace($frame = null)\r
+    {\r
+        if (defined('PEAR_IGNORE_BACKTRACE')) {\r
+            return null;\r
+        }\r
+        if ($frame === null) {\r
+            return $this->backtrace;\r
+        }\r
+        return $this->backtrace[$frame];\r
+    }\r
+\r
+    // }}}\r
+    // {{{ addUserInfo()\r
+\r
+    function addUserInfo($info)\r
+    {\r
+        if (empty($this->userinfo)) {\r
+            $this->userinfo = $info;\r
+        } else {\r
+            $this->userinfo .= " ** $info";\r
+        }\r
+    }\r
+\r
+    // }}}\r
+    // {{{ toString()\r
+\r
+    /**\r
+     * Make a string representation of this object.\r
+     *\r
+     * @return string a string with an object summary\r
+     * @access public\r
+     */\r
+    function toString() {\r
+        $modes = array();\r
+        $levels = array(E_USER_NOTICE  => 'notice',\r
+                        E_USER_WARNING => 'warning',\r
+                        E_USER_ERROR   => 'error');\r
+        if ($this->mode & PEAR_ERROR_CALLBACK) {\r
+            if (is_array($this->callback)) {\r
+                $callback = (is_object($this->callback[0]) ?\r
+                    strtolower(get_class($this->callback[0])) :\r
+                    $this->callback[0]) . '::' .\r
+                    $this->callback[1];\r
+            } else {\r
+                $callback = $this->callback;\r
+            }\r
+            return sprintf('[%s: message="%s" code=%d mode=callback '.\r
+                           'callback=%s prefix="%s" info="%s"]',\r
+                           strtolower(get_class($this)), $this->message, $this->code,\r
+                           $callback, $this->error_message_prefix,\r
+                           $this->userinfo);\r
+        }\r
+        if ($this->mode & PEAR_ERROR_PRINT) {\r
+            $modes[] = 'print';\r
+        }\r
+        if ($this->mode & PEAR_ERROR_TRIGGER) {\r
+            $modes[] = 'trigger';\r
+        }\r
+        if ($this->mode & PEAR_ERROR_DIE) {\r
+            $modes[] = 'die';\r
+        }\r
+        if ($this->mode & PEAR_ERROR_RETURN) {\r
+            $modes[] = 'return';\r
+        }\r
+        return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.\r
+                       'prefix="%s" info="%s"]',\r
+                       strtolower(get_class($this)), $this->message, $this->code,\r
+                       implode("|", $modes), $levels[$this->level],\r
+                       $this->error_message_prefix,\r
+                       $this->userinfo);\r
+    }\r
+\r
+    // }}}\r
+}\r
+\r
+/*\r
+ * Local Variables:\r
+ * mode: php\r
+ * tab-width: 4\r
+ * c-basic-offset: 4\r
+ * End:\r
+ */\r
+?>\r