diff options
| -rw-r--r-- | base/src/main/java/bjc/utils/data/TopDownTransformIterator.java | 141 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/esodata/SingleTape.java | 14 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/funcutils/StringUtils.java | 19 | ||||
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/CLFormatter.java | 56 | ||||
| -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, |
