in compiler-common/src/main/java/org/apache/royale/compiler/config/CommandLineConfigurator.java [56:298]
public static void parse(final ConfigurationBuffer buffer,
final String defaultvar,
final String[] args)
throws ConfigurationException
{
// "no-default-arg" means the application does not have a default var.
assert defaultvar == null || buffer.isValidVar(defaultvar) || "no-default-arg".equals(defaultvar) : "coding error: config must provide default var " + defaultvar;
Map<String, String> aliases = getAliases(buffer);
final int START = 1;
final int ARGS = 2;
final int EXEC = 3;
final int DONE = 4;
int i = 0, iStart = 0, iEnd = 0;
String var = null;
int varArgCount = -2;
List<String> argList = new LinkedList<String>();
Set<String> vars = new HashSet<String>();
boolean append = false;
boolean dash = true;
int mode = START;
while (mode != DONE)
{
switch (mode)
{
case START:
{
iStart = i;
if (args.length == i)
{
mode = DONE;
break;
}
// expect -var, --, or the beginning of default args
mode = ARGS;
varArgCount = -2;
if (args[i].equals("--"))
{
dash = false;
if (defaultvar != null)
var = defaultvar;
else
mode = START;
++i;
}
else if (dash && args[i].startsWith("+"))
{
String token = null;
int c = (args[i].length() > 1 && args[i].charAt(1) == '+') ? 2 : 1; // gnu-style?
int equals = args[i].indexOf('=');
String rest = null;
if (equals != -1)
{
rest = args[i].substring(equals + 1);
token = args[i++].substring(c, equals);
}
else
{
token = args[i++].substring(c);
}
if (equals != -1)
{
iEnd = i;
buffer.setToken(token, rest);
buffer.addPosition(token, iStart, iEnd);
}
else
{
if (i == args.length)
{
throw new ConfigurationException.Token(ConfigurationException.Token.INSUFFICIENT_ARGS,
token, var, source, -1);
}
rest = args[i++];
iEnd = i;
buffer.setToken(token, rest);
buffer.addPosition(token, iStart, iEnd);
}
mode = START;
break;
}
else if (dash && isAnArgument(args[i]))
{
int c = (args[i].length() > 1 && args[i].charAt(1) == '-') ? 2 : 1; // gnu-style?
int plusequals = args[i].indexOf("+=");
int equals = args[i].indexOf('=');
String rest = null;
if (plusequals != -1)
{
rest = args[i].substring(plusequals + 2);
var = args[i++].substring(c, plusequals);
append = true;
}
else if (equals != -1)
{
rest = args[i].substring(equals + 1);
var = args[i++].substring(c, equals);
}
else
{
var = args[i++].substring(c);
}
if (aliases.containsKey(var))
var = aliases.get(var);
if (!buffer.isValidVar(var))
{
throw new ConfigurationException.UnknownVariable(var, source, -1);
}
if (equals != -1)
{
if ((rest == null) || (rest.length() == 0))
{
varArgCount = -1;
mode = EXEC;
}
else
{
String seps = null;
if (buffer.getInfo(var).isPath())
{
seps = "[," + File.pathSeparatorChar + "]";
}
else
{
seps = ",";
}
String[] tokens = rest.split(seps);
argList.addAll(Arrays.asList(tokens));
varArgCount = buffer.getVarArgCount(var);
mode = EXEC;
}
}
}
else
{
// asdoc sets default var as no-default-arg - it has no default vars
if (defaultvar != null && !defaultvar.equals("no-default-arg"))
{
// don't increment i, let ARGS pick it up.
var = defaultvar;
}
else
{
throw new ConfigurationException.UnexpectedDefaults(null, null, -1);
}
}
break;
}
case ARGS:
{
if (varArgCount == -2)
{
if (isBoolean(buffer, var))
{
varArgCount = 0;
mode = EXEC;
break;
}
else
{
varArgCount = buffer.getVarArgCount(var);
}
}
assert varArgCount >= -1; // just in case the getVarArgCount author was insane.
if (args.length == i)
{
mode = EXEC;
break;
}
boolean greedy = buffer.getInfo(var).isGreedy();
// accumulating non-command arguments...
// check for a terminator on our accumulated parameter list
if (!greedy && dash && isAnArgument(args[i]))
{
if (varArgCount == -1)
{
// we were accumulating an unlimited set of args, a new var terminates that.
mode = EXEC;
break;
}
throw new ConfigurationException.IncorrectArgumentCount(varArgCount, argList.size(), var, source, -1);
}
argList.add(args[i++]);
if (argList.size() == varArgCount)
{
mode = EXEC;
}
break;
}
case EXEC:
{
if ((varArgCount != -1) && (argList.size() != varArgCount))
{
throw new ConfigurationException.IncorrectArgumentCount(varArgCount, argList.size(), var, source, -1);
}
if (varArgCount == 0) // boolean flag fakery...
argList.add("true");
if (vars.contains(var))
{
if ((defaultvar != null) && var.equals(defaultvar))
{
// we could perhaps accumulate the defaults spread out through
// the rest of the flags, but for now we'll call this illegal.
throw new ConfigurationException.InterspersedDefaults(var, source, -1);
}
}
iEnd = i;
buffer.setVar(var, new LinkedList<String>(argList), source, -1, null, append);
buffer.addPosition(var, iStart, iEnd);
append = false;
vars.add(var);
argList.clear();
mode = START;
break;
}
case DONE:
{
assert false;
break;
}
}
}
}