make command line parser use qt containers

way more legible code

Change-Id: I7ba5a66f1f0bc7ae78ba0537ef8e5c780506a149
Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
This commit is contained in:
Oswald Buddenhagen 2012-08-09 18:45:48 +02:00 committed by Qt by Nokia
parent 807579ff64
commit 1447b6c55b
2 changed files with 44 additions and 54 deletions

View File

@ -212,22 +212,24 @@ bool usage(const char *a0)
} }
int int
Option::parseCommandLine(int argc, char **argv) Option::parseCommandLine(QStringList &args)
{ {
QStringList user_configs; QStringList user_configs;
bool before = true; bool before = true;
for (int x = 0; x < argc; x++) { args << QString(); // Avoid bounds checking for options which take an argument
if(*argv[x] == '-' && strlen(argv[x]) > 1) { /* options */ for (int x = 0; x < args.size() - 1; ) {
QString opt = argv[x] + 1; QString arg = args.at(x);
if (arg.size() > 1 && arg.startsWith('-')) { /* options */
QString opt = arg.mid(1);
if(opt == "o" || opt == "output") { if(opt == "o" || opt == "output") {
Option::output.setFileName(argv[++x]); Option::output.setFileName(args.at(++x));
} else if(opt == "after") { } else if(opt == "after") {
before = false; before = false;
} else if(opt == "t" || opt == "template") { } else if(opt == "t" || opt == "template") {
Option::user_template = argv[++x]; Option::user_template = args.at(++x);
} else if(opt == "tp" || opt == "template_prefix") { } else if(opt == "tp" || opt == "template_prefix") {
Option::user_template_prefix = argv[++x]; Option::user_template_prefix = args.at(++x);
} else if(opt == "unix") { } else if(opt == "unix") {
Option::dir_sep = "/"; Option::dir_sep = "/";
} else if(opt == "win32") { } else if(opt == "win32") {
@ -261,7 +263,7 @@ Option::parseCommandLine(int argc, char **argv)
} else if(opt == "nr" || opt == "norecursive") { } else if(opt == "nr" || opt == "norecursive") {
Option::recursive = false; Option::recursive = false;
} else if(opt == "config") { } else if(opt == "config") {
user_configs += argv[++x]; user_configs += args.at(++x);
} else { } else {
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) { Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
@ -278,13 +280,13 @@ Option::parseCommandLine(int argc, char **argv)
} else if(opt == "E") { } else if(opt == "E") {
Option::mkfile::do_preprocess = true; Option::mkfile::do_preprocess = true;
} else if(opt == "cache") { } else if(opt == "cache") {
Option::mkfile::cachefile = argv[++x]; Option::mkfile::cachefile = args.at(++x);
} else if(opt == "platform" || opt == "spec") { } else if(opt == "platform" || opt == "spec") {
Option::mkfile::qmakespec = cleanSpec(argv[++x]); Option::mkfile::qmakespec = cleanSpec(args.at(++x));
Option::mkfile::qmakespec_commandline = argv[x]; Option::mkfile::qmakespec_commandline = args.at(x);
} else if (opt == "xplatform" || opt == "xspec") { } else if (opt == "xplatform" || opt == "xspec") {
Option::mkfile::xqmakespec = cleanSpec(argv[++x]); Option::mkfile::xqmakespec = cleanSpec(args.at(++x));
Option::mkfile::xqmakespec_commandline = argv[x]; Option::mkfile::xqmakespec_commandline = args.at(x);
} else { } else {
fprintf(stderr, "***Unknown option -%s\n", opt.toLatin1().constData()); fprintf(stderr, "***Unknown option -%s\n", opt.toLatin1().constData());
return Option::QMAKE_CMDLINE_SHOW_USAGE | Option::QMAKE_CMDLINE_ERROR; return Option::QMAKE_CMDLINE_SHOW_USAGE | Option::QMAKE_CMDLINE_ERROR;
@ -299,7 +301,6 @@ Option::parseCommandLine(int argc, char **argv)
} }
} }
} else { } else {
QString arg = argv[x];
if(arg.indexOf('=') != -1) { if(arg.indexOf('=') != -1) {
if(before) if(before)
Option::before_user_vars.append(arg); Option::before_user_vars.append(arg);
@ -334,6 +335,7 @@ Option::parseCommandLine(int argc, char **argv)
} }
} }
} }
x++;
} }
if (!user_configs.isEmpty()) if (!user_configs.isEmpty())
@ -342,6 +344,7 @@ Option::parseCommandLine(int argc, char **argv)
if (Option::mkfile::xqmakespec.isEmpty()) if (Option::mkfile::xqmakespec.isEmpty())
Option::mkfile::xqmakespec = Option::mkfile::qmakespec; Option::mkfile::xqmakespec = Option::mkfile::qmakespec;
args.takeLast();
return Option::QMAKE_CMDLINE_SUCCESS; return Option::QMAKE_CMDLINE_SUCCESS;
} }
@ -410,51 +413,38 @@ Option::init(int argc, char **argv)
const QByteArray envflags = qgetenv("QMAKEFLAGS"); const QByteArray envflags = qgetenv("QMAKEFLAGS");
if (!envflags.isNull()) { if (!envflags.isNull()) {
int env_argc = 0, env_size = 0, currlen=0; QStringList args;
char quote = 0, **env_argv = NULL; QByteArray buf = "";
char quote = 0;
bool hasWord = false;
for (int i = 0; i < envflags.size(); ++i) { for (int i = 0; i < envflags.size(); ++i) {
if (!quote && (envflags.at(i) == '\'' || envflags.at(i) == '"')) { char c = envflags.at(i);
quote = envflags.at(i); if (!quote && (c == '\'' || c == '"')) {
} else if (envflags.at(i) == quote) { quote = c;
} else if (c == quote) {
quote = 0; quote = 0;
} else if (!quote && envflags.at(i) == ' ') { } else if (!quote && c == ' ') {
if (currlen && env_argv && env_argv[env_argc]) { if (hasWord) {
env_argv[env_argc][currlen] = '\0'; args << QString::fromLocal8Bit(buf);
currlen = 0; hasWord = false;
env_argc++; buf = "";
} }
} else { } else {
if(!env_argv || env_argc > env_size) { buf += c;
env_argv = (char **)realloc(env_argv, sizeof(char *)*(env_size+=10)); hasWord = true;
for(int i2 = env_argc; i2 < env_size; i2++)
env_argv[i2] = NULL;
}
if(!env_argv[env_argc]) {
currlen = 0;
env_argv[env_argc] = (char*)malloc(255);
}
if(currlen < 255)
env_argv[env_argc][currlen++] = envflags.at(i);
} }
} }
if(env_argv) { if (hasWord)
if(env_argv[env_argc]) { args << QString::fromLocal8Bit(buf);
env_argv[env_argc][currlen] = '\0'; parseCommandLine(args);
currlen = 0;
env_argc++;
}
parseCommandLine(env_argc, env_argv);
for(int i2 = 0; i2 < env_size; i2++) {
if(env_argv[i2])
free(env_argv[i2]);
}
free(env_argv);
}
} }
if(argc && argv) { if(argc && argv) {
argv++, argc--; QStringList args;
while (argc) { for (int i = 1; i < argc; i++)
QString opt = *argv; args << QString::fromLocal8Bit(argv[i]);
while (!args.isEmpty()) {
QString opt = args.at(0);
if (opt == "-project") { if (opt == "-project") {
Option::recursive = true; Option::recursive = true;
Option::qmake_mode = Option::QMAKE_GENERATE_PROJECT; Option::qmake_mode = Option::QMAKE_GENERATE_PROJECT;
@ -473,11 +463,11 @@ Option::init(int argc, char **argv)
} else { } else {
break; break;
} }
argv++, argc--; args.takeFirst();
break; break;
} }
int ret = parseCommandLine(argc, argv); int ret = parseCommandLine(args);
if(ret != Option::QMAKE_CMDLINE_SUCCESS) { if(ret != Option::QMAKE_CMDLINE_SUCCESS) {
if ((ret & Option::QMAKE_CMDLINE_SHOW_USAGE) != 0) if ((ret & Option::QMAKE_CMDLINE_SHOW_USAGE) != 0)
usage(argv[0]); usage(argv[0]);

View File

@ -200,7 +200,7 @@ struct Option
}; };
private: private:
static int parseCommandLine(int, char **); static int parseCommandLine(QStringList &args);
}; };
inline QString fixEnvVariables(const QString &x) { return Option::fixString(x, Option::FixEnvVars); } inline QString fixEnvVariables(const QString &x) { return Option::fixString(x, Option::FixEnvVars); }