Handle compound single dash options properly
So now nix-instantiate --eval -E '{x}: x' --argstr x -xyzzy correctly prints "-xyzzy", rather than giving an error. Issue NixOS/hydra#176.
This commit is contained in:
parent
47e185847e
commit
5f05197df4
1 changed files with 17 additions and 18 deletions
|
@ -159,29 +159,28 @@ void parseCmdLine(int argc, char * * argv,
|
||||||
std::function<bool(Strings::iterator & arg, const Strings::iterator & end)> parseArg)
|
std::function<bool(Strings::iterator & arg, const Strings::iterator & end)> parseArg)
|
||||||
{
|
{
|
||||||
/* Put the arguments in a vector. */
|
/* Put the arguments in a vector. */
|
||||||
Strings args, remaining;
|
Strings args;
|
||||||
|
argc--; argv++;
|
||||||
while (argc--) args.push_back(*argv++);
|
while (argc--) args.push_back(*argv++);
|
||||||
args.erase(args.begin());
|
|
||||||
|
|
||||||
/* Expand compound dash options (i.e., `-qlf' -> `-q -l -f'), and
|
|
||||||
ignore options for the ATerm library. */
|
|
||||||
for (Strings::iterator i = args.begin(); i != args.end(); ++i) {
|
|
||||||
string arg = *i;
|
|
||||||
if (arg.length() > 2 && arg[0] == '-' && arg[1] != '-' && !isdigit(arg[1])) {
|
|
||||||
for (unsigned int j = 1; j < arg.length(); j++)
|
|
||||||
if (isalpha(arg[j]))
|
|
||||||
remaining.push_back((string) "-" + arg[j]);
|
|
||||||
else {
|
|
||||||
remaining.push_back(string(arg, j));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else remaining.push_back(arg);
|
|
||||||
}
|
|
||||||
args = remaining;
|
|
||||||
|
|
||||||
/* Process default options. */
|
/* Process default options. */
|
||||||
for (Strings::iterator i = args.begin(); i != args.end(); ++i) {
|
for (Strings::iterator i = args.begin(); i != args.end(); ++i) {
|
||||||
string arg = *i;
|
string arg = *i;
|
||||||
|
|
||||||
|
/* Expand compound dash options (i.e., `-qlf' -> `-q -l -f'). */
|
||||||
|
if (arg.length() > 2 && arg[0] == '-' && arg[1] != '-' && isalpha(arg[1])) {
|
||||||
|
*i = (string) "-" + arg[1];
|
||||||
|
auto next = i; ++next;
|
||||||
|
for (unsigned int j = 2; j < arg.length(); j++)
|
||||||
|
if (isalpha(arg[j]))
|
||||||
|
args.insert(next, (string) "-" + arg[j]);
|
||||||
|
else {
|
||||||
|
args.insert(next, string(arg, j));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
arg = *i;
|
||||||
|
}
|
||||||
|
|
||||||
if (arg == "--verbose" || arg == "-v") verbosity = (Verbosity) (verbosity + 1);
|
if (arg == "--verbose" || arg == "-v") verbosity = (Verbosity) (verbosity + 1);
|
||||||
else if (arg == "--quiet") verbosity = verbosity > lvlError ? (Verbosity) (verbosity - 1) : lvlError;
|
else if (arg == "--quiet") verbosity = verbosity > lvlError ? (Verbosity) (verbosity - 1) : lvlError;
|
||||||
else if (arg == "--log-type") {
|
else if (arg == "--log-type") {
|
||||||
|
|
Loading…
Reference in a new issue