summaryrefslogtreecommitdiff
path: root/clformat/src
diff options
context:
space:
mode:
Diffstat (limited to 'clformat/src')
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java14
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java21
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java25
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java4
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java6
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java8
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java43
7 files changed, 91 insertions, 30 deletions
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java b/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java
index b89a706..3ed7e2e 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java
@@ -1,15 +1,9 @@
package bjc.utils.ioutils.format;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import bjc.utils.esodata.AbbrevMap;
-import bjc.utils.esodata.Tape;
-import bjc.utils.parserutils.TokenUtils;
+import java.util.*;
+
+import bjc.utils.esodata.*;
+import bjc.utils.parserutils.*;
/**
* Represents a set of parameters to a CL format directive.
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java b/clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java
index 50aa681..595eee5 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java
@@ -40,6 +40,27 @@ public interface CLValue {
* The parameters passed to the directive.
*/
public String getValue(Tape<Object> params);
+
+ static String MSG_FMT = "Invalid %s \"%s\" to %s directive";
+
+ public default int asInt(Tape<Object> params, String paramName, String directive, int def) {
+ String param = getValue(params);
+
+ if (!param.equals("")) {
+ try {
+ return Integer.parseInt(param);
+ } catch(NumberFormatException nfex) {
+ String msg = String.format(MSG_FMT, paramName, param, directive);
+
+ IllegalArgumentException iaex = new IllegalArgumentException(msg);
+ iaex.initCause(nfex);
+
+ throw iaex;
+ }
+ }
+
+ return def;
+ }
}
class PercValue implements CLValue {
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java
index 34c3c0b..1cfae14 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java
@@ -1,10 +1,35 @@
package bjc.utils.ioutils.format.directives;
+import java.util.*;
+
+import bjc.utils.esodata.*;
+import bjc.utils.ioutils.format.*;
+
/**
* Encapsulates the state necessary for compiling Directives into Edicts.
*
* @author Ben Culkin
*/
public class CompileContext {
+ /**
+ * The stream of parsed directives.
+ */
+ public Iterator<Decree> directives;
+
+ /**
+ * The configured formatter instance we are using.
+ */
+ public CLFormatter formatter;
+
+ /**
+ * The decree that is currently being parsed.
+ */
+ public Decree decr;
+ public CompileContext(Iterator<Decree> dirs, CLFormatter fmt, Decree dcr) {
+ directives = dirs;
+ formatter = fmt;
+
+ decr = dcr;
+ }
}
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java
index 50134b2..e037f06 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java
@@ -1,5 +1,7 @@
package bjc.utils.ioutils.format.directives;
+import java.io.*;
+
/**
*
* The compiled equivalent of {@link Directive}.
@@ -14,5 +16,5 @@ public interface Edict {
* @param formCTX
* The state needed for this invocation.
*/
- public void format(FormatContext formCTX);
+ public void format(FormatContext formCTX) throws IOException;
}
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java
index 95c984b..e17a655 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java
@@ -20,4 +20,10 @@ public class FormatContext {
* The parameters passed into invocation of formatting.
*/
public Tape<Object> items;
+
+ public FormatContext(ReportWriter rw, Tape<Object> itms) {
+ writer = rw;
+
+ items = itms;
+ }
}
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java
index b641cde..7604c77 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java
@@ -41,4 +41,12 @@ public class FormatParameters {
public CLModifiers getMods() {
return decr.modifiers;
}
+
+ public CompileContext toCompileCTX() {
+ return new CompileContext(dirIter, fmt, decr);
+ }
+
+ public FormatContext toFormatCTX() {
+ return new FormatContext(rw, tParams);
+ }
}
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java
index 7a53d90..be7dbd7 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java
@@ -29,29 +29,24 @@ public class LiteralDirective implements Directive {
@Override
public void format(FormatParameters dirParams) throws IOException {
- int nTimes = 1;
-
- CLParameters params = dirParams.getParams();
-
- if (params.length() >= 1) {
- params.mapIndices("count");
-
- nTimes = params.getInt(dirParams.tParams, "count", "occurance count", directive, 1);
- }
-
- for (int i = 0; i < nTimes; i++) {
- dirParams.rw.write(lit);
- }
+ Edict edt = compile(dirParams.toCompileCTX());
+ edt.format(dirParams.toFormatCTX());
}
@Override
public Edict compile(CompileContext compCTX) {
- int nTimes = 1;
+ CLValue nTimes = null;
- LiteralEdict edict = new LiteralEdict(lit, nTimes);
+ CLParameters params = compCTX.decr.parameters;
- return edict;
+ if (params.length() >= 1) {
+ params.mapIndices("count");
+
+ nTimes = params.resolveKey("count");
+ }
+
+ return new LiteralEdict(lit, nTimes);
}
}
@@ -60,14 +55,24 @@ public class LiteralDirective implements Directive {
*/
class LiteralEdict implements Edict {
private String lit;
- private int nTimes;
+ private CLValue nTimes;
- public LiteralEdict(String lit, int nTimes) {
+ public LiteralEdict(String lit, CLValue nTimes) {
+ this.lit = lit;
+ this.nTimes = nTimes;
}
@Override
- public void format(FormatContext formCTX) {
+ public void format(FormatContext formCTX) throws IOException {
+ int num = 1;
+
+ if (nTimes != null) {
+ num = nTimes.asInt(formCTX.items, "occurance count", "literal", 1);
+ }
+ for (int i = 0; i < num; i++) {
+ formCTX.writer.write(lit);
+ }
}
}