summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/StreamEngine.java
diff options
context:
space:
mode:
authorbjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu>2017-03-01 10:13:41 -0500
committerbjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu>2017-03-01 10:13:41 -0500
commit36e0911c6ec27707a74f0b90b1052a16374243ea (patch)
tree08ca7723b0c0a6a7f3ce1830c59e5211e46168b8 /dice-lang/src/bjc/dicelang/StreamEngine.java
parent6ed83507953322c35a456d64d89f8f4f9cb0a6a1 (diff)
Package reorganization
Diffstat (limited to 'dice-lang/src/bjc/dicelang/StreamEngine.java')
-rw-r--r--dice-lang/src/bjc/dicelang/StreamEngine.java118
1 files changed, 118 insertions, 0 deletions
diff --git a/dice-lang/src/bjc/dicelang/StreamEngine.java b/dice-lang/src/bjc/dicelang/StreamEngine.java
new file mode 100644
index 0000000..2971392
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/StreamEngine.java
@@ -0,0 +1,118 @@
+package bjc.dicelang;
+
+import bjc.utils.funcdata.FunctionalList;
+import bjc.utils.funcdata.IList;
+import bjc.utils.funcutils.ListUtils;
+
+import static bjc.dicelang.Errors.ErrorKey.*;
+
+import bjc.utils.esodata.SingleTape;
+import bjc.utils.esodata.Tape;
+
+public class StreamEngine {
+ private DiceLangEngine eng;
+
+ private Tape<IList<String>> streams;
+ private IList<String> currStream;
+
+ public StreamEngine(DiceLangEngine engine) {
+ eng = engine;
+ }
+
+ private void init() {
+ streams = new SingleTape<>();
+
+ currStream = new FunctionalList<>();
+ streams.insertBefore(currStream);
+ }
+
+ public boolean doStreams(String[] toks, IList<String> dest) {
+ init();
+
+ boolean quoteMode = false;
+
+ for(String tk : toks) {
+ if(tk.startsWith("{@S") && !quoteMode) {
+ if(tk.equals("{@SQ}")) {
+ quoteMode = true;
+ } else if(!processCommand(tk)) {
+ return false;
+ }
+ // Command ran correctly, continue
+ } else {
+ if(tk.equals("{@SU}")) {
+ quoteMode = false;
+ } else if(tk.startsWith("\\") && tk.endsWith("{@SU}")) {
+ currStream.add(tk.substring(1));
+ } else {
+ currStream.add(tk);
+ }
+ }
+ }
+
+ for(String tk : currStream) {
+ dest.add(tk);
+ }
+
+ return true;
+ }
+
+ private boolean processCommand(String tk) {
+ char[] comms = null;
+
+ if(tk.length() > 5) {
+ comms = tk.substring(3, tk.length() - 1).toCharArray();
+ } else {
+ comms = new char[1];
+ comms[0] = tk.charAt(3);
+ }
+
+ for(char comm : comms) {
+ switch(comm) {
+ case '+':
+ streams.insertAfter(new FunctionalList<>());
+ break;
+ case '>':
+ if(!streams.right()) {
+ Errors.inst.printError(EK_STRM_NONEX);
+ return false;
+ }
+
+ currStream = streams.item();
+ break;
+ case '<':
+ if(!streams.left()) {
+ Errors.inst.printError(EK_STRM_NONEX);
+ return false;
+ }
+
+ currStream = streams.item();
+ break;
+ case '-':
+ if(streams.size() == 1) {
+ Errors.inst.printError(EK_STRM_LAST);
+ return false;
+ } else {
+ streams.remove();
+ currStream = streams.item();
+ }
+ break;
+ case 'S':
+ if(streams.size() == 1) {
+ Errors.inst.printError(EK_STRM_LAST);
+ return false;
+ } else {
+ IList<String> stringLit = streams.remove();
+ currStream = streams.item();
+ currStream.add(ListUtils.collapseTokens(stringLit, " "));
+ }
+ break;
+ default:
+ Errors.inst.printError(EK_STRM_INVCOM, tk);
+ return false;
+ }
+ }
+
+ return true;
+ }
+}