From b8a22422723aa0d1665ee041edb26ca4ba30f33f Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 25 Nov 2016 12:16:01 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=20Sandbox=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BE=D0=BD=D0=BB=D0=B0=D0=B9=D0=BD=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=D0=BF=D1=80=D0=B5=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/annimon/ownlang/Console.java | 17 +++++- src/main/java/com/annimon/ownlang/Main.java | 8 +++ .../annimon/ownlang/modules/files/files.java | 5 +- .../annimon/ownlang/parser/SourceLoader.java | 2 +- .../com/annimon/ownlang/utils/Sandbox.java | 56 +++++++++++++++++++ 5 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/annimon/ownlang/utils/Sandbox.java diff --git a/src/main/java/com/annimon/ownlang/Console.java b/src/main/java/com/annimon/ownlang/Console.java index 6beab63..68769af 100644 --- a/src/main/java/com/annimon/ownlang/Console.java +++ b/src/main/java/com/annimon/ownlang/Console.java @@ -1,13 +1,16 @@ package com.annimon.ownlang; import com.annimon.ownlang.lib.CallStack; - import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.PrintStream; import java.io.UnsupportedEncodingException; public class Console { + private static final String FILE_PREFIX = "tmp/"; + public static boolean filePrefixEnabled = false; + public static String newline() { return System.lineSeparator(); } @@ -39,7 +42,7 @@ public class Console { public static void error(CharSequence value) { System.err.println(value); } - + public static void handleException(Thread thread, Throwable throwable) { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); try(final PrintStream ps = new PrintStream(baos)) { @@ -57,4 +60,14 @@ public class Console { error(baos.toString()); } } + + public static File fileInstance(String path) { + final String filepath; + if (filePrefixEnabled) { + filepath = FILE_PREFIX.concat(path); + } else { + filepath = path; + } + return new File(filepath); + } } diff --git a/src/main/java/com/annimon/ownlang/Main.java b/src/main/java/com/annimon/ownlang/Main.java index bf6aeb5..d5fc0f1 100644 --- a/src/main/java/com/annimon/ownlang/Main.java +++ b/src/main/java/com/annimon/ownlang/Main.java @@ -11,6 +11,7 @@ import com.annimon.ownlang.parser.Token; import com.annimon.ownlang.parser.ast.Statement; import com.annimon.ownlang.parser.visitors.FunctionAdder; import com.annimon.ownlang.utils.Repl; +import com.annimon.ownlang.utils.Sandbox; import com.annimon.ownlang.utils.TimeMeasurement; import java.io.IOException; import java.util.List; @@ -112,6 +113,13 @@ public final class Main { i++; } break; + + case "--sandbox": + createOwnLangArgs(args, i + 1); + String[] newArgs = new String[ownlangArgs.length]; + System.arraycopy(ownlangArgs, 0, newArgs, 0, ownlangArgs.length); + Sandbox.main(newArgs); + return; default: if (input == null) { diff --git a/src/main/java/com/annimon/ownlang/modules/files/files.java b/src/main/java/com/annimon/ownlang/modules/files/files.java index 6efa05d..6637323 100644 --- a/src/main/java/com/annimon/ownlang/modules/files/files.java +++ b/src/main/java/com/annimon/ownlang/modules/files/files.java @@ -1,5 +1,6 @@ package com.annimon.ownlang.modules.files; +import com.annimon.ownlang.Console; import com.annimon.ownlang.exceptions.ArgumentsMismatchException; import com.annimon.ownlang.lib.*; import com.annimon.ownlang.modules.Module; @@ -120,7 +121,7 @@ public final class files implements Module { public Value execute(Value... args) { Arguments.checkAtLeast(1, args.length); - final File file = new File(args[0].asString()); + final File file = Console.fileInstance(args[0].asString()); try { if (args.length > 1) { return process(file, args[1].asString().toLowerCase()); @@ -555,7 +556,7 @@ public final class files implements Module { if (value.type() == Types.NUMBER) { return files.get(value.asInt()).file; } - return new File(value.asString()); + return Console.fileInstance(value.asString()); } private interface FileToBooleanFunction { diff --git a/src/main/java/com/annimon/ownlang/parser/SourceLoader.java b/src/main/java/com/annimon/ownlang/parser/SourceLoader.java index 600799e..9545b52 100644 --- a/src/main/java/com/annimon/ownlang/parser/SourceLoader.java +++ b/src/main/java/com/annimon/ownlang/parser/SourceLoader.java @@ -15,7 +15,7 @@ public final class SourceLoader { return readAndCloseStream(is); } - private static String readAndCloseStream(InputStream is) throws IOException { + public static String readAndCloseStream(InputStream is) throws IOException { final ByteArrayOutputStream result = new ByteArrayOutputStream(); final int bufferSize = 1024; final byte[] buffer = new byte[bufferSize]; diff --git a/src/main/java/com/annimon/ownlang/utils/Sandbox.java b/src/main/java/com/annimon/ownlang/utils/Sandbox.java new file mode 100644 index 0000000..b064efe --- /dev/null +++ b/src/main/java/com/annimon/ownlang/utils/Sandbox.java @@ -0,0 +1,56 @@ +package com.annimon.ownlang.utils; + +import com.annimon.ownlang.Console; +import com.annimon.ownlang.exceptions.StoppedException; +import com.annimon.ownlang.lib.CallStack; +import com.annimon.ownlang.parser.Lexer; +import com.annimon.ownlang.parser.Parser; +import com.annimon.ownlang.parser.SourceLoader; +import com.annimon.ownlang.parser.Token; +import com.annimon.ownlang.parser.ast.Statement; +import com.annimon.ownlang.parser.visitors.FunctionAdder; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +public final class Sandbox { + + public static void main(String[] args) throws IOException { + Console.filePrefixEnabled = true; + final String input = SourceLoader.readAndCloseStream(System.in); + dumpInputArguments(input, args); + + final List tokens = Lexer.tokenize(input); + final Parser parser = new Parser(tokens); + final Statement program = parser.parse(); + if (parser.getParseErrors().hasErrors()) { + System.out.print(parser.getParseErrors()); + return; + } + + program.accept(new FunctionAdder()); + + try { + program.execute(); + } catch (StoppedException ex) { + // skip + } catch (Exception ex) { + // ownlang call stack to stdout + System.out.format("%s in %s%n", ex.getMessage(), Thread.currentThread().getName()); + CallStack.getCalls().forEach(call -> System.out.format("\tat %s%n", call)); + // java stack trace to stderr + Console.handleException(Thread.currentThread(), ex); + } + } + + private static void dumpInputArguments(String source, String[] args) { + System.err.println(); + System.err.println(); + System.err.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + Arrays.stream(args).forEach(System.err::println); + System.err.println(); + System.err.println(source); + } +}