summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/ioutils/format
diff options
context:
space:
mode:
authorbjculkin <bjculkin@mix.wvu.edu>2018-03-01 14:16:15 -0500
committerbjculkin <bjculkin@mix.wvu.edu>2018-03-01 14:16:15 -0500
commit0b373102f64fd7bfd25837a24ffb4ccb44b9d7e9 (patch)
treefe947781da6ca891a3e25a3461f3394a7953d080 /base/src/main/java/bjc/utils/ioutils/format
parent2d8f0aba5565b292f17695afd276143a4f71c72b (diff)
Finish most of CL formatting.
There are a couple of unimplemented directives, but the only ones I'd consider anywhere near crucial would be the floating-point ones, which I'm not sure what I should do with them.
Diffstat (limited to 'base/src/main/java/bjc/utils/ioutils/format')
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java56
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/AestheticDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/AestheticDirective.java)7
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/CharacterDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/CharacterDirective.java)7
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/ConditionalDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/ConditionalDirective.java)7
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/Directive.java (renamed from base/src/main/java/bjc/utils/ioutils/format/Directive.java)5
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/EscapeDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/EscapeDirective.java)8
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/FreshlineDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/FreshlineDirective.java)7
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/GeneralNumberDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/GeneralNumberDirective.java)6
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/GotoDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/GotoDirective.java)7
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/IterationDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/IterationDirective.java)62
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/LiteralDirective.java)7
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/NumberDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/NumberDirective.java)7
-rw-r--r--base/src/main/java/bjc/utils/ioutils/format/directives/RadixDirective.java (renamed from base/src/main/java/bjc/utils/ioutils/format/RadixDirective.java)7
13 files changed, 164 insertions, 29 deletions
diff --git a/base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java b/base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java
index 408bb3b..f3d1777 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java
@@ -2,6 +2,17 @@ package bjc.utils.ioutils.format;
import bjc.utils.esodata.SingleTape;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.directives.AestheticDirective;
+import bjc.utils.ioutils.format.directives.CharacterDirective;
+import bjc.utils.ioutils.format.directives.ConditionalDirective;
+import bjc.utils.ioutils.format.directives.Directive;
+import bjc.utils.ioutils.format.directives.EscapeDirective;
+import bjc.utils.ioutils.format.directives.FreshlineDirective;
+import bjc.utils.ioutils.format.directives.GotoDirective;
+import bjc.utils.ioutils.format.directives.IterationDirective;
+import bjc.utils.ioutils.format.directives.LiteralDirective;
+import bjc.utils.ioutils.format.directives.NumberDirective;
+import bjc.utils.ioutils.format.directives.RadixDirective;
import java.util.HashMap;
import java.util.Map;
@@ -27,9 +38,9 @@ public class CLFormatter {
private static final String directiveName = getRegex("clFormatName");
- private static final String formatDirective = applyFormat("clFormatDirective", prefixList,
- formatMod, directiveName);
- private static final Pattern pFormatDirective = Pattern.compile(formatDirective);
+ private static final String formatDirective = applyFormat("clFormatDirective", prefixList, formatMod,
+ directiveName);
+ private static final Pattern pFormatDirective = Pattern.compile(formatDirective);
private static Map<String, Directive> builtinDirectives;
@@ -59,6 +70,7 @@ public class CLFormatter {
builtinDirectives.put("^", new EscapeDirective());
builtinDirectives.put("[", new ConditionalDirective());
+ builtinDirectives.put("{", new IterationDirective());
}
/**
@@ -68,7 +80,15 @@ public class CLFormatter {
extraDirectives = new HashMap<>();
}
- static void checkItem(Object itm, char directive) {
+ /**
+ * Check that an item is valid for a directive.
+ *
+ * @param itm
+ * The item to check.
+ * @param directive
+ * The directive to check for.
+ */
+ public static void checkItem(Object itm, char directive) {
if(itm == null) throw new IllegalArgumentException(
String.format("No argument provided for %c directive", directive));
}
@@ -92,7 +112,20 @@ public class CLFormatter {
return sb.toString();
}
- void doFormatString(String format, StringBuffer sb, Tape<Object> tParams) {
+ /**
+ * Fill in a partially started format string.
+ *
+ * Used mostly for directives that require formatting again with a
+ * different string.
+ *
+ * @param format
+ * The format to use.
+ * @param sb
+ * The buffer to file output into.
+ * @param tParams
+ * The parameters to use.
+ */
+ public void doFormatString(String format, StringBuffer sb, Tape<Object> tParams) {
Matcher dirMatcher = pFormatDirective.matcher(format);
while(dirMatcher.find()) {
@@ -136,6 +169,8 @@ public class CLFormatter {
case ";":
throw new IllegalArgumentException(
"Found conditional-seperator outside of conditional.");
+ case "}":
+ throw new IllegalArgumentException("Found iteration-end outside of iteration");
case "T":
case "<":
case ">":
@@ -159,6 +194,17 @@ public class CLFormatter {
* punting.
*/
throw new IllegalArgumentException("S and W aren't implemented. Use A instead");
+ case "?":
+ case "(":
+ case "P":
+ throw new IllegalArgumentException("These directives aren't implemented yet");
+ case ")":
+ throw new IllegalArgumentException("Case-conversion end outside of case conversion");
+ case "\n":
+ /*
+ * Ignored newline.
+ */
+ break;
default:
String msg = String.format("Unknown format directive '%s'", dirName);
throw new UnknownFormatConversionException(msg);
diff --git a/base/src/main/java/bjc/utils/ioutils/format/AestheticDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/AestheticDirective.java
index 16d9d12..cbba104 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/AestheticDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/AestheticDirective.java
@@ -1,10 +1,13 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import java.util.regex.Matcher;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
-class AestheticDirective implements Directive {
+public class AestheticDirective implements Directive {
@Override
public void format(StringBuffer sb, Object item, CLModifiers mods, CLParameters params, Tape<Object> tParams,
diff --git a/base/src/main/java/bjc/utils/ioutils/format/CharacterDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/CharacterDirective.java
index 91ddabe..8041cf4 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/CharacterDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/CharacterDirective.java
@@ -1,11 +1,14 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
import java.util.IllegalFormatConversionException;
import java.util.regex.Matcher;
-class CharacterDirective implements Directive {
+public class CharacterDirective implements Directive {
@Override
public void format(StringBuffer buff, Object parm, CLModifiers mods, CLParameters arrParams,
diff --git a/base/src/main/java/bjc/utils/ioutils/format/ConditionalDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/ConditionalDirective.java
index 5ae842c..98c62cb 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/ConditionalDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/ConditionalDirective.java
@@ -1,13 +1,16 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
import java.util.ArrayList;
import java.util.IllegalFormatConversionException;
import java.util.List;
import java.util.regex.Matcher;
-class ConditionalDirective implements Directive {
+public class ConditionalDirective implements Directive {
@Override
public void format(StringBuffer sb, Object item, CLModifiers mods, CLParameters arrParams,
diff --git a/base/src/main/java/bjc/utils/ioutils/format/Directive.java b/base/src/main/java/bjc/utils/ioutils/format/directives/Directive.java
index fb03bbc..6d558fc 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/Directive.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/Directive.java
@@ -1,8 +1,11 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import java.util.regex.Matcher;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
/**
* A CL format directive.
diff --git a/base/src/main/java/bjc/utils/ioutils/format/EscapeDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/EscapeDirective.java
index 8db3a86..ba1acf5 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/EscapeDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/EscapeDirective.java
@@ -1,10 +1,14 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
+import bjc.utils.ioutils.format.EscapeException;
import java.util.regex.Matcher;
-class EscapeDirective implements Directive {
+public class EscapeDirective implements Directive {
@Override
public void format(StringBuffer sb, Object item, CLModifiers mods, CLParameters params,
diff --git a/base/src/main/java/bjc/utils/ioutils/format/FreshlineDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/FreshlineDirective.java
index 8ae0c72..e394a8d 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/FreshlineDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/FreshlineDirective.java
@@ -1,10 +1,13 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
import java.util.regex.Matcher;
-class FreshlineDirective implements Directive {
+public class FreshlineDirective implements Directive {
@Override
public void format(StringBuffer buff, Object item, CLModifiers mods, CLParameters params, Tape<Object> tParams,
diff --git a/base/src/main/java/bjc/utils/ioutils/format/GeneralNumberDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/GeneralNumberDirective.java
index 6a90f94..34abcab 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/GeneralNumberDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/GeneralNumberDirective.java
@@ -1,8 +1,10 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
import bjc.utils.math.NumberUtils;
-abstract class GeneralNumberDirective implements Directive {
+public abstract class GeneralNumberDirective implements Directive {
protected static void handleNumberDirective(StringBuffer buff, CLModifiers mods, CLParameters params,
int argidx, long val, int radix) {
/*
diff --git a/base/src/main/java/bjc/utils/ioutils/format/GotoDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/GotoDirective.java
index 767a77e..f3da9bb 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/GotoDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/GotoDirective.java
@@ -1,10 +1,13 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
import java.util.regex.Matcher;
-class GotoDirective implements Directive {
+public class GotoDirective implements Directive {
@Override
public void format(StringBuffer sb, Object item, CLModifiers mods, CLParameters params,
diff --git a/base/src/main/java/bjc/utils/ioutils/format/IterationDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/IterationDirective.java
index 81ce611..52b2e40 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/IterationDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/IterationDirective.java
@@ -1,11 +1,15 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
+import bjc.utils.esodata.SingleTape;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
import java.util.IllegalFormatConversionException;
import java.util.regex.Matcher;
-class IterationDirective implements Directive {
+public class IterationDirective implements Directive {
@Override
public void format(StringBuffer sb, Object item, CLModifiers mods, CLParameters arrParams, Tape<Object> tParams,
@@ -56,18 +60,70 @@ class IterationDirective implements Directive {
maxItr = arrParams.getInt(0, "maximum iterations", '{');
}
+ int numItr = 0;
+
if(mods.atMod && mods.colonMod) {
+ do {
+ if(numItr > maxItr) break;
+ numItr += 1;
+
+ if(!(iter instanceof Iterable<?>)) {
+ throw new IllegalFormatConversionException('{', iter.getClass());
+ }
- } else if(mods.atMod) {
+ @SuppressWarnings("unchecked")
+ Iterable<Object> nitr = (Iterable<Object>) iter;
+ Tape<Object> nParams = new SingleTape<>(nitr);
+ fmt.doFormatString(frmt, sb, nParams);
+
+ iter = tParams.right();
+ } while(tParams.position() < tParams.size());
+ } else if(mods.atMod) {
+ while(tParams.position() < tParams.size()) {
+ if(numItr > maxItr) break;
+ numItr += 1;
+
+ fmt.doFormatString(frmt, sb, tParams);
+ }
} else if(mods.colonMod) {
if(!(item instanceof Iterable<?>)) {
throw new IllegalFormatConversionException('{', item.getClass());
}
+
+ @SuppressWarnings("unchecked")
+ Iterable<Object> itr = (Iterable<Object>) item;
+
+ for(Object obj : itr) {
+ if(numItr > maxItr) break;
+ numItr += 1;
+
+ if(!(obj instanceof Iterable<?>)) {
+ throw new IllegalFormatConversionException('{', obj.getClass());
+ }
+
+ @SuppressWarnings("unchecked")
+ Iterable<Object> nitr = (Iterable<Object>) obj;
+ Tape<Object> nParams = new SingleTape<>(nitr);
+
+ fmt.doFormatString(frmt, sb, nParams);
+ }
} else {
if(!(item instanceof Iterable<?>)) {
throw new IllegalFormatConversionException('{', item.getClass());
}
+
+ @SuppressWarnings("unchecked")
+ Iterable<Object> itr = (Iterable<Object>) item;
+
+ Tape<Object> nParams = new SingleTape<>(itr);
+
+ while(nParams.position() < nParams.size()) {
+ if(numItr > maxItr) break;
+ numItr += 1;
+
+ fmt.doFormatString(frmt, sb, nParams);
+ }
}
tParams.right();
diff --git a/base/src/main/java/bjc/utils/ioutils/format/LiteralDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java
index 5110a9b..ba00520 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/LiteralDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java
@@ -1,10 +1,13 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
import java.util.regex.Matcher;
-class LiteralDirective implements Directive {
+public class LiteralDirective implements Directive {
private char directive;
private String lit;
diff --git a/base/src/main/java/bjc/utils/ioutils/format/NumberDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/NumberDirective.java
index 28e61ea..98d6c16 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/NumberDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/NumberDirective.java
@@ -1,11 +1,14 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import java.util.IllegalFormatConversionException;
import java.util.regex.Matcher;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
-class NumberDirective extends GeneralNumberDirective {
+public class NumberDirective extends GeneralNumberDirective {
public NumberDirective(int argidx, int radix) {
this.argidx = argidx;
diff --git a/base/src/main/java/bjc/utils/ioutils/format/RadixDirective.java b/base/src/main/java/bjc/utils/ioutils/format/directives/RadixDirective.java
index 668a0bd..428c613 100644
--- a/base/src/main/java/bjc/utils/ioutils/format/RadixDirective.java
+++ b/base/src/main/java/bjc/utils/ioutils/format/directives/RadixDirective.java
@@ -1,12 +1,15 @@
-package bjc.utils.ioutils.format;
+package bjc.utils.ioutils.format.directives;
import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.CLFormatter;
+import bjc.utils.ioutils.format.CLModifiers;
+import bjc.utils.ioutils.format.CLParameters;
import bjc.utils.math.NumberUtils;
import java.util.IllegalFormatConversionException;
import java.util.regex.Matcher;
-class RadixDirective extends GeneralNumberDirective {
+public class RadixDirective extends GeneralNumberDirective {
@Override
public void format(StringBuffer buff, Object arg, CLModifiers mods, CLParameters params, Tape<Object> tParams,