java/ch/wlkl/wsh/Option.java
package ch.wlkl.wsh;
public class Option extends Top {
static final String defMark = "-";
final String mark;
final String singleOpts;
final String valueOpts;
public static String single(Object obj) {
if (obj == null || ! (obj instanceof String))
return null;
String opt = (String) obj;
return opt.startsWith(defMark) ? opt.substring(defMark.length()) : null;
}
public Option (String ma, String si, String va) {
mark = ma;
singleOpts = si;
valueOpts = va;
}
public Option (String si, String va) {
this(defMark, si, va);
}
public Option (String si) {
this(defMark, si, "");
}
public String analyzeMsg(String src, String [] res) {
if (src == null) {
res[0] = res[1] = null;
return " ";
} else if (mark.length() > 0 && ! src.startsWith(mark)) {
res[0] = null;
res[1] = src;
} else {
int cx = mark.length();
while (cx < src.length() && singleOpts.indexOf(src.charAt(cx)) >= 0)
cx++;
if (cx >= src.length()) {
res[1] = null;
} else if (valueOpts.indexOf(src.charAt(cx)) >= 0) {
res[1] = src.substring(++cx);
} else {
res[0] = res[1] = null;
return "ebad option '" + src.charAt(cx) + "' neither in singleOpts " + singleOpts + " nor in valueOpts " + valueOpts;
}
res[0] = src.substring(mark.length(), cx);
}
return res[0] == null ? "v" : "o";
}
public boolean analyze(String src, String [] res) {
String r = analyzeMsg(src, res);
if (r.charAt(0) == 'e')
fail(r + " in " + src);
return r.charAt(0) == 'o';
}
public static int intOpt(String [] o) {
int r = 0;
try {
r = Integer.parseInt(o[1]);
} catch (NumberFormatException e) {
sFail(o[1] + "not a number for value opt '" + o[0] + "': " + e);
}
return r;
}
}