2008-12-02 05:33:14 +01:00
< ? php
2009-03-21 04:18:07 +01:00
/* Don 't actually define these, since it' d clutter up the namespace .
define ( '1' , E_ERROR );
define ( '2' , E_WARNING );
define ( '4' , E_PARSE );
define ( '8' , E_NOTICE );
define ( '16' , E_CORE_ERROR );
define ( '32' , E_CORE_WARNING );
define ( '64' , E_COMPILE_ERROR );
define ( '128' , E_COMPILE_WARNING );
define ( '256' , E_USER_ERROR );
define ( '512' , E_USER_WARNING );
define ( '1024' , E_USER_NOTICE );
define ( '2048' , E_STRICT );
define ( '4096' , E_RECOVERABLE_ERROR );
define ( '8192' , E_DEPRECATED );
define ( '16384' , E_USER_DEPRECATED );
define ( '30719' , E_ALL );
*/
2008-12-02 05:33:14 +01:00
class SapphireREPL extends Controller {
2009-03-21 04:18:07 +01:00
private function error_handler ( $errno , $errstr , $errfile , $errline , $errctx ) {
// Ignore unless important error
if ( ( $errno & ~ ( 2048 | 8192 | 16384 )) == 0 ) return ;
// Otherwise throw exception to handle in REPL loop
throw new Exception ( sprintf ( " %s:%d \r \n %s " , $errfile , $errline , $errstr ));
}
2008-12-02 05:33:14 +01:00
function index () {
if ( ! Director :: is_cli ()) return " The Sapphire Interactive Command-line doesn't work in a web browser. Use 'sake interactive' from the command-line to run. " ;
2009-03-21 04:18:07 +01:00
/* Try using PHP_Shell if it exists */
@ include 'php-shell-cmd.php' ;
/* Fall back to our simpler interface */
if ( empty ( $__shell ) ) {
set_error_handler ( array ( $this , 'error_handler' ));
echo " Sapphire Interactive Command-line (REPL interface). Type help for hints. \n \n " ;
while ( true ) {
echo SSCli :: text ( " ?> " , " cyan " );
echo SSCli :: start_colour ( " yellow " );
$command = trim ( fgets ( STDIN , 4096 ));
echo SSCli :: end_colour ();
if ( $command == 'help' || $command == '?' ) {
print " help or ? to exit \n " ;
print " quit or \ q to exit \n " ;
print " install PHP_Shell for a more advanced interface with auto-completion and readline support \n \n " ;
continue ;
}
if ( $command == 'quit' || $command == '\q' ) break ;
// Simple command processing
if ( substr ( $command , - 1 ) == ';' ) $command = substr ( $command , 0 , - 1 );
$is_print = preg_match ( '/^\s*print/i' , $command );
$is_return = preg_match ( '/^\s*return/i' , $command );
if ( ! $is_print && ! $is_return ) $command = " return ( $command ) " ;
$command .= " ; " ;
try {
$result = eval ( $command );
if ( ! $is_print ) print_r ( $result );
echo " \n " ;
}
catch ( Exception $__repl_exception ) {
echo SSCli :: start_colour ( " red " );
printf ( '%s (code: %d) got thrown' . PHP_EOL , get_class ( $__repl_exception ), $__repl_exception -> getCode () );
print $__repl_exception ;
echo " \n " ;
}
}
2008-12-02 05:33:14 +01:00
}
}
}
?>