* * 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 }
|
1.4.1