<?php 
 
/** 
  * example2.php 
  * formerly parse_gen.php 
  * 
  * code to create a node graph of a PHP source file 
  * C. McKinnon 4 feb 2011 
  *  
  * this script shows how to set the options on the generated graph 
  */ 
 
/** 
  * init 
  */ 
require_once('dotwriter.inc.php'); 
 
set_time_limit(600); 
$process_errors=array(); // error handler writes errors here for display later 
 
$controller=new dotrunner(); 
 
/**  
 * main  
 */ 
if (check_params($controller)) { 
        if (not_cached($_REQUEST['src_file'])) { 
                set_error_handler('error_logging'); 
        $source_code=file_get_contents($_REQUEST['src_file']); 
                $outputFileName=$controller->genGraph( 
            $source_code,basename($_REQUEST['src_file'])); 
                restore_error_handler(); 
        } 
} 
do_page($controller); 
$controller->cleanUp(); 
 
 
// --------------------------- end --------------------------- 
 
exit; 
 
/** 
 * initialize the dotrunner obj with paramters from $_REQUEST 
 */ 
function check_params($dstObj) 
{ 
        if ($_REQUEST['src_file'] && $_REQUEST['opt_output'] 
                        && $_REQUEST['opt_undef'] && $_REQUEST['opt_builtin']) { 
                if (file_exists($_REQUEST['src_file'])) { 
                        if (strtoupper(substr($_REQUEST['opt_output'],0,1))=='V') { 
                                $dstObj->options['output']='Vertical'; 
                        } else { 
                                $dstObj->options['output']='Horizontal'; 
                        } 
                        if ($_REQUEST['opt_undef']=='YES') { 
                                $dstObj->options['exclude_undefined']=true; 
                        } else { 
                                $dstObj->options['exclude_undefined']=false; 
                        } 
                        if ($_REQUEST['opt_builtin']=='YES') { 
                                $dstObj->options['exclude_builtins']=true; 
                        } else { 
                                $dstObj->options['exclude_builtins']=false; 
                        } 
            $dstObj->outputFileName=get_dest_file($_REQUEST['src_file']) . '.jpg'; 
                        return(true); 
                } else { 
                        trigger_error("File not found"); 
                } 
        } 
        return(false); 
} 
 
 
function do_page($controller) 
{ 
        print "<body>\n"; 
        do_form(); 
        do_result($controller->tmpfile,$controller->cmd, $controller->dotCmdOutput, 
            $_REQUEST['src_file'], $controller->options,  
            $controller->exclude_fns, $controller->builtins, 
            $controller); 
        print "</body>"; 
} 
function do_form() 
{ 
 
        print "<form method='GET'>\n"; 
        print "file to parse: <input type='text' name='src_file' value='" . $_REQUEST['src_file'] . "' size='80'><br />\n"; 
        print "output vertical or horizontal? <select name='opt_output'> 
                <option selected>Vertical</option> 
                <option>Horizontal</option> 
                </select><br />\n"; 
        print "exclude undefined functions? <select name='opt_undef'> 
                        <option selected>YES</option> 
                        <option>NO</option></select><br />\n"; 
        print "exclude builtin functions? <select name='opt_builtin'> 
                     <option selected>YES</option> 
                         <option>NO</option></select><br />\n"; 
        print "<input type='submit' name='submit' value='submit'></form>\n"; 
} 
 
function do_result($tmpfile,$cmd,$output,$src_file,$options,$exclude_fns, $builtins, $ctrl) 
{ 
        if ($_REQUEST['src_file']) { 
                show_errors(); 
                $destfile=get_dest_file($_REQUEST['src_file']) . '.jpg'; 
                if (file_exists($destfile)) { 
                        print "<h3>$src_file</h3>\n"; 
                        list($lines_processed)=get_lines(false,false,$lines_processed); 
                        if ($lines_processed) { 
                                print "parsed $lines_processed lines from input file<br />\n"; 
                        } 
                        print "<br /><img src='$destfile' alt='callgraph'>\n"; 
            print "<br />This graph was created from the following .dot file:\n"; 
                } else { 
                        print "expected output $destfile not created<br />\n"; 
                        print "failed to generate for some reason"; 
            print "<br />dot file shown below:\n"; 
                } 
        print "<code><pre>" . @file_get_contents($tmpfile) . "</pre></code>\n"; 
        } else { 
                print "<h3>Key</h3><br /><img src='key.jpg' alt='key'>\n"; 
        } 
} 
 
function show_errors() 
{ 
        global $process_errors; 
        $colors=array( 
                        E_ERROR          => "FF1010", // red 
                        E_WARNING        => "FF3333", // yellow 
                        E_PARSE          => "CC00FF", // unlikely 
                        E_NOTICE          => "00FFFF", 
                        E_CORE_ERROR      => "CC00FF", 
                        E_CORE_WARNING    => "FF0000", 
                        E_COMPILE_ERROR  => "FF0000", 
                        E_COMPILE_WARNING => "FF9933", 
                        E_USER_ERROR      => "FF6666", 
                        E_USER_WARNING    => "FFFF33", 
                        E_USER_NOTICE    => "CCCCFF", 
                        E_STRICT          => "FF99FF" 
                        ); 
        if (count($process_errors)) { 
                print "<h3>Errors occurred during processing</h3>\n"; 
                print "<table bgcolor='#000000'>"; 
                foreach($process_errors as $item) { 
                        list($errno, $msg)=$item; 
                        $bg=$colors[$errno]; 
                        if (!$bg) $bg='FFFFFF'; 
                        print "<tr><td bgcolor='#$bg'>$errno</td><td bgcolor='#$bg'>$msg</td></tr>\n"; 
                } 
                print "</table>\n"; 
        } 
} 
 
function error_logging($errno, $errmsg, $filename, $line, $vars) 
{ 
        global $process_errors; 
        $errortype = array ( 
                        E_ERROR          => "Error", 
                        E_WARNING        => "Warning", 
                        E_PARSE          => "Parsing Error", 
                        E_NOTICE          => "Notice", 
                        E_CORE_ERROR      => "Core Error", 
                        E_CORE_WARNING    => "Core Warning", 
                        E_COMPILE_ERROR  => "Compile Error", 
                        E_COMPILE_WARNING => "Compile Warning", 
                        E_USER_ERROR      => "User Error", 
                        E_USER_WARNING    => "User Warning", 
                        E_USER_NOTICE    => "User Notice", 
                        E_STRICT          => "Runtime Notice" 
                        ); 
        $process_errors[]=array($errno, $errortype[$errno] . " $errmsg at $line in $filename"); 
} 
 
function get_dest_file($src_file) 
{ 
        $src_file=serialize($_GET); // different graphs for difft params 
        $dest="graphs/" . md5($src_file); 
        return($dest); 
} 
 
function clean_cache() 
{ 
// garbage collectio %%% needs to be safer 
        $base=dirname(__FILE__); 
        if (is_dir($base . '/graphs')) { 
           $cmd="find " . $base . '/graphs/' . " -name \*.jpg -mtime +30 -exec rm -f {} \;"; 
           $chk=`echo "$cmd" | at now`; 
        } 
} 
function not_cached($src_file) 
{ 
        clean_cache(); 
        $destfile=get_dest_file($src_file) . '.jpg'; 
        $cachetime=(integer)@filemtime($destfile); 
        $codetime=(integer)@filemtime($src_file); 
        return($cachetime<$codetime); 
} 
 
 
 |