level = isset($GLOBALS['debug_level']) ? $GLOBALS['debug_level'] : $level; $this->email = $email; $this->subject = isset($subject) ? $subject : 'ITools error ('.$_SERVER['HTTP_HOST'].') on '.getenv('HOSTNAME'); $this->from = 'From: "it_debug '.getenv('HOSTNAME').'" '; } /** * Output a message if the global debug level is higher or the same as $level * @param $text Message to display * @param $level Debug level */ function debug($text, $level = 0) { if ($this->level >= $level) { echo (isset($_SERVER['REMOTE_ADDR']) ? nl2br("$level $text\n") : "$level $text")."\n"; flush(); } } /** * Send an e-mail to this debug object's maintainer * @param $text Text of mail message * @param $level Debug level - Mail is only sent if this is <= the global debug level */ function mail($text, $level = 0) { if ($this->level >= $level) { if ($this->email) mail($this->email, $this->subject, $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."\n".$_SERVER['SCRIPT_FILENAME']."\n\n".$text, $this->from); else error_log("missing debug email addr: " . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . " " . substr($text,0,200)); } } /** * Display error message or maintenance page and terminate processing. Mail message and vardump to maintainer * @param $text Message to display * @return This function never returns */ function internal_error($text) { $text = "Host: ".getenv('HOSTNAME')."\nPage: //{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}\nFile: {$_SERVER['SCRIPT_FILENAME']}\n\n$text\n\n"; if ($this->email) mail($this->email, $this->subject, $text.'$_REQUEST: '.print_r($_REQUEST, true). "\nStack:\n" . print_r(debug_backtrace(), true), $this->from); else error_log("missing debug email addr: " . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . " " . substr($text,0,200)); /* If we have a maintenance display page show this instead of error */ if (file_exists($_SERVER['DOCUMENT_ROOT'].'/maintenance.html')) { header("Location: http://{$_SERVER['HTTP_HOST']}/maintenance.html"); exit; } else fail("
Internal Error:\n\n$text");
}


/**
 * Function to return dump of all it's parameters,
 * normally used through D(), ED(), EDX() in functions.php
 * @param Varargs of mixed stuff to dump
 * @return String representation of dump
 */
function dump($args)
{
	$stack = debug_backtrace();
	$line = $stack[1]['line'];
	$file = $stack[1]['file'];

	if (!$_SERVER['REMOTE_ADDR'] && (substr(file_get_contents($file), 0, 2) == "#!"))
		$line++;

	if (ereg('(csv|txt|gif|jpg)', $_SERVER['PHP_SELF']) || !ereg('Mozilla', $_SERVER['HTTP_USER_AGENT']))
		$plain = 1;
	else if ($_SERVER['REMOTE_ADDR'])
	{
		$blue = "";
		$noblue = "";
	}
	else if (getenv('USER') != 'cschneid') # ;)
	{
		$blue = "\033[34m";
		$noblue = "\033[m";
		$red = "\033[31m";
		$nored = "\033[m";
	}

	if (!isset($GLOBALS['it_debug::dump source'][$file]))
		$GLOBALS['it_debug::dump source'][$file] = file($file);

	$src = $GLOBALS['it_debug::dump source'][$file][$line-1];

	$paramlist = preg_match('/(D|ED|EDC|EDX)\s*\(\s*([^)]+)/i', $src, $parts) ? $parts[2] : "";
	$argnames = preg_split('/\s*,\s*/', $paramlist);

	if ($parts[1] == "EDC")	# First argument was stripped by EDC
		array_shift($argnames);

	foreach ($args as $arg)
	{
		$var = array_shift($argnames);
		$item = gettype($arg) == 'resource' ? trim(print_r($arg, true)) : trim(var_export($arg, true));

		# Replace PHP 5 var_export object representation by old style
		while (preg_match("#(.*\b)(\w+)::__set_state\(array\(([^()]+)\)\)(.*)#s", $item, $regs))
		{
			list (, $head, $classname, $values, $tail) = $regs;
			$classname = strtolower($classname);
			$values = preg_replace("#'(\w+)' =>([^\n]+),#", 'var \$$1 = $2;', $values);
			$item = $head . "class $classname { $values }$tail";
		}

		$item = preg_replace("#(=>?)\s*\n\s*(array|class)#", '$1 $2', $item); # array( and class on same line as key
		$item = preg_replace('#array \(\s+([^({,;]+),\s+\)#', 'array( $1 )', $item); # 1-element arrays on 1 line
		$item = preg_replace('#class (\S+) \{\s+([^({,;]+;)?\s+\}#', 'class $1 { $2 }', $item); # 1-element objects on 1 line
		#$item = preg_replace('#\{\s*var \$attr#', '{ var $attr', $item); # move $attr on same line
		$item = preg_replace("#\\(\s*\n\s*\\)#", "()", $item);	   # empty arrays on 1 line
		#$item = preg_replace('#\s+var \$_(.|\n)*?;\s*\n#', "", $item);
		$item = "$red$item$nored";

		if (isset($_SERVER['REMOTE_ADDR']) && !$plain)
			$item = htmlspecialchars($item);

		if (ereg('^[\'"]', $var))
			$r .= "$item ";
		else {
			$var = "$blue$var=$noblue";
			$r .= preg_match("/\n/", $item) ? "\n$var$item\n" : "$var$item ";
		}
	}

	if ($GLOBALS['debug_indent'])
		$r = str_repeat("  ", count(debug_backtrace())-3) . $r;

	if (isset($_SERVER['REMOTE_ADDR']) && !$plain)
		 return "
$r
\n"; else return "$r\n"; } function backtrace() { foreach (array_slice(debug_backtrace(), 1) as $call) $line .= basename($call['file']) . ":" . $call['line'] . " "; return $line; } } ?>