summaryrefslogtreecommitdiff
path: root/clformat/src/main/java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-09-20 12:39:55 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-09-20 12:43:14 -0300
commit4315f2e25269b1f744111f6e162c7d8ebac6bd3c (patch)
tree3de04a7c84cb10f2e3c38fb49c1a7dff289b4d85 /clformat/src/main/java
parente5b2d4f2220b6f35e19211ee85c6b68c98f4672c (diff)
Allow abbreviating parameters
Named parameter names can now be abbreviated to anything that is unambiguous with all the other named parameters for that directive.
Diffstat (limited to 'clformat/src/main/java')
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java75
1 files changed, 73 insertions, 2 deletions
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java b/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java
index 3364738..0db2c9b 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java
@@ -2,9 +2,12 @@ package bjc.utils.ioutils.format;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import bjc.utils.esodata.AbbrevMap;
import bjc.utils.esodata.Tape;
import bjc.utils.parserutils.TokenUtils;
@@ -21,6 +24,9 @@ public class CLParameters {
private String[] params;
+ private Set<String> abbrevWords;
+ private AbbrevMap nameAbbrevs;
+
private Map<String, String> namedParams;
private Map<String, Integer> nameIndices;
@@ -43,6 +49,40 @@ public class CLParameters {
this.namedParams = namedParams;
this.nameIndices = new HashMap<>();
+
+ abbrevWords = new HashSet<>();
+ nameAbbrevs = new AbbrevMap();
+
+ refreshAbbrevs();
+ }
+
+ private void refreshAbbrevs() {
+ // @NOTE 9/19/18
+ //
+ // This never clears abbrevWords or nameAbbrevs, which I'm fine
+ // with here, as these objects are fairly temporary.
+ //
+ // If it becomes an issue, I'll resolve it
+ for (String key : namedParams.keySet()) {
+ if (abbrevWords.contains(key)) continue;
+
+ abbrevWords.add(key);
+ nameAbbrevs.addWords(key);
+ }
+
+ for (String key : nameIndices.keySet()) {
+ if (abbrevWords.contains(key)) continue;
+
+ abbrevWords.add(key);
+ nameAbbrevs.addWords(key);
+ }
+ }
+
+ private void refreshAbbrev(String key) {
+ if (abbrevWords.contains(key)) return;
+
+ abbrevWords.add(key);
+ nameAbbrevs.addWords(key);
}
public void mapIndices(String... opts) {
@@ -51,14 +91,23 @@ public class CLParameters {
if (!opt.equals("")) mapIndex(opt, i);
}
+
+ refreshAbbrevs();
}
public void mapIndex(String opt, int idx) {
+ mapIndex(opt, idx, true);
+ }
+
+ private void mapIndex(String opt, int idx, boolean doRefresh) {
if (params.length <= idx) System.err.printf("WARN: Mapping invalid index %d (max %d) to \"%s\"\n", idx, params.length, opt.toUpperCase());
+
nameIndices.put(opt.toUpperCase(), idx);
+
+ if (doRefresh) refreshAbbrevs();
}
- public String getRaw(int idx) {
+ public String getByIndex(int idx) {
if (idx < 0 || idx >= params.length) return "Out of Bounds";
return params[idx];
@@ -205,7 +254,29 @@ public class CLParameters {
}
private String resolveKey(String key) {
- String actKey = key.toUpperCase();
+ String ucKey = key.toUpperCase();
+
+ if (!abbrevWords.contains(ucKey)) refreshAbbrev(ucKey);
+
+ String[] keys = nameAbbrevs.deabbrev(ucKey);
+ if (keys.length > 1) {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("Ambiguous parameter name \"");
+ sb.append(ucKey);
+ sb.append("\". Could've meant: ");
+ for (int i = 0; i < keys.length; i++) {
+ sb.append("\"");
+ sb.append(keys[i]);
+ sb.append("\"");
+ if (i < keys.length - 1) sb.append(", ");
+ }
+ sb.append(".");
+
+ throw new IllegalArgumentException(sb.toString());
+ }
+
+ String actKey = keys[0];
if (nameIndices.containsKey(actKey)) return params[nameIndices.get(actKey)];
else if (namedParams.containsKey(actKey)) return namedParams.get(actKey);