diff options
| author | student <student@69.161.224.52> | 2018-02-09 11:52:03 -0500 |
|---|---|---|
| committer | student <student@69.161.224.52> | 2018-02-09 11:52:03 -0500 |
| commit | 92ec9adfcb115fe86d5ba27fcc089db027374d6a (patch) | |
| tree | 3ebbce2d97c9fd9fd1ce29959210a6bf2fc8f5dd /base/src/main/java/bjc/utils/ioutils/format/CLParameters.java | |
| parent | 46c1a3e1e7cf21f3c63dcb028fd1807e870dfbef (diff) | |
Work on CL format strings
Diffstat (limited to 'base/src/main/java/bjc/utils/ioutils/format/CLParameters.java')
| -rw-r--r-- | base/src/main/java/bjc/utils/ioutils/format/CLParameters.java | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/ioutils/format/CLParameters.java b/base/src/main/java/bjc/utils/ioutils/format/CLParameters.java new file mode 100644 index 0000000..e3a03f6 --- /dev/null +++ b/base/src/main/java/bjc/utils/ioutils/format/CLParameters.java @@ -0,0 +1,116 @@ +package bjc.utils.ioutils.format; + +import java.util.ArrayList; +import java.util.List; + +import bjc.utils.esodata.Tape; + +/** + * Represents a set of parameters to a CL format directive. + * + * @author Benjamin Culkin + */ +public class CLParameters { + private String[] params; + + public CLParameters(String[] params) { + this.params = params; + } + + public int length() { + return params.length; + } + + /** + * Creates a set of parameters from an array of parameters. + * + * Mostly, this just fills in V and # parameters. + * + * @param params + * The parameters of the directive. + * @param dirParams + * The parameters of the format string. + * + * @return A set of CL parameters. + */ + public static CLParameters fromDirective(String[] params, Tape<Object> dirParams) { + List<String> parameters = new ArrayList<>(); + + for (String param : params) { + if (param.equalsIgnoreCase("V")) { + Object par = dirParams.item(); + boolean succ = dirParams.right(); + + if (!succ) { + throw new IllegalStateException("Couldn't advance tape for parameter"); + } + + if (par == null) { + throw new IllegalArgumentException( + "Expected a format parameter for V inline parameter"); + } + + if (par instanceof Number) { + int val = ((Number) par).intValue(); + + parameters.add(Integer.toString(val)); + } else if (par instanceof Character) { + char ch = ((Character) par); + + parameters.add(Character.toString(ch)); + } else { + throw new IllegalArgumentException( + "Incorrect type of parameter for V inline parameter"); + } + } else if (param.equals("#")) { + parameters.add(Integer.toString(dirParams.position())); + } else { + parameters.add(param); + } + } + + return new CLParameters(parameters.toArray(new String[0])); + } + + public char getCharDefault(int idx, String paramName, char directive, char def) { + if (!params[idx].equals("")) { + return getChar(idx, paramName, directive); + } + + return def; + } + + public char getChar(int idx, String paramName, char directive) { + String param = params[idx]; + + if (!param.startsWith("'")) { + throw new IllegalArgumentException( + String.format("Invalid %s %s to %c directive", paramName, param, directive)); + } + + return param.charAt(1); + } + + public int getIntDefault(int idx, String paramName, char directive, int def) { + if (!params[idx].equals("")) { + + } + + return def; + } + + public int getInt(int idx, String paramName, char directive) { + String param = params[idx]; + + try { + return Integer.parseInt(param); + } catch (NumberFormatException nfex) { + String msg = String.format("Invalid %s %s to %c directive", paramName, param, directive); + + IllegalArgumentException iaex = new IllegalArgumentException(msg); + iaex.initCause(nfex); + + throw iaex; + } + } +} |
