| 
<?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);
 }
 
 
 |