/* --------------------------------------------------------- * * __________ D E L T A S C R I P T * * (_________() * * / === / - A fast, dynamic scripting language * * | == | - Version 4.13.11.0 * * / === / - Developed by Adam R. Nelson * * | = = | - 2011-2013 * * / === / - Distributed under GNU LGPL v3 * * (________() - http://github.com/ar-nelson/deltascript * * * * --------------------------------------------------------- */ package com.sector91.delta.script.runner; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.sector91.delta.script.DScriptContext; import com.sector91.delta.script.DScriptErr; import com.sector91.delta.script.DeltaScript; import com.sector91.delta.script.instrs.DSInstr; import com.sector91.delta.script.objects.DS_Scope; import com.sector91.delta.script.parser.DScriptBinaryReader; import com.sector91.delta.script.parser.DScriptBinaryWriter; import com.sector91.delta.script.parser.DScriptParserException; public final class DeltaScriptRunner { @Parameter(description="filenames") private List<String> filenames = new ArrayList<String>(); @Parameter(names="--secureRandom", description="Use a cryptographically secure random number generator.") private boolean secureRandom = false; @Parameter(names={"-c", "--compile"}, description="Compile " + DeltaScript.SRC_EXT + " files to " + DeltaScript.BIN_EXT + " files.") private boolean compile = false; @Parameter(names={"-v", "--version"}, description="Print the DeltaScript version number.") private boolean version = false; @Parameter(names="--help", help=true) private boolean help = false; public static void main(String[] args) throws IOException { final DeltaScriptRunner runner = new DeltaScriptRunner(); final JCommander cmdr = new JCommander(runner, args); cmdr.setProgramName("delta"); if (runner.help) { cmdr.usage(); System.exit(0); } else if (runner.version) { System.out.println(DeltaScript.NAME + ", version " + DeltaScript.VERSION); System.exit(0); } else if (runner.compile && runner.filenames.size() > 0) { for (String filename : runner.filenames) compile(filename); } else if (!runner.compile) { final DScriptContext context = new DScriptContext(); if (runner.secureRandom) context.setRandom(new SecureRandom()); if (runner.filenames.size() > 0) exec(context, runner.filenames); else new DeltaScriptFancyInterpreter(context, context.createScope()).run(); } else { cmdr.usage(); System.exit(1); } } private static void compile(String filename) { if (!filename.toLowerCase().endsWith(DeltaScript.SRC_EXT)) { System.err.println("Cannot compile file '" + filename + "'; it does not have a " + DeltaScript.SRC_EXT + " extension."); System.exit(1); } final DScriptContext context = new DScriptContext(); String source = ""; try { System.err.println("Compiling " + filename + "..."); final BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream(filename), Charset.forName("UTF-8"))); try {while (in.ready()) source += in.readLine() + "\n";} finally {in.close();} final DSInstr compiled = DeltaScript.compile(source, filename, context); final FileOutputStream out = new FileOutputStream( filename.substring( 0, filename.length()-DeltaScript.SRC_EXT.length()) + DeltaScript.BIN_EXT); final DScriptBinaryWriter writer = new DScriptBinaryWriter(out); try {writer.write(compiled, context);} finally {writer.close();} } catch (DScriptParserException ex) { System.err.println("== Parse Error =="); System.err.println(); System.err.println(ex.getMessage()); System.err.println(); System.err.println(ex.getLocatorText(source)); System.exit(1); } catch (IOException ex) { System.err.println("== I/O Error =="); System.err.println(); System.err.println(ex.getClass().getSimpleName() + ": " + ex.getMessage()); System.exit(1); } } private static void exec(DScriptContext context, List<String> filenames) { String source = ""; final DS_Scope scope = context.createScope(); final List<DSInstr> scripts = new ArrayList<DSInstr>(); final String[] sources = new String[filenames.size()]; try { for (int i=0; i<filenames.size(); i++) { final String filename = filenames.get(i); source = ""; if (filename.toLowerCase().endsWith(DeltaScript.SRC_EXT)) { final BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream(filename), Charset.forName("UTF-8"))); try {while (in.ready()) source += in.readLine() + "\n";} finally {in.close();} scripts.add(DeltaScript.compile(source,filename,context)); } else if (filename.toLowerCase().endsWith(DeltaScript.BIN_EXT)) { final DScriptBinaryReader reader = new DScriptBinaryReader( new FileInputStream(filename)); try {scripts.add(reader.read(context, filename));} finally {reader.close();} } else { System.err.println("Cannot execute file '" + filename + "'; it does not have a " + DeltaScript.SRC_EXT + " or " + DeltaScript.BIN_EXT + " extension."); System.exit(1); } sources[i] = source; } } catch (DScriptParserException ex) { System.err.println("== Parse Error =="); System.err.println(); System.err.println(ex.getMessage()); System.err.println(); System.err.println(ex.getLocatorText(source)); System.exit(1); } catch (IOException ex) { System.err.println("== I/O Error =="); System.err.println(); System.err.println(ex.getClass().getSimpleName() + ": " + ex.getMessage()); System.exit(1); } for (int i=0; i<scripts.size(); i++) { try {DeltaScript.exec(scripts.get(i), scope, context);} catch (DScriptErr err) { System.err.println("== DeltaScript Error =="); System.err.println(); System.err.println(err.getMessage()); System.err.println(); System.err.println(err.getLocatorText(filenames.get(i), sources[i])); System.exit(1); } } } }