package org.basex.util;
import java.util.*;
import org.basex.core.*;
/**
* This class parses command-line arguments provided by a class with main method.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public final class MainParser {
/** User interface. */
private final Main main;
/** Dash flag. */
private boolean dash;
/** Position in current argument. */
private int pos;
/** Current argument. */
private int arg;
/**
* Default constructor.
* @param main calling object
*/
public MainParser(final Main main) {
this.main = main;
}
/**
* Checks if more arguments are available.
* @return result of check
*/
public boolean more() {
// parse all arguments
final String[] args = main.args();
final int arl = args.length;
while(arg < arl) {
// analyze current argument
final String a = args[arg];
if(pos == 0) {
// start from first character
dash = false;
// find first relevant character
final int al = a.length();
while(pos < al) {
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;
}
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() {
final String[] args = main.args();
return arg < args.length && pos < args[arg].length() ? args[arg].charAt(pos++) : 0;
}
/**
* Returns the next string argument.
* @return string
*/
public String string() {
final String[] args = main.args();
final int arl = args.length;
while(arg < arl) {
final String a = args[arg++];
int p = pos;
pos = 0;
final int al = a.length();
if(p == al) continue;
final StringBuilder sb = new StringBuilder();
while(p < al) sb.append(a.charAt(p++));
final String str = sb.toString();
return "-".equals(str) ? 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 = Strings.toInt(string());
if(i < 0) throw usage();
return i;
}
/**
* Returns an exception with the command usage info.
* @return database exception
*/
public BaseXException usage() {
final String name = Util.className(main).toLowerCase(Locale.ENGLISH);
return new BaseXException(main.header() + Prop.NL + "Usage: " + name + main.usage());
}
}