diff options
Diffstat (limited to 'base/src/main/java/bjc/utils/ioutils/format')
| -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 |
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, |
