summaryrefslogtreecommitdiffstats
path: root/qmake
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@digia.com>2013-03-07 21:47:42 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-03-12 18:13:37 +0100
commit6c22b9b3e86d1617665f7b81b105c032f43c6d72 (patch)
tree7590686394d710c65c7d560912b240e4fdf21e38 /qmake
parentcd94b543cb00bb1b94fcd3c7db5cce85b942c827 (diff)
make split_value_list() sane
don't count parentheses, don't nest quotes, don't create empty elements, let backslash uniformly escape. in short, behave like a sane parser. Change-Id: I29252fbe14fd6d28217450ec41cf8acfb2e30681 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Diffstat (limited to 'qmake')
-rw-r--r--qmake/library/qmakeevaluator.cpp64
1 files changed, 33 insertions, 31 deletions
diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp
index ad168774bc..285c79b9f3 100644
--- a/qmake/library/qmakeevaluator.cpp
+++ b/qmake/library/qmakeevaluator.cpp
@@ -264,48 +264,50 @@ ProStringList QMakeEvaluator::split_value_list(const QString &vals, const ProFil
{
QString build;
ProStringList ret;
- QStack<char> quote;
-
- const ushort SPACE = ' ';
- const ushort LPAREN = '(';
- const ushort RPAREN = ')';
- const ushort SINGLEQUOTE = '\'';
- const ushort DOUBLEQUOTE = '"';
- const ushort BACKSLASH = '\\';
if (!source)
source = currentProFile();
- ushort unicode;
const QChar *vals_data = vals.data();
const int vals_len = vals.length();
- int parens = 0;
+ ushort quote = 0;
+ bool hadWord = false;
for (int x = 0; x < vals_len; x++) {
- unicode = vals_data[x].unicode();
- if (x != (int)vals_len-1 && unicode == BACKSLASH &&
- (vals_data[x+1].unicode() == SINGLEQUOTE || vals_data[x+1].unicode() == DOUBLEQUOTE)) {
- build += vals_data[x++]; //get that 'escape'
- } else if (!quote.isEmpty() && unicode == quote.top()) {
- quote.pop();
- } else if (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE) {
- quote.push(unicode);
- } else if (unicode == RPAREN) {
- --parens;
- } else if (unicode == LPAREN) {
- ++parens;
+ ushort unicode = vals_data[x].unicode();
+ if (unicode == quote) {
+ quote = 0;
+ continue;
}
-
- if (!parens && quote.isEmpty() && vals_data[x] == SPACE) {
- ret << ProString(build).setSource(source);
- build.clear();
- } else {
- build += vals_data[x];
+ switch (unicode) {
+ case '"':
+ case '\'':
+ quote = unicode;
+ hadWord = true;
+ continue;
+ case ' ':
+ case '\t':
+ if (!quote) {
+ if (hadWord) {
+ ret << ProString(build).setSource(source);
+ build.clear();
+ hadWord = false;
+ }
+ continue;
+ }
+ build += QChar(unicode);
+ break;
+ case '\\':
+ if (x + 1 != vals_len)
+ unicode = vals_data[++x].unicode();
+ // fallthrough
+ default:
+ hadWord = true;
+ build += QChar(unicode);
+ break;
}
}
- if (!build.isEmpty())
+ if (hadWord)
ret << ProString(build).setSource(source);
- if (parens)
- deprecationWarning(fL1S("Unmatched parentheses are deprecated."));
return ret;
}