From 49cd96c4c5bbb883c0c5c10d7916ad2e93ff2df0 Mon Sep 17 00:00:00 2001 From: bjculkin Date: Sat, 10 Feb 2018 00:00:07 -0500 Subject: Update and refactor CL formatting --- .../utils/ioutils/format/ConditionalDirective.java | 117 +++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 base/src/main/java/bjc/utils/ioutils/format/ConditionalDirective.java (limited to 'base/src/main/java/bjc/utils/ioutils/format/ConditionalDirective.java') diff --git a/base/src/main/java/bjc/utils/ioutils/format/ConditionalDirective.java b/base/src/main/java/bjc/utils/ioutils/format/ConditionalDirective.java new file mode 100644 index 0000000..5ae842c --- /dev/null +++ b/base/src/main/java/bjc/utils/ioutils/format/ConditionalDirective.java @@ -0,0 +1,117 @@ +package bjc.utils.ioutils.format; + +import bjc.utils.esodata.Tape; + +import java.util.ArrayList; +import java.util.IllegalFormatConversionException; +import java.util.List; +import java.util.regex.Matcher; + +class ConditionalDirective implements Directive { + + @Override + public void format(StringBuffer sb, Object item, CLModifiers mods, CLParameters arrParams, + Tape formatParams, Matcher dirMatcher, CLFormatter fmt) { + StringBuffer condBody = new StringBuffer(); + + List clauses = new ArrayList<>(); + String defClause = null; + boolean isDefault = false; + + while(dirMatcher.find()) { + /* Process a list of clauses. */ + String dirName = dirMatcher.group("name"); + String dirMods = dirMatcher.group("modifiers"); + + if(dirName != null) { + /* Append everything up to this directive. */ + dirMatcher.appendReplacement(condBody, ""); + + if(dirName.equals("]")) { + /* End the conditional. */ + String clause = condBody.toString(); + if(isDefault) { + defClause = clause; + } else { + clauses.add(clause); + } + + break; + } else if(dirName.equals(";")) { + /* End the clause. */ + String clause = condBody.toString(); + if(isDefault) { + defClause = clause; + } else { + clauses.add(clause); + } + + /* + * Mark the next clause as the default. + */ + if(dirMods.contains(":")) { + isDefault = true; + } + } else { + /* Not a special directive. */ + condBody.append(dirMatcher.group()); + } + } + } + + Object par = formatParams.item(); + if(mods.colonMod) { + formatParams.right(); + + if(par == null) { + throw new IllegalArgumentException("No parameter provided for [ directive."); + } else if(!(par instanceof Boolean)) { + throw new IllegalFormatConversionException('[', par.getClass()); + } + boolean res = (Boolean) par; + + String frmt; + if(res) + frmt = clauses.get(1); + else + frmt = clauses.get(0); + + fmt.doFormatString(frmt, sb, formatParams); + } else if(mods.atMod) { + if(par == null) { + throw new IllegalArgumentException("No parameter provided for [ directive."); + } else if(!(par instanceof Boolean)) { + throw new IllegalFormatConversionException('[', par.getClass()); + } + boolean res = (Boolean) par; + + if(res) { + fmt.doFormatString(clauses.get(0), sb, formatParams); + } else { + formatParams.right(); + } + } else { + int res; + if(arrParams.length() > 1) { + res = arrParams.getInt(0, "conditional choice", '['); + } else { + if(par == null) { + throw new IllegalArgumentException("No parameter provided for [ directive."); + } else if(!(par instanceof Number)) { + throw new IllegalFormatConversionException('[', par.getClass()); + } + res = ((Number) par).intValue(); + + formatParams.right(); + } + + if(res < 0 || res > clauses.size()) { + if(defClause != null) fmt.doFormatString(defClause, sb, formatParams); + } else { + fmt.doFormatString(clauses.get(res), sb, formatParams); + } + } + return; + } + +} -- cgit v1.2.3