summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-08-09 18:45:48 +0200
committerQt by Nokia <qt-info@nokia.com>2012-08-14 23:12:23 +0200
commit1447b6c55b55ca7bd6474524c12948c3e5589d2e (patch)
tree80b98ac7627749899c4a47f915e5cf7265bfd03f
parent807579ff64e1182eede092927403ad9672c18755 (diff)
make command line parser use qt containers
way more legible code Change-Id: I7ba5a66f1f0bc7ae78ba0537ef8e5c780506a149 Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
-rw-r--r--qmake/option.cpp96
-rw-r--r--qmake/option.h2
2 files changed, 44 insertions, 54 deletions
diff --git a/qmake/option.cpp b/qmake/option.cpp
index a0a543e42d..db212e6daf 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -212,22 +212,24 @@ bool usage(const char *a0)
}
int
-Option::parseCommandLine(int argc, char **argv)
+Option::parseCommandLine(QStringList &args)
{
QStringList user_configs;
bool before = true;
- for (int x = 0; x < argc; x++) {
- if(*argv[x] == '-' && strlen(argv[x]) > 1) { /* options */
- QString opt = argv[x] + 1;
+ args << QString(); // Avoid bounds checking for options which take an argument
+ for (int x = 0; x < args.size() - 1; ) {
+ QString arg = args.at(x);
+ if (arg.size() > 1 && arg.startsWith('-')) { /* options */
+ QString opt = arg.mid(1);
if(opt == "o" || opt == "output") {
- Option::output.setFileName(argv[++x]);
+ Option::output.setFileName(args.at(++x));
} else if(opt == "after") {
before = false;
} else if(opt == "t" || opt == "template") {
- Option::user_template = argv[++x];
+ Option::user_template = args.at(++x);
} else if(opt == "tp" || opt == "template_prefix") {
- Option::user_template_prefix = argv[++x];
+ Option::user_template_prefix = args.at(++x);
} else if(opt == "unix") {
Option::dir_sep = "/";
} else if(opt == "win32") {
@@ -261,7 +263,7 @@ Option::parseCommandLine(int argc, char **argv)
} else if(opt == "nr" || opt == "norecursive") {
Option::recursive = false;
} else if(opt == "config") {
- user_configs += argv[++x];
+ user_configs += args.at(++x);
} else {
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
@@ -278,13 +280,13 @@ Option::parseCommandLine(int argc, char **argv)
} else if(opt == "E") {
Option::mkfile::do_preprocess = true;
} else if(opt == "cache") {
- Option::mkfile::cachefile = argv[++x];
+ Option::mkfile::cachefile = args.at(++x);
} else if(opt == "platform" || opt == "spec") {
- Option::mkfile::qmakespec = cleanSpec(argv[++x]);
- Option::mkfile::qmakespec_commandline = argv[x];
+ Option::mkfile::qmakespec = cleanSpec(args.at(++x));
+ Option::mkfile::qmakespec_commandline = args.at(x);
} else if (opt == "xplatform" || opt == "xspec") {
- Option::mkfile::xqmakespec = cleanSpec(argv[++x]);
- Option::mkfile::xqmakespec_commandline = argv[x];
+ Option::mkfile::xqmakespec = cleanSpec(args.at(++x));
+ Option::mkfile::xqmakespec_commandline = args.at(x);
} else {
fprintf(stderr, "***Unknown option -%s\n", opt.toLatin1().constData());
return Option::QMAKE_CMDLINE_SHOW_USAGE | Option::QMAKE_CMDLINE_ERROR;
@@ -299,7 +301,6 @@ Option::parseCommandLine(int argc, char **argv)
}
}
} else {
- QString arg = argv[x];
if(arg.indexOf('=') != -1) {
if(before)
Option::before_user_vars.append(arg);
@@ -334,6 +335,7 @@ Option::parseCommandLine(int argc, char **argv)
}
}
}
+ x++;
}
if (!user_configs.isEmpty())
@@ -342,6 +344,7 @@ Option::parseCommandLine(int argc, char **argv)
if (Option::mkfile::xqmakespec.isEmpty())
Option::mkfile::xqmakespec = Option::mkfile::qmakespec;
+ args.takeLast();
return Option::QMAKE_CMDLINE_SUCCESS;
}
@@ -410,51 +413,38 @@ Option::init(int argc, char **argv)
const QByteArray envflags = qgetenv("QMAKEFLAGS");
if (!envflags.isNull()) {
- int env_argc = 0, env_size = 0, currlen=0;
- char quote = 0, **env_argv = NULL;
+ QStringList args;
+ QByteArray buf = "";
+ char quote = 0;
+ bool hasWord = false;
for (int i = 0; i < envflags.size(); ++i) {
- if (!quote && (envflags.at(i) == '\'' || envflags.at(i) == '"')) {
- quote = envflags.at(i);
- } else if (envflags.at(i) == quote) {
+ char c = envflags.at(i);
+ if (!quote && (c == '\'' || c == '"')) {
+ quote = c;
+ } else if (c == quote) {
quote = 0;
- } else if (!quote && envflags.at(i) == ' ') {
- if (currlen && env_argv && env_argv[env_argc]) {
- env_argv[env_argc][currlen] = '\0';
- currlen = 0;
- env_argc++;
+ } else if (!quote && c == ' ') {
+ if (hasWord) {
+ args << QString::fromLocal8Bit(buf);
+ hasWord = false;
+ buf = "";
}
} else {
- if(!env_argv || env_argc > env_size) {
- env_argv = (char **)realloc(env_argv, sizeof(char *)*(env_size+=10));
- 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(env_argv[env_argc]) {
- env_argv[env_argc][currlen] = '\0';
- 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]);
+ buf += c;
+ hasWord = true;
}
- free(env_argv);
}
+ if (hasWord)
+ args << QString::fromLocal8Bit(buf);
+ parseCommandLine(args);
}
if(argc && argv) {
- argv++, argc--;
- while (argc) {
- QString opt = *argv;
+ QStringList args;
+ for (int i = 1; i < argc; i++)
+ args << QString::fromLocal8Bit(argv[i]);
+
+ while (!args.isEmpty()) {
+ QString opt = args.at(0);
if (opt == "-project") {
Option::recursive = true;
Option::qmake_mode = Option::QMAKE_GENERATE_PROJECT;
@@ -473,11 +463,11 @@ Option::init(int argc, char **argv)
} else {
break;
}
- argv++, argc--;
+ args.takeFirst();
break;
}
- int ret = parseCommandLine(argc, argv);
+ int ret = parseCommandLine(args);
if(ret != Option::QMAKE_CMDLINE_SUCCESS) {
if ((ret & Option::QMAKE_CMDLINE_SHOW_USAGE) != 0)
usage(argv[0]);
diff --git a/qmake/option.h b/qmake/option.h
index 09f568b243..0b3fe2dd8f 100644
--- a/qmake/option.h
+++ b/qmake/option.h
@@ -200,7 +200,7 @@ struct Option
};
private:
- static int parseCommandLine(int, char **);
+ static int parseCommandLine(QStringList &args);
};
inline QString fixEnvVariables(const QString &x) { return Option::fixString(x, Option::FixEnvVars); }