package org.basex.util; import java.util.Locale; import java.util.Scanner; import org.basex.core.BaseXException; /** * This class parses command-line arguments. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class Args { /** Calling object. */ private final Object obj; /** Program header. */ private final String header; /** Usage info. */ private final String usage; /** Command-line arguments. */ private final String[] args; /** Dash flag. */ private boolean dash; /** Position in current argument. */ private int pos; /** Current argument. */ private int arg; /** * Default constructor. * @param a arguments * @param o calling object * @param u usage info * @param h header */ public Args(final String[] a, final Object o, final String u, final String h) { args = a; usage = u; obj = o; header = h; } /** * Checks if more arguments are available. * @return result of check */ public boolean more() { // parse all arguments while(arg < args.length) { // analyze current argument final String a = args[arg]; if(pos == 0) { // start from first character dash = false; // find first relevant character while(pos < a.length()) { final char ch = a.charAt(pos); if(ch == '-') { // treat input as flag dash = true; } else if(ch != ' ') { // ignore spaces return true; } pos++; } // treat input as string pos = 0; dash = false; return true; } else if(pos < a.length()) { // check next character return true; } arg++; pos = 0; } // all arguments have been parsed return false; } /** * Checks if the current argument starts with a dash * (i.e., introduces any flags). * @return result of check */ public boolean dash() { return dash; } /** * Returns the next flag. * @return next flag */ public char next() { return arg < args.length && pos < args[arg].length() ? args[arg].charAt(pos++) : 0; } /** * Returns the next string argument. * @return string */ public String string() { while(arg < args.length) { final String a = args[arg++]; int p = pos; pos = 0; if(p == a.length()) continue; final StringBuilder sb = new StringBuilder(); while(p < a.length()) sb.append(a.charAt(p++)); final String str = sb.toString(); return str.equals("-") ? new Scanner(System.in).useDelimiter("\0").next() : str; } return ""; } /** * Returns the next positive numeric argument. * @return positive integer * @throws BaseXException database exception */ public int number() throws BaseXException { final int i = Token.toInt(string()); if(i < 0) usage(); return i; } /** * Throws an exception with the command usage info. * @throws BaseXException database exception */ public void usage() throws BaseXException { throw new BaseXException(header + "Usage: " + Util.name(obj).toLowerCase(Locale.ENGLISH) + usage); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); for(final String s : args) sb.append(s).append(' '); return sb.toString(); } }