/* --------------------------------------------------------- *
* __________ 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);
}
}
}
}