<?php

// ユーザによる中断を無視する
ignore_user_abort( TRUE );

// エラー報告
error_reporting(E_ALL);

// 内部例外トレース
define( 'ENABLE_INTERNAL_EXCEPTION_TRACE', FALSE );

//==================================================================
// OSによってパス区切り文字を判定

if (!defined('PATH_SEPARATOR')) {
	if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
		define('PATH_SEPARATOR', ';');
	} else {
		define('PATH_SEPARATOR', ':');
	}
}

//==================================================================
// 定数

define( 'PROC_KEYWORD', 'proc' );

//==================================================================
// インクルードパス設定

function add_include_path( $path )
{
	ini_set(
			'include_path', 
			ini_get('include_path') . PATH_SEPARATOR . $path
		);
}

ini_set( 'include_path', NULL );
add_include_path( CHARCOAL_HOME . '/classes/' );
add_include_path( WEBAPP_DIR . '/' . APPLICATION . '/classes/' );

//==================================================================
// autoload

function __autoload( $class_name )
{
	static $class_loader = false;
	if ( !$class_loader ){
		require ( 'core/ClassLoader.class.php' );
		$class_loader = true;
	}

//	require_once ( 'core/ClassLoader.class.php' );

	$loaded = ClassLoader::loadClass( $class_name );
}

//==================================================================
// ログ出力関数

// TRACE出力
function log_trace( $logger_names, $message )
{
	Logger::writeln( s("T:$logger_names"), s($message) );
}

// INFO出力
function log_info( $logger_names, $message )
{
	Logger::writeln( s("I:$logger_names"), s($message) );
}

// WARNING出力
function log_warning( $logger_names, $message )
{
	Logger::writeln( s("W:$logger_names"), s($message) );
}

// DEBUG出力
function log_debug( $logger_names, $message )
{
	Logger::writeln( s("D:$logger_names"), s($message) );
}

// ERROR出力
function log_error( $logger_names, $message )
{
	Logger::writeln( s("E:$logger_names"), s($message) );
}

// FATAL出力
function log_fatal( $logger_names, $message )
{
	Logger::writeln( s("F:$logger_names"), $message );
}

//==================================================================
// 配列ダンプ

function array_dump( $array, $title = NULL )
{
	print System::arrayToString($array,$title);
}

//==================================================================
// 型変換
function boolval( $str )
{
	return ( $str === 'TRUE' || $str === 'on' || $str === '1' );
}

//==================================================================
// プリミティブ生成関数

function s( $value, $encoding = NULL )
{
	if ( $value instanceof String ){
		return $value;
	}
	return $value !== NULL ? new String( $value, $encoding ) : new String( '', $encoding );
}

function i( $value )
{
	if ( $value instanceof Integer ){
		return $value;
	}
	return $value ? new Integer( $value ) : new Integer( 0 );
}

function b( $value )
{
	if ( $value instanceof Boolean ){
		return $value;
	}
	return $value ? new Boolean( $value ) : new Boolean( FALSE );
}

function v( $value )
{
	if ( $value instanceof Vector ){
		return $value;
	}
	return $value ? new Vector( $value ) : new Vector( array() );
}

//==================================================================
// HTML関連関数

function h( $str )
{
	return htmlspecialchars($str, ENT_QUOTES, mb_internal_encoding());
}

//==================================================================
// 例外をスロー

function _throw( Exception $e )
{
	if ( ENABLE_INTERNAL_EXCEPTION_TRACE ){
		list( $file, $line ) = System::caller();
		$file = basename($file);
		$clazz = get_class($e);
		$id = $e->hashCode();
		$message = $e->getMessage();
		print "Throw $clazz ($id) $message @$file($line)<br>";
	}
	throw $e;
}

//==================================================================
// 例外をキャッチ
function _catch( Exception $e )
{
	if ( ENABLE_INTERNAL_EXCEPTION_TRACE ){
		list( $file, $line ) = System::caller();
		$file = basename($file);
		$clazz = get_class($e);
		$id = $e->hashCode();
		$message = $e->getMessage();
		print "Catched $clazz ($id) $message @$file($line)<br>";
	}
}

//==================================================================
// WEBAPP以下のパスを取得
function _webapp_path( String $folder, String $filename = NULL )
{
	return ResourceLocator::getWebAppPath( $folder, $filename );
}

//==================================================================
// WEBAPP以下のパスを取得
function _system_path( String $folder, String $filename = NULL )
{
	return ResourceLocator::getSystemPath( $folder, $filename );
}

//==================================================================
// プロファイルを読み込む

switch( CHARCOAL_RUNMODE ){
case 'http':
//	$host = gethostbyaddr($_SERVER["SERVER_ADDR"]);
	$host = $_SERVER["SERVER_NAME"];
	break;
case 'shell':
	$host = 'shell';
	break;
default:
	_throw( new UnexpectedRunModeException( CHARCOAL_RUNMODE ) );
	break;
}

Profile::load( $host );

// タイムアウトを指定
$timeout = Profile::getInteger( s('SCRIPT_TIMEOUT') ,600);
set_time_limit( $timeout );

