diff options
Diffstat (limited to 'base/src/main/java')
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/AestheticDirective.java | 61 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java (renamed from base/src/main/java/bjc/utils/ioutils/CLFormatter.java) | 123 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/CLModifiers.java | 22 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/CLParameters.java (renamed from base/src/main/java/bjc/utils/ioutils/CLParameters.java) | 2 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/Directive.java | 14 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/EscapeException.java | 15 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/NumberDirective.java | 46 |
7 files changed, 178 insertions, 105 deletions
diff --git a/base/src/main/java/bjc/utils/ioutils/format/AestheticDirective.java b/base/src/main/java/bjc/utils/ioutils/format/AestheticDirective.java new file mode 100644 index 0000000..869834b --- /dev/null +++ b/base/src/main/java/bjc/utils/ioutils/format/AestheticDirective.java @@ -0,0 +1,61 @@ +package bjc.utils.ioutils.format;
+
+import java.util.regex.Matcher;
+
+import bjc.utils.esodata.Tape;
+
+public class AestheticDirective implements Directive {
+
+ @Override
+ public void format(StringBuffer sb, Object item, CLModifiers mods, CLParameters params, Tape<Object> tParams,
+ Matcher dirMatcher) {
+ CLFormatter.checkItem(item, 'A');
+
+ int mincol = 0, colinc = 1, minpad = 0;
+ char padchar = ' ';
+
+ if (params.length() > 1) {
+ mincol = params.getIntDefault(0, "minimum column count", 'A', 0);
+ }
+
+ if (params.length() < 4) {
+ throw new IllegalArgumentException(
+ "Must provide either zero, one or four arguments to A directive");
+ }
+
+ colinc = params.getIntDefault(1, "padding increment", 'A', 1);
+ minpad = params.getIntDefault(2, "minimum amount of padding", 'A', 0);
+ padchar = params.getCharDefault(3, "padding character", 'A', ' ');
+
+ StringBuilder work = new StringBuilder();
+
+ if (mods.atMod) {
+ for (int i = 0; i < minpad; i++) {
+ work.append(padchar);
+ }
+
+ for (int i = work.length(); i < mincol; i++) {
+ for (int k = 0; k < colinc; k++) {
+ work.append(padchar);
+ }
+ }
+ }
+
+ work.append(item.toString());
+
+ if (!mods.atMod) {
+ for (int i = 0; i < minpad; i++) {
+ work.append(padchar);
+ }
+
+ for (int i = work.length(); i < mincol; i++) {
+ for (int k = 0; k < colinc; k++) {
+ work.append(padchar);
+ }
+ }
+ }
+
+ tParams.right();
+ }
+
+}
diff --git a/base/src/main/java/bjc/utils/ioutils/CLFormatter.java b/base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java index 1f65607..8abc0ff 100644 --- a/base/src/main/java/bjc/utils/ioutils/CLFormatter.java +++ b/base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java @@ -1,4 +1,4 @@ -package bjc.utils.ioutils;
+package bjc.utils.ioutils.format;
import java.util.HashMap;
import java.util.IllegalFormatConversionException;
@@ -10,6 +10,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.NumberUtils;
import bjc.utils.esodata.SingleTape;
import static bjc.utils.PropertyDB.applyFormat;
@@ -17,49 +18,6 @@ import static bjc.utils.PropertyDB.applyFormat; import static bjc.utils.PropertyDB.getRegex;
public class CLFormatter {
- public static class CLModifiers {
- public final boolean atMod;
- public final boolean colonMod;
-
- public CLModifiers(boolean at, boolean colon) {
- atMod = at;
- colonMod = colon;
- }
-
- public static CLModifiers fromString(String modString) {
- boolean atMod = false;
- boolean colonMod = false;
- if (modString != null) {
- atMod = modString.contains("@");
- colonMod = modString.contains(":");
- }
-
- return new CLModifiers(atMod, colonMod);
- }
- }
-
- public static class EscapeException extends RuntimeException {
- private static final long serialVersionUID = -4552821131068559005L;
-
- public final boolean endIteration;
-
- public EscapeException() {
- endIteration = false;
- }
-
- public EscapeException(boolean end) {
- endIteration = end;
- }
- }
-
- @FunctionalInterface
- public interface Directive {
- /*
- * @TODO fill in parameters
- */
- public void format();
- }
-
private static final String prefixParam = getRegex("clFormatPrefix");
private static final Pattern pPrefixParam = Pattern.compile(prefixParam);
@@ -73,16 +31,22 @@ public class CLFormatter { directiveName);
private static final Pattern pFormatDirective = Pattern.compile(formatDirective);
+ private static Map<String, Directive> builtinDirectives;
private Map<String, Directive> extraDirectives;
+ static {
+ builtinDirectives = new HashMap<>();
+
+ builtinDirectives.put("A", new AestheticDirective());
+ }
+
public CLFormatter() {
extraDirectives = new HashMap<>();
}
- private static void checkItem(Object itm, char directive) {
+ public static void checkItem(Object itm, char directive) {
if (itm == null)
- throw new IllegalArgumentException(
- String.format("No argument provided for %c directive", directive));
+ throw new IllegalArgumentException(String.format("No argument provided for %c directive", directive));
}
public String formatString(String format, Object... params) {
@@ -117,12 +81,11 @@ public class CLFormatter { continue;
}
+ if (builtinDirectives.containsKey(dirName)) {
+ builtinDirectives.get(dirName).format(sb, item, mods, arrParams, tParams, dirMatcher);
+ }
+
switch (dirName) {
- case "A":
- checkItem(item, 'A');
- handleAestheticDirective(sb, item, mods, arrParams);
- tParams.right();
- break;
case "B":
checkItem(item, 'B');
if (!(item instanceof Number)) {
@@ -189,8 +152,7 @@ public class CLFormatter { case "]":
throw new IllegalArgumentException("Found conditional-end outside of conditional.");
case ";":
- throw new IllegalArgumentException(
- "Found conditional-seperator outside of conditional.");
+ throw new IllegalArgumentException("Found conditional-seperator outside of conditional.");
case "T":
case "<":
case ">":
@@ -266,8 +228,8 @@ public class CLFormatter { }
}
- private void handleNumberDirective(StringBuffer buff, CLModifiers mods, CLParameters params, int argidx,
- long val, int radix) {
+ private void handleNumberDirective(StringBuffer buff, CLModifiers mods, CLParameters params, int argidx, long val,
+ int radix) {
/*
* Initialize the two padding related parameters, and then fill them in from the
* directive parameters if they are present.
@@ -321,8 +283,7 @@ public class CLFormatter { }
} else {
if (params.length() < 1)
- throw new IllegalArgumentException(
- "R directive requires at least one parameter, the radix");
+ throw new IllegalArgumentException("R directive requires at least one parameter, the radix");
int radix = params.getInt(0, "radix", 'R');
@@ -330,52 +291,6 @@ public class CLFormatter { }
}
- private void handleAestheticDirective(StringBuffer buff, Object item, CLModifiers mods, CLParameters params) {
- int mincol = 0, colinc = 1, minpad = 0;
- char padchar = ' ';
-
- if (params.length() > 1) {
- mincol = params.getIntDefault(0, "minimum column count", 'A', 0);
- }
-
- if (params.length() < 4) {
- throw new IllegalArgumentException(
- "Must provide either zero, one or four arguments to A directive");
- }
-
- colinc = params.getIntDefault(1, "padding increment", 'A', 1);
- minpad = params.getIntDefault(2, "minimum amount of padding", 'A', 0);
- padchar = params.getCharDefault(3, "padding character", 'A', ' ');
-
- StringBuilder work = new StringBuilder();
-
- if (mods.atMod) {
- for (int i = 0; i < minpad; i++) {
- work.append(padchar);
- }
-
- for (int i = work.length(); i < mincol; i++) {
- for (int k = 0; k < colinc; k++) {
- work.append(padchar);
- }
- }
- }
-
- work.append(item.toString());
-
- if (!mods.atMod) {
- for (int i = 0; i < minpad; i++) {
- work.append(padchar);
- }
-
- for (int i = work.length(); i < mincol; i++) {
- for (int k = 0; k < colinc; k++) {
- work.append(padchar);
- }
- }
- }
- }
-
private void handleGotoDirective(CLModifiers mods, CLParameters params, Tape<Object> formatParams) {
if (mods.colonMod) {
int num = 1;
diff --git a/base/src/main/java/bjc/utils/ioutils/format/CLModifiers.java b/base/src/main/java/bjc/utils/ioutils/format/CLModifiers.java new file mode 100644 index 0000000..a695f2f --- /dev/null +++ b/base/src/main/java/bjc/utils/ioutils/format/CLModifiers.java @@ -0,0 +1,22 @@ +package bjc.utils.ioutils.format;
+
+public class CLModifiers {
+ public final boolean atMod;
+ public final boolean colonMod;
+
+ public CLModifiers(boolean at, boolean colon) {
+ atMod = at;
+ colonMod = colon;
+ }
+
+ public static CLModifiers fromString(String modString) {
+ boolean atMod = false;
+ boolean colonMod = false;
+ if (modString != null) {
+ atMod = modString.contains("@");
+ colonMod = modString.contains(":");
+ }
+
+ return new CLModifiers(atMod, colonMod);
+ }
+}
\ No newline at end of file diff --git a/base/src/main/java/bjc/utils/ioutils/CLParameters.java b/base/src/main/java/bjc/utils/ioutils/format/CLParameters.java index 9d0c9c6..e3a03f6 100644 --- a/base/src/main/java/bjc/utils/ioutils/CLParameters.java +++ b/base/src/main/java/bjc/utils/ioutils/format/CLParameters.java @@ -1,4 +1,4 @@ -package bjc.utils.ioutils; +package bjc.utils.ioutils.format; import java.util.ArrayList; import java.util.List; diff --git a/base/src/main/java/bjc/utils/ioutils/format/Directive.java b/base/src/main/java/bjc/utils/ioutils/format/Directive.java new file mode 100644 index 0000000..aa6695f --- /dev/null +++ b/base/src/main/java/bjc/utils/ioutils/format/Directive.java @@ -0,0 +1,14 @@ +package bjc.utils.ioutils.format;
+
+import java.util.regex.Matcher;
+
+import bjc.utils.esodata.Tape;
+
+@FunctionalInterface
+public interface Directive {
+ /*
+ * @TODO fill in parameters
+ */
+ public void format(StringBuffer sb, Object item, CLModifiers mods,
+ CLParameters arrParams, Tape<Object> tParams, Matcher dirMatcher);
+}
\ No newline at end of file diff --git a/base/src/main/java/bjc/utils/ioutils/format/EscapeException.java b/base/src/main/java/bjc/utils/ioutils/format/EscapeException.java new file mode 100644 index 0000000..a1df55a --- /dev/null +++ b/base/src/main/java/bjc/utils/ioutils/format/EscapeException.java @@ -0,0 +1,15 @@ +package bjc.utils.ioutils.format;
+
+public class EscapeException extends RuntimeException {
+ private static final long serialVersionUID = -4552821131068559005L;
+
+ public final boolean endIteration;
+
+ public EscapeException() {
+ endIteration = false;
+ }
+
+ public EscapeException(boolean end) {
+ endIteration = end;
+ }
+}
\ No newline at end of file diff --git a/base/src/main/java/bjc/utils/ioutils/format/NumberDirective.java b/base/src/main/java/bjc/utils/ioutils/format/NumberDirective.java new file mode 100644 index 0000000..d5d4b29 --- /dev/null +++ b/base/src/main/java/bjc/utils/ioutils/format/NumberDirective.java @@ -0,0 +1,46 @@ +package bjc.utils.ioutils.format;
+
+import java.util.regex.Matcher;
+
+import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.NumberUtils;
+
+public class NumberDirective implements Directive {
+
+ @Override
+ public void format(StringBuffer sb, Object item, CLModifiers mods, CLParameters params, Tape<Object> tParams,
+ Matcher dirMatcher) {
+ /*
+ * Initialize the two padding related parameters, and then fill them in from the
+ * directive parameters if they are present.
+ */
+ int mincol = 0;
+ char padchar = ' ';
+ if (params.length() > (argidx + 2)) {
+ mincol = params.getIntDefault(argidx + 1, "minimum column count", 'R', 0);
+ }
+ if (params.length() > (argidx + 3)) {
+ padchar = params.getCharDefault(argidx + 2, "padding character", 'R', ' ');
+ }
+
+ if (mods.colonMod) {
+ /*
+ * We're doing commas, so check if the two comma-related parameters were
+ * supplied.
+ */
+ int commaInterval = 0;
+ char commaChar = ',';
+ if (params.length() > (argidx + 3)) {
+ commaChar = params.getCharDefault((argidx + 3), "comma character", 'R', ' ');
+ }
+ if (params.length() > (argidx + 4)) {
+ commaInterval = params.getIntDefault((argidx + 4), "comma interval", 'R', 0);
+ }
+
+ NumberUtils.toCommaString(val, mincol, padchar, commaInterval, commaChar, mods.atMod, radix);
+ } else {
+ NumberUtils.toNormalString(val, mincol, padchar, mods.atMod, radix);
+ }
+ }
+
+}
|
