* * Templification - Keeping templates simple and efficient. * Copyright (C) 2005 Jason Schmidt * * To contact Jason Schmidt, you may send mail to one of the following * addresses. Please note these may change in the future, but every * effort will be made to actively forward messages to the new * address(es): * * Templification@alias.HotPOP.com * * Jason Schmidt * 6245 Newberry Road 102 * Indianapolis, Indiana 46256-3103 * United States of America * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * *
Definition in file phpcompiler.php.
Go to the source code of this file.
Functions | |
Main ($argv) | |
Main execution for this file, which will load a list of input files and optionally a list of output files and run the hard-coded compiler. |
|
Main execution for this file, which will load a list of input files and optionally a list of output files and run the hard-coded compiler.
* Usage: php Compiler.php [-o OutFile] InFile [Infile...] *
Definition at line 65 of file phpcompiler.php. 00066 { 00067 // Get compiler itself 00068 $class_name = require_once("PhpCompiler.class.php"); 00069 $compiler = new $class_name(); 00070 00071 // Get option details 00072 $modes = $compiler->GetModes(); 00073 $mode_by_name = array(); 00074 foreach($modes as $mode) 00075 { 00076 $mode_by_name[$mode["Name"]] = $mode["Default"]; 00077 } 00078 00079 // Pull self off list 00080 array_shift($argv); 00081 00082 // Parse list of arguments 00083 $InFile = array(); 00084 $OutFile = array(); 00085 $show_usage = FALSE; 00086 while($argv) 00087 { 00088 $arg = array_shift($argv); 00089 00090 if("-o" == $arg) 00091 { 00092 $OutFile[] = array_shift($argv); 00093 } 00094 elseif(preg_match("/^--(.*?)=(.*)$/", $arg, $match)) 00095 { 00096 $arg = $match[1]; 00097 $val = $match[2]; 00098 00099 if(isset($mode_by_name[$arg])) 00100 { 00101 if("TRUE" === $val) 00102 { 00103 $mode_by_name[$arg] = TRUE; 00104 } 00105 elseif("FALSE" === $val) 00106 { 00107 $mode_by_name[$arg] = FALSE; 00108 } 00109 else 00110 { 00111 $mode_by_name[$arg] = $arg; 00112 } 00113 } 00114 else 00115 { 00116 print("Unknown argument $arg\n"); 00117 $show_usage = TRUE; 00118 } 00119 } 00120 elseif(file_exists($arg)) 00121 { 00122 $InFile[] = $arg; 00123 } 00124 else 00125 { 00126 print("Cannot find file $arg\n"); 00127 $show_usage = TRUE; 00128 } 00129 } 00130 if(0 == count($InFile)) 00131 { 00132 $show_usage = TRUE; 00133 } 00134 if(!$compiler->ChangeMode($mode_by_name)) 00135 { 00136 print("Error assigning options\n"); 00137 $show_usage = TRUE; 00138 } 00139 if($show_usage) 00140 { 00141 $opts = array( 00142 "[-o OutFile]", 00143 "InFile", 00144 "[InFile...]", 00145 ); 00146 foreach($modes as $mode) 00147 { 00148 $param = "--".$mode["Name"]; 00149 $value = ""; 00150 if(TRUE === $mode["Default"]) 00151 { 00152 $value = "=TRUE"; 00153 } 00154 elseif(FALSE === $mode["Default"]) 00155 { 00156 $value = "=FALSE"; 00157 } 00158 $opts[] = "[$param$value]"; 00159 } 00160 00161 print("Usage: php Compiler.php ".join(" ",$opts)."\n"); 00162 00163 die(1); 00164 } 00165 00166 // Get contents 00167 $Input = ""; 00168 foreach($InFile as $filename) 00169 { 00170 $file = file_get_contents($filename); 00171 if(FALSE === $file) 00172 { 00173 print("Error reading contents of $filename\n"); 00174 die(1); 00175 } 00176 00177 $Input .= $file; 00178 } 00179 00180 // Output errors should exit status 1, but not die immediately 00181 $die = FALSE; 00182 00183 // Open outfiles 00184 $count = count($OutFile); 00185 $out_handles = array(); 00186 for($x = 0; $x < $count; $x++) 00187 { 00188 $out = $OutFile[$x]; 00189 00190 $fh = fopen($out, "w"); 00191 if(!is_resource($fh)) 00192 { 00193 print("Failed to open $out for write\n"); 00194 $die = TRUE; 00195 } 00196 else 00197 { 00198 $out_handles[$out] = $fh; 00199 } 00200 } 00201 00202 // Perform the heart of the class 00203 $output = $compiler->Compile($Input); 00204 $errors = $compiler->GetErrors(); 00205 00206 // If errors 00207 if(0 < count($errors)) 00208 { 00209 $fh = fopen("php://STDERR", "w"); 00210 foreach($errors as $pos=>$error) 00211 { 00212 $lines = 0; 00213 $chars = 0; 00214 for($x = $pos-1; $x >= 0; $x --) 00215 { 00216 if("\n" == $Input[$x]) 00217 { 00218 $lines++; 00219 } 00220 elseif(0 == $lines) 00221 { 00222 $chars++; 00223 } 00224 } 00225 $lines++; 00226 $chars++; 00227 00228 fwrite($fh, "$lines,$chars: $error\n"); 00229 } 00230 fclose($fh); 00231 00232 if("" == $output) 00233 { 00234 die(1); 00235 } 00236 } 00237 00238 // Output as appropriate 00239 if(0 == count($out_handles) && !$die) 00240 { 00241 print($output); 00242 } 00243 else 00244 { 00245 foreach($out_handles as $fn=>$fh) 00246 { 00247 if(FALSE === fwrite($fh, $output)) 00248 { 00249 print("Failed writing $fn\n"); 00250 $die = TRUE; 00251 } 00252 elseif(TRUE !== fclose($fh)) 00253 { 00254 print("Failed closing $fn\n"); 00255 $die = TRUE; 00256 } 00257 else 00258 { 00259 print("Wrote $fn\n"); 00260 } 00261 } 00262 } 00263 00264 // Exit with appropriate status on error 00265 if($die) 00266 { 00267 die(1); 00268 } 00269 }
|