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;        
    }
}