summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils
diff options
context:
space:
mode:
Diffstat (limited to 'base/src/main/java/bjc/utils')
-rw-r--r--base/src/main/java/bjc/utils/data/TopDownTransformIterator.java141
-rw-r--r--base/src/main/java/bjc/utils/esodata/SingleTape.java14
-rw-r--r--base/src/main/java/bjc/utils/funcutils/StringUtils.java19
-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
16 files changed, 284 insertions, 83 deletions
diff --git a/base/src/main/java/bjc/utils/data/TopDownTransformIterator.java b/base/src/main/java/bjc/utils/data/TopDownTransformIterator.java
index d4a676c..1e69071 100644
--- a/base/src/main/java/bjc/utils/data/TopDownTransformIterator.java
+++ b/base/src/main/java/bjc/utils/data/TopDownTransformIterator.java
@@ -16,6 +16,14 @@ import java.util.function.Function;
* Figure out what is broken with this, and fix it so that step-wise
* iteration works correctly.
*/
+/**
+ * An iterative top-down transform of a tree.
+ *
+ * @author EVE
+ *
+ * @param <ContainedType>
+ * The type of the nodes in the tree.
+ */
public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<ContainedType>> {
private final Function<ContainedType, TopDownTransformResult> picker;
private final BiFunction<ITree<ContainedType>, Consumer<Iterator<ITree<ContainedType>>>, ITree<ContainedType>> transform;
@@ -34,6 +42,16 @@ public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<C
private final Deque<Iterator<ITree<ContainedType>>> toYield;
private Iterator<ITree<ContainedType>> curYield;
+ /**
+ * Create a new tree iterator.
+ *
+ * @param pickr
+ * The function to use to pick how to process nodes.
+ * @param transfrm
+ * The transform to apply to the nodes.
+ * @param tree
+ * The tree to transform.
+ */
public TopDownTransformIterator(final Function<ContainedType, TopDownTransformResult> pickr,
final BiFunction<ITree<ContainedType>, Consumer<Iterator<ITree<ContainedType>>>, ITree<ContainedType>> transfrm,
final ITree<ContainedType> tree) {
@@ -50,6 +68,12 @@ public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<C
initial = true;
}
+ /**
+ * Add a set of nodes to yield.
+ *
+ * @param src
+ * The nodes to yield.
+ */
public void addYield(final Iterator<ITree<ContainedType>> src) {
if(curYield != null) {
toYield.push(curYield);
@@ -63,25 +87,34 @@ public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<C
return !done;
}
+ /**
+ * Get the next yielded value.
+ *
+ * @param val
+ * The sentinel value to yield.
+ * @return The next yielded value.
+ */
public ITree<ContainedType> flushYields(final ITree<ContainedType> val) {
if(curYield != null) {
toYield.add(new SingleIterator<>(val));
- if(curYield.hasNext())
+ if(curYield.hasNext()) {
return curYield.next();
- else {
- while(toYield.size() != 0 && !curYield.hasNext()) {
- curYield = toYield.pop();
- }
+ }
- if(toYield.size() == 0 && !curYield.hasNext()) {
- curYield = null;
- return val;
- } else
- return curYield.next();
+ while(toYield.size() != 0 && !curYield.hasNext()) {
+ curYield = toYield.pop();
}
- } else
- return val;
+
+ if(toYield.size() == 0 && !curYield.hasNext()) {
+ curYield = null;
+ return val;
+ }
+
+ return curYield.next();
+ }
+
+ return val;
}
@Override
@@ -89,17 +122,18 @@ public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<C
if(done) throw new NoSuchElementException();
if(curYield != null) {
- if(curYield.hasNext())
+ if(curYield.hasNext()) {
return curYield.next();
- else {
- while(toYield.size() != 0 && !curYield.hasNext()) {
- curYield = toYield.pop();
- }
+ }
+
+ while(toYield.size() != 0 && !curYield.hasNext()) {
+ curYield = toYield.pop();
+ }
- if(toYield.size() == 0 && !curYield.hasNext()) {
- curYield = null;
- } else
- return curYield.next();
+ if(toYield.size() == 0 && !curYield.hasNext()) {
+ curYield = null;
+ } else {
+ return curYield.next();
}
}
@@ -117,10 +151,10 @@ public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<C
// Return whatever the first child is
break;
- } else {
- done = true;
- return flushYields(postParent);
}
+
+ done = true;
+ return flushYields(postParent);
case SKIP:
done = true;
return flushYields(preParent);
@@ -138,11 +172,10 @@ public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<C
// Return whatever the first child is
break;
- } else {
- done = true;
- return flushYields(transform.apply(new Tree<>(preParent.getHead()),
- this::addYield));
}
+
+ done = true;
+ return flushYields(transform.apply(new Tree<>(preParent.getHead()), this::addYield));
case PULLUP:
final ITree<ContainedType> intRes = transform.apply(preParent, this::addYield);
@@ -155,10 +188,10 @@ public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<C
// Return whatever the first child is
break;
- } else {
- done = true;
- return flushYields(postParent);
}
+
+ done = true;
+ return flushYields(postParent);
default:
throw new IllegalArgumentException("Unknown result type " + res);
}
@@ -177,38 +210,38 @@ public class TopDownTransformIterator<ContainedType> implements Iterator<ITree<C
postChildren.add(res);
return flushYields(res);
- } else {
- ITree<ContainedType> res = null;
-
- if(postParent == null) {
- res = new Tree<>(preParent.getHead());
+ }
- System.out.println("\t\tTRACE: adding nodes " + postChildren + " to " + res);
+ ITree<ContainedType> res = null;
- for(final ITree<ContainedType> child : postChildren) {
- res.addChild(child);
- }
+ if(postParent == null) {
+ res = new Tree<>(preParent.getHead());
- // res = transform.apply(res,
- // this::addYield);
- } else {
- res = postParent;
+ System.out.println("\t\tTRACE: adding nodes " + postChildren + " to " + res);
- System.out.println("\t\tTRACE: adding nodes " + postChildren + " to " + res);
- for(final ITree<ContainedType> child : postChildren) {
- res.addChild(child);
- }
+ for(final ITree<ContainedType> child : postChildren) {
+ res.addChild(child);
}
- done = true;
- return flushYields(res);
+ // res = transform.apply(res,
+ // this::addYield);
+ } else {
+ res = postParent;
+
+ System.out.println("\t\tTRACE: adding nodes " + postChildren + " to " + res);
+ for(final ITree<ContainedType> child : postChildren) {
+ res.addChild(child);
+ }
}
- } else {
- final ITree<ContainedType> res = curChild.next();
- System.out.println("\t\tTRACE: adding node " + res + " to children");
- postChildren.add(res);
+ done = true;
return flushYields(res);
}
+
+ final ITree<ContainedType> res = curChild.next();
+ System.out.println("\t\tTRACE: adding node " + res + " to children");
+ postChildren.add(res);
+
+ return flushYields(res);
}
}
diff --git a/base/src/main/java/bjc/utils/esodata/SingleTape.java b/base/src/main/java/bjc/utils/esodata/SingleTape.java
index 5218269..287f22d 100644
--- a/base/src/main/java/bjc/utils/esodata/SingleTape.java
+++ b/base/src/main/java/bjc/utils/esodata/SingleTape.java
@@ -56,6 +56,20 @@ public class SingleTape<T> implements Tape<T> {
}
/**
+ * Create a new tape with values taken from an iterable.
+ *
+ * @param itr
+ * The iterable to get values from.
+ */
+ public SingleTape(Iterable<T> itr) {
+ this(false);
+
+ for(T itm : itr) {
+ backing.add(itm);
+ }
+ }
+
+ /**
* Create a new empty tape that follows the specified auto-extension
* policy.
*
diff --git a/base/src/main/java/bjc/utils/funcutils/StringUtils.java b/base/src/main/java/bjc/utils/funcutils/StringUtils.java
index e753abd..0080dd1 100644
--- a/base/src/main/java/bjc/utils/funcutils/StringUtils.java
+++ b/base/src/main/java/bjc/utils/funcutils/StringUtils.java
@@ -205,4 +205,23 @@ public class StringUtils {
return num;
}
+
+ /**
+ * Get a substring until a specified string.
+ *
+ * @param strang
+ * The string to substring.
+ * @param vx
+ * The place to substring until.
+ * @return The specified substring.
+ */
+ public static String substringTo(String strang, String vx) {
+ int idx = strang.indexOf(vx);
+
+ if(idx == -1) {
+ return strang;
+ }
+
+ return strang.substring(0, strang.indexOf(vx));
+ }
}
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,