import java.util.HashMap;
/**
* Getopts is similar to the UN*X getopt() system call. It parses an array of
* Strings (usually the command line), looking for specified option flags and
* values.
*
* An instance of Getopts parses the whole args list at once, and stores the
* option flags and values that it finds.
*
* @author Jim Menard,
* jimm@io.com
*/
public class Getopts {
String[] argv;
HashMap options = new HashMap();
boolean errorFlag = false;
/**
* This constructor takes a list of legal options and a list of (usually
* command line) arguments. Each option in optionListString may be followed
* by a ':' to signify that option takes an argument.
*
* @param optionListString option chars with optional ':' specifying arg.
* For example, "ab:c" specifies three options, a, b, and c. Option b takes
* a (required) argument.
* @param args array of command line arguments
*/
public Getopts(String optionListString, String[] args) {
String optChoices = optionListString;
for (int index = 0; index < args.length; ++index) {
String arg = args[index];
if (arg.startsWith("-")) {
char optionChar = arg.charAt(1);
int optionLoc = optChoices.indexOf(optionChar);
if (optionLoc == -1)
errorFlag = true;
else {
// Look for argument, if any
boolean hasArgument =
optChoices.length() > optionLoc + 1 &&
optChoices.charAt(optionLoc + 1) == ':';
if (hasArgument) {
String optarg = arg.substring(2);
if (optarg.equals("")) {
++index;
try {
optarg = args[index];
}
catch (Exception e) { // Catch ArrayOutOfBounds
optarg = "";
errorFlag = true;
}
}
options.put(new Character(optionChar), optarg);
}
else {
// No arg, store empty string
options.put(new Character(optionChar), "");
}
}
}
else { // End of options. Store rest of args
argv = new String[args.length - index];
int offset = index;
while (index < args.length) {
argv[index - offset] = args[index];
++index;
}
break;
}
}
}
/**
*
* Return true if there was an error while parsing the command line.
*/
public boolean error() {
return errorFlag;
}
/**
* Returns existence of an option.
*
* @return true of option 'c' exists, else return false.
* @param c any character
*/
public boolean hasOption(char c) {
if (options == null)
return false;
return options.containsKey(new Character(c));
}
/**
* Return an option or, if missing, the empty string.
*
* @return option string, or "" if error or option has no argument
* @param c the option whose value is returned
*/
public String option(char c) {
return option(c, "");
}
/**
* Return an option or, if missing, a default value.
*
* @return option string, or defaultValue if error or option has no argument
* @param c the option whose value is returned
* @param defaultValue the value to return if there is no such option
*/
public String option(char c, String defaultValue) {
if (options == null)
return defaultValue;
String s;
try {
Object o = options.get(new Character(c));
if (o == null || !(o instanceof String))
s = defaultValue;
else
s = (String)o;
}
catch (Exception e) {
s = defaultValue;
}
return s;
}
/**
* Return the remaining command-line arguments.
*
* @return an array of Strings
* @see #argc
* @see #argv
*/
public String[] args() {
return argv;
}
/**
* Return the number of non-option args.
*/
public int argc() {
if (argv == null)
return 0;
return argv.length;
}
/**
* Return a command line argument or "" if argv is
* null
. Index starts at 0.
*
* @param index which argument to return
* @return the index'th arg or "" if argv is null
*/
public String argv(int index) {
if (argv == null)
return "";
return argv[index];
}
}