changeset 56:664de2e68b78

now symlinked
author Charlie Root
date Wed, 08 Oct 2025 09:31:51 -0400
parents 2bf0fc326ee2
children ade98a608cd3
files vendor/pear/pear-core-minimal/src/OS/Guess.php vendor/pear/pear-core-minimal/src/PEAR/Error.php vendor/pear/pear-core-minimal/src/PEAR/ErrorStack.php
diffstat 3 files changed, 0 insertions(+), 1330 deletions(-) [+]
line wrap: on
line diff
--- a/vendor/pear/pear-core-minimal/src/OS/Guess.php	Wed Oct 08 09:09:32 2025 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,337 +0,0 @@
-<?php
-/**
- * The OS_Guess class
- *
- * PHP versions 4 and 5
- *
- * @category   pear
- * @package    PEAR
- * @author     Stig Bakken <ssb@php.net>
- * @author     Gregory Beaver <cellog@php.net>
- * @copyright  1997-2009 The Authors
- * @license    http://opensource.org/licenses/bsd-license.php New BSD License
- * @link       http://pear.php.net/package/PEAR
- * @since      File available since PEAR 0.1
- */
-
-// {{{ uname examples
-
-// php_uname() without args returns the same as 'uname -a', or a PHP-custom
-// string for Windows.
-// PHP versions prior to 4.3 return the uname of the host where PHP was built,
-// as of 4.3 it returns the uname of the host running the PHP code.
-//
-// PC RedHat Linux 7.1:
-// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown
-//
-// PC Debian Potato:
-// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown
-//
-// PC FreeBSD 3.3:
-// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000     root@example.com:/usr/src/sys/compile/CONFIG  i386
-//
-// PC FreeBSD 4.3:
-// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001     root@example.com:/usr/src/sys/compile/CONFIG  i386
-//
-// PC FreeBSD 4.5:
-// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb  6 23:59:23 CET 2002     root@example.com:/usr/src/sys/compile/CONFIG  i386
-//
-// PC FreeBSD 4.5 w/uname from GNU shellutils:
-// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb  i386 unknown
-//
-// HP 9000/712 HP-UX 10:
-// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license
-//
-// HP 9000/712 HP-UX 10 w/uname from GNU shellutils:
-// HP-UX host B.10.10 A 9000/712 unknown
-//
-// IBM RS6000/550 AIX 4.3:
-// AIX host 3 4 000003531C00
-//
-// AIX 4.3 w/uname from GNU shellutils:
-// AIX host 3 4 000003531C00 unknown
-//
-// SGI Onyx IRIX 6.5 w/uname from GNU shellutils:
-// IRIX64 host 6.5 01091820 IP19 mips
-//
-// SGI Onyx IRIX 6.5:
-// IRIX64 host 6.5 01091820 IP19
-//
-// SparcStation 20 Solaris 8 w/uname from GNU shellutils:
-// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc
-//
-// SparcStation 20 Solaris 8:
-// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20
-//
-// Mac OS X (Darwin)
-// Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug  5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC  Power Macintosh
-//
-// Mac OS X early versions
-//
-
-// }}}
-
-/* TODO:
- * - define endianness, to allow matchSignature("bigend") etc.
- */
-
-/**
- * Retrieves information about the current operating system
- *
- * This class uses php_uname() to grok information about the current OS
- *
- * @category   pear
- * @package    PEAR
- * @author     Stig Bakken <ssb@php.net>
- * @author     Gregory Beaver <cellog@php.net>
- * @copyright  1997-2009 The Authors
- * @license    http://opensource.org/licenses/bsd-license.php New BSD License
- * @version    Release: @package_version@
- * @link       http://pear.php.net/package/PEAR
- * @since      Class available since Release 0.1
- */
-class OS_Guess
-{
-    var $sysname;
-    var $nodename;
-    var $cpu;
-    var $release;
-    var $extra;
-
-    function __construct($uname = null)
-    {
-        list($this->sysname,
-             $this->release,
-             $this->cpu,
-             $this->extra,
-             $this->nodename) = $this->parseSignature($uname);
-    }
-
-    function parseSignature($uname = null)
-    {
-        static $sysmap = array(
-            'HP-UX' => 'hpux',
-            'IRIX64' => 'irix',
-        );
-        static $cpumap = array(
-            'i586' => 'i386',
-            'i686' => 'i386',
-            'ppc' => 'powerpc',
-        );
-        if ($uname === null) {
-            $uname = php_uname();
-        }
-        $parts = preg_split('/\s+/', trim($uname));
-        $n = count($parts);
-
-        $release  = $machine = $cpu = '';
-        $sysname  = $parts[0];
-        $nodename = $parts[1];
-        $cpu      = $parts[$n-1];
-        $extra = '';
-        if ($cpu == 'unknown') {
-            $cpu = $parts[$n - 2];
-        }
-
-        switch ($sysname) {
-            case 'AIX' :
-                $release = "$parts[3].$parts[2]";
-                break;
-            case 'Windows' :
-                switch ($parts[1]) {
-                    case '95/98':
-                        $release = '9x';
-                        break;
-                    default:
-                        $release = $parts[1];
-                        break;
-                }
-                $cpu = 'i386';
-                break;
-            case 'Linux' :
-                $extra = $this->_detectGlibcVersion();
-                // use only the first two digits from the kernel version
-                $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
-                break;
-            case 'Mac' :
-                $sysname = 'darwin';
-                $nodename = $parts[2];
-                $release = $parts[3];
-                if ($cpu == 'Macintosh') {
-                    if ($parts[$n - 2] == 'Power') {
-                        $cpu = 'powerpc';
-                    }
-                }
-                break;
-            case 'Darwin' :
-                if ($cpu == 'Macintosh') {
-                    if ($parts[$n - 2] == 'Power') {
-                        $cpu = 'powerpc';
-                    }
-                }
-                $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
-                break;
-            default:
-                $release = preg_replace('/-.*/', '', $parts[2]);
-                break;
-        }
-
-        if (isset($sysmap[$sysname])) {
-            $sysname = $sysmap[$sysname];
-        } else {
-            $sysname = strtolower($sysname);
-        }
-        if (isset($cpumap[$cpu])) {
-            $cpu = $cpumap[$cpu];
-        }
-        return array($sysname, $release, $cpu, $extra, $nodename);
-    }
-
-    function _detectGlibcVersion()
-    {
-        static $glibc = false;
-        if ($glibc !== false) {
-            return $glibc; // no need to run this multiple times
-        }
-        $major = $minor = 0;
-        include_once "System.php";
-        // Use glibc's <features.h> header file to
-        // get major and minor version number:
-        if (@file_exists('/usr/include/features.h') &&
-              @is_readable('/usr/include/features.h')) {
-            if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
-                $features_file = fopen('/usr/include/features.h', 'rb');
-                while (!feof($features_file)) {
-                    $line = fgets($features_file, 8192);
-                    if (!$line || (strpos($line, '#define') === false)) {
-                        continue;
-                    }
-                    if (strpos($line, '__GLIBC__')) {
-                        // major version number #define __GLIBC__ version
-                        $line = preg_split('/\s+/', $line);
-                        $glibc_major = trim($line[2]);
-                        if (isset($glibc_minor)) {
-                            break;
-                        }
-                        continue;
-                    }
-
-                    if (strpos($line, '__GLIBC_MINOR__'))  {
-                        // got the minor version number
-                        // #define __GLIBC_MINOR__ version
-                        $line = preg_split('/\s+/', $line);
-                        $glibc_minor = trim($line[2]);
-                        if (isset($glibc_major)) {
-                            break;
-                        }
-                        continue;
-                    }
-                }
-                fclose($features_file);
-                if (!isset($glibc_major) || !isset($glibc_minor)) {
-                    return $glibc = '';
-                }
-                return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ;
-            } // no cpp
-
-            $tmpfile = System::mktemp("glibctest");
-            $fp = fopen($tmpfile, "w");
-            fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n");
-            fclose($fp);
-            $cpp = popen("/usr/bin/cpp $tmpfile", "r");
-            while ($line = fgets($cpp, 1024)) {
-                if ($line{0} == '#' || trim($line) == '') {
-                    continue;
-                }
-
-                if (list($major, $minor) = explode(' ', trim($line))) {
-                    break;
-                }
-            }
-            pclose($cpp);
-            unlink($tmpfile);
-        } // features.h
-
-        if (!($major && $minor) && @is_link('/lib/libc.so.6')) {
-            // Let's try reading the libc.so.6 symlink
-            if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib/libc.so.6')), $matches)) {
-                list($major, $minor) = explode('.', $matches[1]);
-            }
-        }
-
-        if (!($major && $minor)) {
-            return $glibc = '';
-        }
-
-        return $glibc = "glibc{$major}.{$minor}";
-    }
-
-    function getSignature()
-    {
-        if (empty($this->extra)) {
-            return "{$this->sysname}-{$this->release}-{$this->cpu}";
-        }
-        return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}";
-    }
-
-    function getSysname()
-    {
-        return $this->sysname;
-    }
-
-    function getNodename()
-    {
-        return $this->nodename;
-    }
-
-    function getCpu()
-    {
-        return $this->cpu;
-    }
-
-    function getRelease()
-    {
-        return $this->release;
-    }
-
-    function getExtra()
-    {
-        return $this->extra;
-    }
-
-    function matchSignature($match)
-    {
-        $fragments = is_array($match) ? $match : explode('-', $match);
-        $n = count($fragments);
-        $matches = 0;
-        if ($n > 0) {
-            $matches += $this->_matchFragment($fragments[0], $this->sysname);
-        }
-        if ($n > 1) {
-            $matches += $this->_matchFragment($fragments[1], $this->release);
-        }
-        if ($n > 2) {
-            $matches += $this->_matchFragment($fragments[2], $this->cpu);
-        }
-        if ($n > 3) {
-            $matches += $this->_matchFragment($fragments[3], $this->extra);
-        }
-        return ($matches == $n);
-    }
-
-    function _matchFragment($fragment, $value)
-    {
-        if (strcspn($fragment, '*?') < strlen($fragment)) {
-            $reg = '/^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '\\z/';
-            return preg_match($reg, $value);
-        }
-        return ($fragment == '*' || !strcasecmp($fragment, $value));
-    }
-
-}
-/*
- * Local Variables:
- * indent-tabs-mode: nil
- * c-basic-offset: 4
- * End:
- */
--- a/vendor/pear/pear-core-minimal/src/PEAR/Error.php	Wed Oct 08 09:09:32 2025 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-<?php
-/**
- * Dummy file to make autoloaders work
- *
- * PHP version 5
- *
- * @category PEAR
- * @package  PEAR
- * @author   Christian Weiske <cweiske@php.net>
- * @license  http://opensource.org/licenses/bsd-license.php New BSD License
- * @link     http://pear.php.net/package/PEAR
- */
-require_once __DIR__ . '/../PEAR.php';
-?>
\ No newline at end of file
--- a/vendor/pear/pear-core-minimal/src/PEAR/ErrorStack.php	Wed Oct 08 09:09:32 2025 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,979 +0,0 @@
-<?php
-/**
- * Error Stack Implementation
- * 
- * This is an incredibly simple implementation of a very complex error handling
- * facility.  It contains the ability
- * to track multiple errors from multiple packages simultaneously.  In addition,
- * it can track errors of many levels, save data along with the error, context
- * information such as the exact file, line number, class and function that
- * generated the error, and if necessary, it can raise a traditional PEAR_Error.
- * It has built-in support for PEAR::Log, to log errors as they occur
- * 
- * Since version 0.2alpha, it is also possible to selectively ignore errors,
- * through the use of an error callback, see {@link pushCallback()}
- * 
- * Since version 0.3alpha, it is possible to specify the exception class
- * returned from {@link push()}
- *
- * Since version PEAR1.3.2, ErrorStack no longer instantiates an exception class.  This can
- * still be done quite handily in an error callback or by manipulating the returned array
- * @category   Debugging
- * @package    PEAR_ErrorStack
- * @author     Greg Beaver <cellog@php.net>
- * @copyright  2004-2008 Greg Beaver
- * @license    http://opensource.org/licenses/bsd-license.php New BSD License
- * @link       http://pear.php.net/package/PEAR_ErrorStack
- */
-
-/**
- * Singleton storage
- * 
- * Format:
- * <pre>
- * array(
- *  'package1' => PEAR_ErrorStack object,
- *  'package2' => PEAR_ErrorStack object,
- *  ...
- * )
- * </pre>
- * @access private
- * @global array $GLOBALS['_PEAR_ERRORSTACK_SINGLETON']
- */
-$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array();
-
-/**
- * Global error callback (default)
- * 
- * This is only used if set to non-false.  * is the default callback for
- * all packages, whereas specific packages may set a default callback
- * for all instances, regardless of whether they are a singleton or not.
- *
- * To exclude non-singletons, only set the local callback for the singleton
- * @see PEAR_ErrorStack::setDefaultCallback()
- * @access private
- * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']
- */
-$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array(
-    '*' => false,
-);
-
-/**
- * Global Log object (default)
- * 
- * This is only used if set to non-false.  Use to set a default log object for
- * all stacks, regardless of instantiation order or location
- * @see PEAR_ErrorStack::setDefaultLogger()
- * @access private
- * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']
- */
-$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false;
-
-/**
- * Global Overriding Callback
- * 
- * This callback will override any error callbacks that specific loggers have set.
- * Use with EXTREME caution
- * @see PEAR_ErrorStack::staticPushCallback()
- * @access private
- * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']
- */
-$GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array();
-
-/**#@+
- * One of four possible return values from the error Callback
- * @see PEAR_ErrorStack::_errorCallback()
- */
-/**
- * If this is returned, then the error will be both pushed onto the stack
- * and logged.
- */
-define('PEAR_ERRORSTACK_PUSHANDLOG', 1);
-/**
- * If this is returned, then the error will only be pushed onto the stack,
- * and not logged.
- */
-define('PEAR_ERRORSTACK_PUSH', 2);
-/**
- * If this is returned, then the error will only be logged, but not pushed
- * onto the error stack.
- */
-define('PEAR_ERRORSTACK_LOG', 3);
-/**
- * If this is returned, then the error is completely ignored.
- */
-define('PEAR_ERRORSTACK_IGNORE', 4);
-/**
- * If this is returned, then the error is logged and die() is called.
- */
-define('PEAR_ERRORSTACK_DIE', 5);
-/**#@-*/
-
-/**
- * Error code for an attempt to instantiate a non-class as a PEAR_ErrorStack in
- * the singleton method.
- */
-define('PEAR_ERRORSTACK_ERR_NONCLASS', 1);
-
-/**
- * Error code for an attempt to pass an object into {@link PEAR_ErrorStack::getMessage()}
- * that has no __toString() method
- */
-define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2);
-/**
- * Error Stack Implementation
- *
- * Usage:
- * <code>
- * // global error stack
- * $global_stack = &PEAR_ErrorStack::singleton('MyPackage');
- * // local error stack
- * $local_stack = new PEAR_ErrorStack('MyPackage');
- * </code>
- * @author     Greg Beaver <cellog@php.net>
- * @version    @package_version@
- * @package    PEAR_ErrorStack
- * @category   Debugging
- * @copyright  2004-2008 Greg Beaver
- * @license    http://opensource.org/licenses/bsd-license.php New BSD License
- * @link       http://pear.php.net/package/PEAR_ErrorStack
- */
-class PEAR_ErrorStack {
-    /**
-     * Errors are stored in the order that they are pushed on the stack.
-     * @since 0.4alpha Errors are no longer organized by error level.
-     * This renders pop() nearly unusable, and levels could be more easily
-     * handled in a callback anyway
-     * @var array
-     * @access private
-     */
-    var $_errors = array();
-
-    /**
-     * Storage of errors by level.
-     *
-     * Allows easy retrieval and deletion of only errors from a particular level
-     * @since PEAR 1.4.0dev
-     * @var array
-     * @access private
-     */
-    var $_errorsByLevel = array();
-
-    /**
-     * Package name this error stack represents
-     * @var string
-     * @access protected
-     */
-    var $_package;
-    
-    /**
-     * Determines whether a PEAR_Error is thrown upon every error addition
-     * @var boolean
-     * @access private
-     */
-    var $_compat = false;
-    
-    /**
-     * If set to a valid callback, this will be used to generate the error
-     * message from the error code, otherwise the message passed in will be
-     * used
-     * @var false|string|array
-     * @access private
-     */
-    var $_msgCallback = false;
-    
-    /**
-     * If set to a valid callback, this will be used to generate the error
-     * context for an error.  For PHP-related errors, this will be a file
-     * and line number as retrieved from debug_backtrace(), but can be
-     * customized for other purposes.  The error might actually be in a separate
-     * configuration file, or in a database query.
-     * @var false|string|array
-     * @access protected
-     */
-    var $_contextCallback = false;
-
-    /**
-     * If set to a valid callback, this will be called every time an error
-     * is pushed onto the stack.  The return value will be used to determine
-     * whether to allow an error to be pushed or logged.
-     *
-     * The return value must be one an PEAR_ERRORSTACK_* constant
-     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
-     * @var false|string|array
-     * @access protected
-     */
-    var $_errorCallback = array();
-
-    /**
-     * PEAR::Log object for logging errors
-     * @var false|Log
-     * @access protected
-     */
-    var $_logger = false;
-
-    /**
-     * Error messages - designed to be overridden
-     * @var array
-     * @abstract
-     */
-    var $_errorMsgs = array();
-
-    /**
-     * Set up a new error stack
-     *
-     * @param string   $package name of the package this error stack represents
-     * @param callback $msgCallback callback used for error message generation
-     * @param callback $contextCallback callback used for context generation,
-     *                 defaults to {@link getFileLine()}
-     * @param boolean  $throwPEAR_Error
-     */
-    function __construct($package, $msgCallback = false, $contextCallback = false,
-                         $throwPEAR_Error = false)
-    {
-        $this->_package = $package;
-        $this->setMessageCallback($msgCallback);
-        $this->setContextCallback($contextCallback);
-        $this->_compat = $throwPEAR_Error;
-    }
-    
-    /**
-     * Return a single error stack for this package.
-     * 
-     * Note that all parameters are ignored if the stack for package $package
-     * has already been instantiated
-     * @param string   $package name of the package this error stack represents
-     * @param callback $msgCallback callback used for error message generation
-     * @param callback $contextCallback callback used for context generation,
-     *                 defaults to {@link getFileLine()}
-     * @param boolean  $throwPEAR_Error
-     * @param string   $stackClass class to instantiate
-     *
-     * @return PEAR_ErrorStack
-     */
-    public static function &singleton(
-        $package, $msgCallback = false, $contextCallback = false,
-        $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack'
-    ) {
-        if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
-            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
-        }
-        if (!class_exists($stackClass)) {
-            if (function_exists('debug_backtrace')) {
-                $trace = debug_backtrace();
-            }
-            PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_NONCLASS,
-                'exception', array('stackclass' => $stackClass),
-                'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)',
-                false, $trace);
-        }
-        $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] =
-            new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error);
-
-        return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
-    }
-
-    /**
-     * Internal error handler for PEAR_ErrorStack class
-     * 
-     * Dies if the error is an exception (and would have died anyway)
-     * @access private
-     */
-    function _handleError($err)
-    {
-        if ($err['level'] == 'exception') {
-            $message = $err['message'];
-            if (isset($_SERVER['REQUEST_URI'])) {
-                echo '<br />';
-            } else {
-                echo "\n";
-            }
-            var_dump($err['context']);
-            die($message);
-        }
-    }
-    
-    /**
-     * Set up a PEAR::Log object for all error stacks that don't have one
-     * @param Log $log 
-     */
-    public static function setDefaultLogger(&$log)
-    {
-        if (is_object($log) && method_exists($log, 'log') ) {
-            $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
-        } elseif (is_callable($log)) {
-            $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
-        }
-    }
-    
-    /**
-     * Set up a PEAR::Log object for this error stack
-     * @param Log $log 
-     */
-    function setLogger(&$log)
-    {
-        if (is_object($log) && method_exists($log, 'log') ) {
-            $this->_logger = &$log;
-        } elseif (is_callable($log)) {
-            $this->_logger = &$log;
-        }
-    }
-    
-    /**
-     * Set an error code => error message mapping callback
-     * 
-     * This method sets the callback that can be used to generate error
-     * messages for any instance
-     * @param array|string Callback function/method
-     */
-    function setMessageCallback($msgCallback)
-    {
-        if (!$msgCallback) {
-            $this->_msgCallback = array(&$this, 'getErrorMessage');
-        } else {
-            if (is_callable($msgCallback)) {
-                $this->_msgCallback = $msgCallback;
-            }
-        }
-    }
-    
-    /**
-     * Get an error code => error message mapping callback
-     * 
-     * This method returns the current callback that can be used to generate error
-     * messages
-     * @return array|string|false Callback function/method or false if none
-     */
-    function getMessageCallback()
-    {
-        return $this->_msgCallback;
-    }
-    
-    /**
-     * Sets a default callback to be used by all error stacks
-     * 
-     * This method sets the callback that can be used to generate error
-     * messages for a singleton
-     * @param array|string Callback function/method
-     * @param string Package name, or false for all packages
-     */
-    public static function setDefaultCallback($callback = false, $package = false)
-    {
-        if (!is_callable($callback)) {
-            $callback = false;
-        }
-        $package = $package ? $package : '*';
-        $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback;
-    }
-    
-    /**
-     * Set a callback that generates context information (location of error) for an error stack
-     * 
-     * This method sets the callback that can be used to generate context
-     * information for an error.  Passing in NULL will disable context generation
-     * and remove the expensive call to debug_backtrace()
-     * @param array|string|null Callback function/method
-     */
-    function setContextCallback($contextCallback)
-    {
-        if ($contextCallback === null) {
-            return $this->_contextCallback = false;
-        }
-        if (!$contextCallback) {
-            $this->_contextCallback = array(&$this, 'getFileLine');
-        } else {
-            if (is_callable($contextCallback)) {
-                $this->_contextCallback = $contextCallback;
-            }
-        }
-    }
-    
-    /**
-     * Set an error Callback
-     * If set to a valid callback, this will be called every time an error
-     * is pushed onto the stack.  The return value will be used to determine
-     * whether to allow an error to be pushed or logged.
-     * 
-     * The return value must be one of the ERRORSTACK_* constants.
-     * 
-     * This functionality can be used to emulate PEAR's pushErrorHandling, and
-     * the PEAR_ERROR_CALLBACK mode, without affecting the integrity of
-     * the error stack or logging
-     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
-     * @see popCallback()
-     * @param string|array $cb
-     */
-    function pushCallback($cb)
-    {
-        array_push($this->_errorCallback, $cb);
-    }
-    
-    /**
-     * Remove a callback from the error callback stack
-     * @see pushCallback()
-     * @return array|string|false
-     */
-    function popCallback()
-    {
-        if (!count($this->_errorCallback)) {
-            return false;
-        }
-        return array_pop($this->_errorCallback);
-    }
-    
-    /**
-     * Set a temporary overriding error callback for every package error stack
-     *
-     * Use this to temporarily disable all existing callbacks (can be used
-     * to emulate the @ operator, for instance)
-     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
-     * @see staticPopCallback(), pushCallback()
-     * @param string|array $cb
-     */
-    public static function staticPushCallback($cb)
-    {
-        array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb);
-    }
-    
-    /**
-     * Remove a temporary overriding error callback
-     * @see staticPushCallback()
-     * @return array|string|false
-     */
-    public static function staticPopCallback()
-    {
-        $ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']);
-        if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) {
-            $GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array();
-        }
-        return $ret;
-    }
-    
-    /**
-     * Add an error to the stack
-     * 
-     * If the message generator exists, it is called with 2 parameters.
-     *  - the current Error Stack object
-     *  - an array that is in the same format as an error.  Available indices
-     *    are 'code', 'package', 'time', 'params', 'level', and 'context'
-     * 
-     * Next, if the error should contain context information, this is
-     * handled by the context grabbing method.
-     * Finally, the error is pushed onto the proper error stack
-     * @param int    $code      Package-specific error code
-     * @param string $level     Error level.  This is NOT spell-checked
-     * @param array  $params    associative array of error parameters
-     * @param string $msg       Error message, or a portion of it if the message
-     *                          is to be generated
-     * @param array  $repackage If this error re-packages an error pushed by
-     *                          another package, place the array returned from
-     *                          {@link pop()} in this parameter
-     * @param array  $backtrace Protected parameter: use this to pass in the
-     *                          {@link debug_backtrace()} that should be used
-     *                          to find error context
-     * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
-     * thrown.  If a PEAR_Error is returned, the userinfo
-     * property is set to the following array:
-     * 
-     * <code>
-     * array(
-     *    'code' => $code,
-     *    'params' => $params,
-     *    'package' => $this->_package,
-     *    'level' => $level,
-     *    'time' => time(),
-     *    'context' => $context,
-     *    'message' => $msg,
-     * //['repackage' => $err] repackaged error array/Exception class
-     * );
-     * </code>
-     * 
-     * Normally, the previous array is returned.
-     */
-    function push($code, $level = 'error', $params = array(), $msg = false,
-                  $repackage = false, $backtrace = false)
-    {
-        $context = false;
-        // grab error context
-        if ($this->_contextCallback) {
-            if (!$backtrace) {
-                $backtrace = debug_backtrace();
-            }
-            $context = call_user_func($this->_contextCallback, $code, $params, $backtrace);
-        }
-        
-        // save error
-        $time = explode(' ', microtime());
-        $time = $time[1] + $time[0];
-        $err = array(
-                'code' => $code,
-                'params' => $params,
-                'package' => $this->_package,
-                'level' => $level,
-                'time' => $time,
-                'context' => $context,
-                'message' => $msg,
-               );
-
-        if ($repackage) {
-            $err['repackage'] = $repackage;
-        }
-
-        // set up the error message, if necessary
-        if ($this->_msgCallback) {
-            $msg = call_user_func_array($this->_msgCallback,
-                                        array(&$this, $err));
-            $err['message'] = $msg;
-        }        
-        $push = $log = true;
-        $die = false;
-        // try the overriding callback first
-        $callback = $this->staticPopCallback();
-        if ($callback) {
-            $this->staticPushCallback($callback);
-        }
-        if (!is_callable($callback)) {
-            // try the local callback next
-            $callback = $this->popCallback();
-            if (is_callable($callback)) {
-                $this->pushCallback($callback);
-            } else {
-                // try the default callback
-                $callback = isset($GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package]) ?
-                    $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package] :
-                    $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']['*'];
-            }
-        }
-        if (is_callable($callback)) {
-            switch(call_user_func($callback, $err)){
-            	case PEAR_ERRORSTACK_IGNORE: 
-            		return $err;
-        		break;
-            	case PEAR_ERRORSTACK_PUSH: 
-            		$log = false;
-        		break;
-            	case PEAR_ERRORSTACK_LOG: 
-            		$push = false;
-        		break;
-            	case PEAR_ERRORSTACK_DIE: 
-            		$die = true;
-        		break;
-                // anything else returned has the same effect as pushandlog
-            }
-        }
-        if ($push) {
-            array_unshift($this->_errors, $err);
-            if (!isset($this->_errorsByLevel[$err['level']])) {
-                $this->_errorsByLevel[$err['level']] = array();
-            }
-            $this->_errorsByLevel[$err['level']][] = &$this->_errors[0];
-        }
-        if ($log) {
-            if ($this->_logger || $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']) {
-                $this->_log($err);
-            }
-        }
-        if ($die) {
-            die();
-        }
-        if ($this->_compat && $push) {
-            return $this->raiseError($msg, $code, null, null, $err);
-        }
-        return $err;
-    }
-    
-    /**
-     * Static version of {@link push()}
-     * 
-     * @param string $package   Package name this error belongs to
-     * @param int    $code      Package-specific error code
-     * @param string $level     Error level.  This is NOT spell-checked
-     * @param array  $params    associative array of error parameters
-     * @param string $msg       Error message, or a portion of it if the message
-     *                          is to be generated
-     * @param array  $repackage If this error re-packages an error pushed by
-     *                          another package, place the array returned from
-     *                          {@link pop()} in this parameter
-     * @param array  $backtrace Protected parameter: use this to pass in the
-     *                          {@link debug_backtrace()} that should be used
-     *                          to find error context
-     * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
-     *                          thrown.  see docs for {@link push()}
-     */
-    public static function staticPush(
-        $package, $code, $level = 'error', $params = array(),
-        $msg = false, $repackage = false, $backtrace = false
-    ) {
-        $s = &PEAR_ErrorStack::singleton($package);
-        if ($s->_contextCallback) {
-            if (!$backtrace) {
-                if (function_exists('debug_backtrace')) {
-                    $backtrace = debug_backtrace();
-                }
-            }
-        }
-        return $s->push($code, $level, $params, $msg, $repackage, $backtrace);
-    }
-    
-    /**
-     * Log an error using PEAR::Log
-     * @param array $err Error array
-     * @param array $levels Error level => Log constant map
-     * @access protected
-     */
-    function _log($err)
-    {
-        if ($this->_logger) {
-            $logger = &$this->_logger;
-        } else {
-            $logger = &$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'];
-        }
-        if (is_a($logger, 'Log')) {
-            $levels = array(
-                'exception' => PEAR_LOG_CRIT,
-                'alert' => PEAR_LOG_ALERT,
-                'critical' => PEAR_LOG_CRIT,
-                'error' => PEAR_LOG_ERR,
-                'warning' => PEAR_LOG_WARNING,
-                'notice' => PEAR_LOG_NOTICE,
-                'info' => PEAR_LOG_INFO,
-                'debug' => PEAR_LOG_DEBUG);
-            if (isset($levels[$err['level']])) {
-                $level = $levels[$err['level']];
-            } else {
-                $level = PEAR_LOG_INFO;
-            }
-            $logger->log($err['message'], $level, $err);
-        } else { // support non-standard logs
-            call_user_func($logger, $err);
-        }
-    }
-
-    
-    /**
-     * Pop an error off of the error stack
-     * 
-     * @return false|array
-     * @since 0.4alpha it is no longer possible to specify a specific error
-     * level to return - the last error pushed will be returned, instead
-     */
-    function pop()
-    {
-        $err = @array_shift($this->_errors);
-        if (!is_null($err)) {
-            @array_pop($this->_errorsByLevel[$err['level']]);
-            if (!count($this->_errorsByLevel[$err['level']])) {
-                unset($this->_errorsByLevel[$err['level']]);
-            }
-        }
-        return $err;
-    }
-
-    /**
-     * Pop an error off of the error stack, static method
-     *
-     * @param string package name
-     * @return boolean
-     * @since PEAR1.5.0a1
-     */
-    function staticPop($package)
-    {
-        if ($package) {
-            if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
-                return false;
-            }
-            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop();
-        }
-    }
-
-    /**
-     * Determine whether there are any errors on the stack
-     * @param string|array Level name.  Use to determine if any errors
-     * of level (string), or levels (array) have been pushed
-     * @return boolean
-     */
-    function hasErrors($level = false)
-    {
-        if ($level) {
-            return isset($this->_errorsByLevel[$level]);
-        }
-        return count($this->_errors);
-    }
-    
-    /**
-     * Retrieve all errors since last purge
-     * 
-     * @param boolean set in order to empty the error stack
-     * @param string level name, to return only errors of a particular severity
-     * @return array
-     */
-    function getErrors($purge = false, $level = false)
-    {
-        if (!$purge) {
-            if ($level) {
-                if (!isset($this->_errorsByLevel[$level])) {
-                    return array();
-                } else {
-                    return $this->_errorsByLevel[$level];
-                }
-            } else {
-                return $this->_errors;
-            }
-        }
-        if ($level) {
-            $ret = $this->_errorsByLevel[$level];
-            foreach ($this->_errorsByLevel[$level] as $i => $unused) {
-                // entries are references to the $_errors array
-                $this->_errorsByLevel[$level][$i] = false;
-            }
-            // array_filter removes all entries === false
-            $this->_errors = array_filter($this->_errors);
-            unset($this->_errorsByLevel[$level]);
-            return $ret;
-        }
-        $ret = $this->_errors;
-        $this->_errors = array();
-        $this->_errorsByLevel = array();
-        return $ret;
-    }
-    
-    /**
-     * Determine whether there are any errors on a single error stack, or on any error stack
-     *
-     * The optional parameter can be used to test the existence of any errors without the need of
-     * singleton instantiation
-     * @param string|false Package name to check for errors
-     * @param string Level name to check for a particular severity
-     * @return boolean
-     */
-    public static function staticHasErrors($package = false, $level = false)
-    {
-        if ($package) {
-            if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
-                return false;
-            }
-            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->hasErrors($level);
-        }
-        foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) {
-            if ($obj->hasErrors($level)) {
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    /**
-     * Get a list of all errors since last purge, organized by package
-     * @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be
-     * @param boolean $purge Set to purge the error stack of existing errors
-     * @param string  $level Set to a level name in order to retrieve only errors of a particular level
-     * @param boolean $merge Set to return a flat array, not organized by package
-     * @param array   $sortfunc Function used to sort a merged array - default
-     *        sorts by time, and should be good for most cases
-     *
-     * @return array 
-     */
-    public static function staticGetErrors(
-        $purge = false, $level = false, $merge = false,
-        $sortfunc = array('PEAR_ErrorStack', '_sortErrors')
-    ) {
-        $ret = array();
-        if (!is_callable($sortfunc)) {
-            $sortfunc = array('PEAR_ErrorStack', '_sortErrors');
-        }
-        foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) {
-            $test = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->getErrors($purge, $level);
-            if ($test) {
-                if ($merge) {
-                    $ret = array_merge($ret, $test);
-                } else {
-                    $ret[$package] = $test;
-                }
-            }
-        }
-        if ($merge) {
-            usort($ret, $sortfunc);
-        }
-        return $ret;
-    }
-    
-    /**
-     * Error sorting function, sorts by time
-     * @access private
-     */
-    public static function _sortErrors($a, $b)
-    {
-        if ($a['time'] == $b['time']) {
-            return 0;
-        }
-        if ($a['time'] < $b['time']) {
-            return 1;
-        }
-        return -1;
-    }
-
-    /**
-     * Standard file/line number/function/class context callback
-     *
-     * This function uses a backtrace generated from {@link debug_backtrace()}
-     * and so will not work at all in PHP < 4.3.0.  The frame should
-     * reference the frame that contains the source of the error.
-     * @return array|false either array('file' => file, 'line' => line,
-     *         'function' => function name, 'class' => class name) or
-     *         if this doesn't work, then false
-     * @param unused
-     * @param integer backtrace frame.
-     * @param array Results of debug_backtrace()
-     */
-    public static function getFileLine($code, $params, $backtrace = null)
-    {
-        if ($backtrace === null) {
-            return false;
-        }
-        $frame = 0;
-        $functionframe = 1;
-        if (!isset($backtrace[1])) {
-            $functionframe = 0;
-        } else {
-            while (isset($backtrace[$functionframe]['function']) &&
-                  $backtrace[$functionframe]['function'] == 'eval' &&
-                  isset($backtrace[$functionframe + 1])) {
-                $functionframe++;
-            }
-        }
-        if (isset($backtrace[$frame])) {
-            if (!isset($backtrace[$frame]['file'])) {
-                $frame++;
-            }
-            $funcbacktrace = $backtrace[$functionframe];
-            $filebacktrace = $backtrace[$frame];
-            $ret = array('file' => $filebacktrace['file'],
-                         'line' => $filebacktrace['line']);
-            // rearrange for eval'd code or create function errors
-            if (strpos($filebacktrace['file'], '(') && 
-            	  preg_match(';^(.*?)\((\d+)\) : (.*?)\\z;', $filebacktrace['file'],
-                  $matches)) {
-                $ret['file'] = $matches[1];
-                $ret['line'] = $matches[2] + 0;
-            }
-            if (isset($funcbacktrace['function']) && isset($backtrace[1])) {
-                if ($funcbacktrace['function'] != 'eval') {
-                    if ($funcbacktrace['function'] == '__lambda_func') {
-                        $ret['function'] = 'create_function() code';
-                    } else {
-                        $ret['function'] = $funcbacktrace['function'];
-                    }
-                }
-            }
-            if (isset($funcbacktrace['class']) && isset($backtrace[1])) {
-                $ret['class'] = $funcbacktrace['class'];
-            }
-            return $ret;
-        }
-        return false;
-    }
-    
-    /**
-     * Standard error message generation callback
-     * 
-     * This method may also be called by a custom error message generator
-     * to fill in template values from the params array, simply
-     * set the third parameter to the error message template string to use
-     * 
-     * The special variable %__msg% is reserved: use it only to specify
-     * where a message passed in by the user should be placed in the template,
-     * like so:
-     * 
-     * Error message: %msg% - internal error
-     * 
-     * If the message passed like so:
-     * 
-     * <code>
-     * $stack->push(ERROR_CODE, 'error', array(), 'server error 500');
-     * </code>
-     * 
-     * The returned error message will be "Error message: server error 500 -
-     * internal error"
-     * @param PEAR_ErrorStack
-     * @param array
-     * @param string|false Pre-generated error message template
-     *
-     * @return string
-     */
-    public static function getErrorMessage(&$stack, $err, $template = false)
-    {
-        if ($template) {
-            $mainmsg = $template;
-        } else {
-            $mainmsg = $stack->getErrorMessageTemplate($err['code']);
-        }
-        $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg);
-        if (is_array($err['params']) && count($err['params'])) {
-            foreach ($err['params'] as $name => $val) {
-                if (is_array($val)) {
-                    // @ is needed in case $val is a multi-dimensional array
-                    $val = @implode(', ', $val);
-                }
-                if (is_object($val)) {
-                    if (method_exists($val, '__toString')) {
-                        $val = $val->__toString();
-                    } else {
-                        PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_OBJTOSTRING,
-                            'warning', array('obj' => get_class($val)),
-                            'object %obj% passed into getErrorMessage, but has no __toString() method');
-                        $val = 'Object';
-                    }
-                }
-                $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg);
-            }
-        }
-        return $mainmsg;
-    }
-    
-    /**
-     * Standard Error Message Template generator from code
-     * @return string
-     */
-    function getErrorMessageTemplate($code)
-    {
-        if (!isset($this->_errorMsgs[$code])) {
-            return '%__msg%';
-        }
-        return $this->_errorMsgs[$code];
-    }
-    
-    /**
-     * Set the Error Message Template array
-     * 
-     * The array format must be:
-     * <pre>
-     * array(error code => 'message template',...)
-     * </pre>
-     * 
-     * Error message parameters passed into {@link push()} will be used as input
-     * for the error message.  If the template is 'message %foo% was %bar%', and the
-     * parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will
-     * be 'message one was six'
-     * @return string
-     */
-    function setErrorMessageTemplate($template)
-    {
-        $this->_errorMsgs = $template;
-    }
-    
-    
-    /**
-     * emulate PEAR::raiseError()
-     * 
-     * @return PEAR_Error
-     */
-    function raiseError()
-    {
-        require_once 'PEAR.php';
-        $args = func_get_args();
-        return call_user_func_array(array('PEAR', 'raiseError'), $args);
-    }
-}
-$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack');
-$stack->pushCallback(array('PEAR_ErrorStack', '_handleError'));
-?>