From 93466161cacfb45b9de94d5cb8f0ee7be28db53a Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 17 Nov 2015 14:43:41 +0100 Subject: Rip out the #qmake_warning "preprocessor directive". No-one is known to use it - we don't even have a test for it. It plays poorly with the real preprocessor and it has not produced any output since at least Qt 4.0 (unless qmake is invoked with at least one -d flag, drowning the output in level 1 debug output). This incidentally means no preprocessor directive we care about has an underscore in its keyword. Task-number: QTBUG-49487 Change-Id: I123a945c1dfe29d1d3ceee1129cfedc043f2e7d4 Reviewed-by: Oswald Buddenhagen --- qmake/generators/makefiledeps.cpp | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) (limited to 'qmake') diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index 79e017a560..161341d780 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -573,8 +573,7 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) int keyword_len = 0; const char *keyword = buffer+x; while(x+keyword_len < buffer_len) { - if(((*(buffer+x+keyword_len) < 'a' || *(buffer+x+keyword_len) > 'z')) && - *(buffer+x+keyword_len) != '_') { + if ((*(buffer+x+keyword_len) < 'a' || *(buffer+x+keyword_len) > 'z')) { for(x+=keyword_len; //skip spaces after keyword x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t'); x++) ; @@ -603,21 +602,6 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) *(buffer + x + inc_len) = '\0'; inc = buffer + x; x += inc_len; - } else if(keyword_len == 13 && !strncmp(keyword, "qmake_warning", keyword_len)) { - char term = 0; - if(*(buffer + x) == '"') - term = '"'; - if(*(buffer + x) == '\'') - term = '\''; - if(term) - x++; - - int msg_len; - for(msg_len = 0; (term && *(buffer + x + msg_len) != term) && - !qmake_endOfLine(*(buffer + x + msg_len)); ++msg_len) ; - *(buffer + x + msg_len) = '\0'; - debug_msg(0, "%s:%d %s -- %s", file->file.local().toLatin1().constData(), line_count, keyword, buffer+x); - x += msg_len; } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') { const char term = *(buffer+(x++)); while(x < buffer_len) { -- cgit v1.2.3 From f1d5641d49f676b835c2a81b96deba0c39fd386a Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 12 Nov 2015 10:39:13 +0100 Subject: Readability clean-up (purely cosmetic). Principally *(buffer + expr) -> buffer[expr] changes, with some hspace normalization on affected lines. Made some empty loops more visible. Pulled out a repeated character class test as a function. Change-Id: I03d1b633550ad1814fa383d69ea04138dd0f82cd Reviewed-by: Oswald Buddenhagen --- qmake/generators/makefiledeps.cpp | 190 +++++++++++++++++++------------------- 1 file changed, 97 insertions(+), 93 deletions(-) (limited to 'qmake') diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index 161341d780..8c51a20aa6 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -431,104 +431,104 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) char *inc = 0; if(file->type == QMakeSourceFileInfo::TYPE_UI) { // skip whitespaces - while(x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t')) + while (x < buffer_len && (buffer[x] == ' ' || buffer[x] == '\t')) ++x; - if(*(buffer + x) == '<') { + if (buffer[x] == '<') { ++x; - if(buffer_len >= x + 12 && !strncmp(buffer + x, "includehint", 11) && - (*(buffer + x + 11) == ' ' || *(buffer + x + 11) == '>')) { - for(x += 11; *(buffer + x) != '>'; ++x) ; + if (buffer_len >= x + 12 && !strncmp(buffer + x, "includehint", 11) && + (buffer[x + 11] == ' ' || buffer[x + 11] == '>')) { + for (x += 11; buffer[x] != '>'; ++x) {} // skip int inc_len = 0; - for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ; - *(buffer + x + inc_len) = '\0'; + for (x += 1 ; buffer[x + inc_len] != '<'; ++inc_len) {} // skip + buffer[x + inc_len] = '\0'; inc = buffer + x; - } else if(buffer_len >= x + 13 && !strncmp(buffer + x, "customwidget", 12) && - (*(buffer + x + 12) == ' ' || *(buffer + x + 12) == '>')) { - for(x += 13; *(buffer + x) != '>'; ++x) ; //skip up to > + } else if (buffer_len >= x + 13 && !strncmp(buffer + x, "customwidget", 12) && + (buffer[x + 12] == ' ' || buffer[x + 12] == '>')) { + for (x += 13; buffer[x] != '>'; ++x) {} // skip up to > while(x < buffer_len) { - for(x++; *(buffer + x) != '<'; ++x) ; //skip up to < + for (x++; buffer[x] != '<'; ++x) {} // skip up to < x++; if(buffer_len >= x + 7 && !strncmp(buffer+x, "header", 6) && - (*(buffer + x + 6) == ' ' || *(buffer + x + 6) == '>')) { - for(x += 7; *(buffer + x) != '>'; ++x) ; //skip up to > + (buffer[x + 6] == ' ' || buffer[x + 6] == '>')) { + for (x += 7; buffer[x] != '>'; ++x) {} // skip up to > int inc_len = 0; - for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ; - *(buffer + x + inc_len) = '\0'; + for (x += 1 ; buffer[x + inc_len] != '<'; ++inc_len) {} // skip + buffer[x + inc_len] = '\0'; inc = buffer + x; break; } else if(buffer_len >= x + 14 && !strncmp(buffer+x, "/customwidget", 13) && - (*(buffer + x + 13) == ' ' || *(buffer + x + 13) == '>')) { + (buffer[x + 13] == ' ' || buffer[x + 13] == '>')) { x += 14; break; } } } else if(buffer_len >= x + 8 && !strncmp(buffer + x, "include", 7) && - (*(buffer + x + 7) == ' ' || *(buffer + x + 7) == '>')) { - for(x += 8; *(buffer + x) != '>'; ++x) { - if(buffer_len >= x + 9 && *(buffer + x) == 'i' && - !strncmp(buffer + x, "impldecl", 8)) { - for(x += 8; *(buffer + x) != '='; ++x) ; - if(*(buffer + x) != '=') + (buffer[x + 7] == ' ' || buffer[x + 7] == '>')) { + for (x += 8; buffer[x] != '>'; ++x) { + if (buffer_len >= x + 9 && buffer[x] == 'i' && + !strncmp(buffer + x, "impldecl", 8)) { + for (x += 8; buffer[x] != '='; ++x) {} // skip + if (buffer[x] != '=') continue; - for(++x; *(buffer+x) == '\t' || *(buffer+x) == ' '; ++x) ; + for (++x; buffer[x] == '\t' || buffer[x] == ' '; ++x) {} // skip char quote = 0; - if(*(buffer+x) == '\'' || *(buffer+x) == '"') { - quote = *(buffer + x); + if (buffer[x] == '\'' || buffer[x] == '"') { + quote = buffer[x]; ++x; } int val_len; for(val_len = 0; true; ++val_len) { if(quote) { - if(*(buffer+x+val_len) == quote) + if (buffer[x + val_len] == quote) break; - } else if(*(buffer + x + val_len) == '>' || - *(buffer + x + val_len) == ' ') { + } else if (buffer[x + val_len] == '>' || + buffer[x + val_len] == ' ') { break; } } -//? char saved = *(buffer + x + val_len); - *(buffer + x + val_len) = '\0'; +//? char saved = buffer[x + val_len]; + buffer[x + val_len] = '\0'; if(!strcmp(buffer+x, "in implementation")) { //### do this } } } int inc_len = 0; - for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ; - *(buffer + x + inc_len) = '\0'; + for (x += 1 ; buffer[x + inc_len] != '<'; ++inc_len) {} // skip + buffer[x + inc_len] = '\0'; inc = buffer + x; } } //read past new line now.. - for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ; + for (; x < buffer_len && !qmake_endOfLine(buffer[x]); ++x) {} // skip ++line_count; } else if(file->type == QMakeSourceFileInfo::TYPE_QRC) { } else if(file->type == QMakeSourceFileInfo::TYPE_C) { for(int beginning=1; x < buffer_len; ++x) { - // whitespace comments and line-endings + // Seek code or directive, skipping comments and space: for(; x < buffer_len; ++x) { - if(*(buffer+x) == ' ' || *(buffer+x) == '\t') { + if (buffer[x] == ' ' || buffer[x] == '\t') { // keep going - } else if(*(buffer+x) == '/') { + } else if (buffer[x] == '/') { ++x; if(buffer_len >= x) { - if(*(buffer+x) == '/') { //c++ style comment - for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ; + if (buffer[x] == '/') { // C++-style comment + for (; x < buffer_len && !qmake_endOfLine(buffer[x]); ++x) {} // skip beginning = 1; - } else if(*(buffer+x) == '*') { //c style comment + } else if (buffer[x] == '*') { // C-style comment for(++x; x < buffer_len; ++x) { - if(*(buffer+x) == '*') { - if(x+1 < buffer_len && *(buffer + (x+1)) == '/') { + if (buffer[x] == '*') { + if (x + 1 < buffer_len && buffer[x + 1] == '/') { ++x; break; } - } else if(qmake_endOfLine(*(buffer+x))) { + } else if (qmake_endOfLine(buffer[x])) { ++line_count; } } } } - } else if(qmake_endOfLine(*(buffer+x))) { + } else if (qmake_endOfLine(buffer[x])) { ++line_count; beginning = 1; } else { @@ -540,19 +540,19 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) break; // preprocessor directive - if(beginning && *(buffer+x) == '#') + if (beginning && buffer[x] == '#') break; // quoted strings - if(*(buffer+x) == '\'' || *(buffer+x) == '"') { - const char term = *(buffer+(x++)); + if (buffer[x] == '\'' || buffer[x] == '"') { + const char term = buffer[x++]; for(; x < buffer_len; ++x) { - if(*(buffer+x) == term) { + if (buffer[x] == term) { ++x; break; - } else if(*(buffer+x) == '\\') { + } else if (buffer[x] == '\\') { ++x; - } else if(qmake_endOfLine(*(buffer+x))) { + } else if (qmake_endOfLine(buffer[x])) { ++line_count; } } @@ -565,20 +565,20 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) //got a preprocessor symbol ++x; while(x < buffer_len) { - if(*(buffer+x) != ' ' && *(buffer+x) != '\t') + if (buffer[x] != ' ' && buffer[x] != '\t') break; ++x; } int keyword_len = 0; - const char *keyword = buffer+x; + const char *const keyword = buffer + x; while(x+keyword_len < buffer_len) { - if ((*(buffer+x+keyword_len) < 'a' || *(buffer+x+keyword_len) > 'z')) { - for(x+=keyword_len; //skip spaces after keyword - x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t'); - x++) ; + if (buffer[x + keyword_len] < 'a' || buffer[x + keyword_len] > 'z') { + for (x += keyword_len; + x < buffer_len && (buffer[x] == ' ' || buffer[x] == '\t'); + x++) {} // skip spaces after keyword break; - } else if(qmake_endOfLine(*(buffer+x+keyword_len))) { + } else if (qmake_endOfLine(buffer[x + keyword_len])) { x += keyword_len-1; keyword_len = 0; break; @@ -588,7 +588,7 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) if((keyword_len == 7 && !strncmp(keyword, "include", 7)) // C & Obj-C || (keyword_len == 6 && !strncmp(keyword, "import", 6))) { // Obj-C - char term = *(buffer + x); + char term = buffer[x]; if(term == '<') { try_local = false; term = '>'; @@ -598,19 +598,21 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) x++; int inc_len; - for(inc_len = 0; *(buffer + x + inc_len) != term && !qmake_endOfLine(*(buffer + x + inc_len)); ++inc_len) ; - *(buffer + x + inc_len) = '\0'; + for (inc_len = 0; + buffer[x + inc_len] != term && !qmake_endOfLine(buffer[x + inc_len]); + ++inc_len) {} // skip until end of include name + buffer[x + inc_len] = '\0'; inc = buffer + x; x += inc_len; - } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') { - const char term = *(buffer+(x++)); + } else if (buffer[x] == '\'' || buffer[x] == '"') { + const char term = buffer[x++]; while(x < buffer_len) { - if(*(buffer+x) == term) + if (buffer[x] == term) break; - if(*(buffer+x) == '\\') { + if (buffer[x] == '\\') { x+=2; } else { - if(qmake_endOfLine(*(buffer+x))) + if (qmake_endOfLine(buffer[x])) ++line_count; ++x; } @@ -686,6 +688,13 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) return true; } +static bool isCWordChar(char c) { + return c == '_' + || (c >= 'a' && c <= 'z') + || (c >= 'A' && c <= 'Z') + || (c >= '0' && c <= '9'); +} + bool QMakeSourceFileInfo::findMocs(SourceFile *file) { if(file->moc_checked) @@ -723,14 +732,14 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file) /* qmake ignore Q_GADGET */ /* qmake ignore Q_OBJECT */ for(int x = 0; x < buffer_len; x++) { - if(*(buffer + x) == '/') { + if (buffer[x] == '/') { ++x; if(buffer_len >= x) { - if(*(buffer + x) == '/') { //c++ style comment - for(;x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ; - } else if(*(buffer + x) == '*') { //c style comment + if (buffer[x] == '/') { // C++-style comment + for (; x < buffer_len && !qmake_endOfLine(buffer[x]); ++x) {} // skip + } else if (buffer[x] == '*') { // C-style comment for(++x; x < buffer_len; ++x) { - if(*(buffer + x) == 't' || *(buffer + x) == 'q') { //ignore + if (buffer[x] == 't' || buffer[x] == 'q') { // ignore if(buffer_len >= (x + 20) && !strncmp(buffer + x + 1, "make ignore Q_OBJECT", 20)) { debug_msg(2, "Mocgen: %s:%d Found \"qmake ignore Q_OBJECT\"", @@ -744,38 +753,35 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file) x += 20; ignore_qgadget = true; } - } else if(*(buffer + x) == '*') { - if(buffer_len >= (x+1) && *(buffer + (x+1)) == '/') { + } else if (buffer[x] == '*') { + if (buffer_len >= x + 1 && buffer[x + 1] == '/') { ++x; break; } - } else if(Option::debug_level && qmake_endOfLine(*(buffer + x))) { + } else if (Option::debug_level && qmake_endOfLine(buffer[x])) { ++line_count; } } } } - } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') { - const char term = *(buffer+(x++)); + } else if (buffer[x] == '\'' || buffer[x] == '"') { + const char term = buffer[x++]; while(x < buffer_len) { - if(*(buffer+x) == term) + if (buffer[x] == term) break; - if(*(buffer+x) == '\\') { + if (buffer[x] == '\\') { x+=2; } else { - if(qmake_endOfLine(*(buffer+x))) + if (qmake_endOfLine(buffer[x])) ++line_count; ++x; } } } - if(Option::debug_level && qmake_endOfLine(*(buffer+x))) + if (Option::debug_level && qmake_endOfLine(buffer[x])) ++line_count; - if (buffer_len > x + 2 && buffer[x + 1] == 'Q' && buffer[x + 2] == '_' && - *(buffer + x) != '_' && - (*(buffer + x) < 'a' || *(buffer + x) > 'z') && - (*(buffer + x) < 'A' || *(buffer + x) > 'Z') && - (*(buffer + x) < '0' || *(buffer + x) > '9')) { + if (buffer_len > x + 2 && buffer[x + 1] == 'Q' && + buffer[x + 2] == '_' && !isCWordChar(buffer[x])) { ++x; int match = 0; static const char *interesting[] = { "OBJECT", "GADGET" }; @@ -784,8 +790,8 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file) continue; else if(interest == 1 && ignore_qgadget) continue; - for(m1 = 0, m2 = 0; *(interesting[interest]+m1); ++m1) { - if(*(interesting[interest]+m1) != *(buffer+x+2+m1)) { + for (m1 = 0, m2 = 0; interesting[interest][m1]; ++m1) { + if (interesting[interest][m1] != buffer[x + 2 + m1]) { m2 = -1; break; } @@ -796,14 +802,12 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file) break; } } - if(match && *(buffer+x+match) != '_' && - (*(buffer+x+match) < 'a' || *(buffer+x+match) > 'z') && - (*(buffer+x+match) < 'A' || *(buffer+x+match) > 'Z') && - (*(buffer+x+match) < '0' || *(buffer+x+match) > '9')) { - if(Option::debug_level) { - *(buffer+x+match) = '\0'; - debug_msg(2, "Mocgen: %s:%d Found MOC symbol %s", file->file.real().toLatin1().constData(), - line_count, buffer+x); + if (match && !isCWordChar(buffer[x + match])) { + if (Option::debug_level) { + buffer[x + match] = '\0'; + debug_msg(2, "Mocgen: %s:%d Found MOC symbol %s", + file->file.real().toLatin1().constData(), + line_count, buffer + x); } file->mocable = true; return true; -- cgit v1.2.3 From 00a855d64326c03f1e7b05ae335c774e910405d7 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 12 Nov 2015 11:01:31 +0100 Subject: Avoid having division caught up in parsing of comments. A loop to skip space and comments was meant to break on anything else but would have not broken on a division operator (where it should) due to it getting caught in the check for a comment-start, without falling back suitably when it didn't complete that check. Managed to contrive a suitably twisted change to findDeps test to reveal the bug; broken previously, now fixed. Not ideal, as it relied on another bug to fail previously - backslash-newline shouldn't end a preprocessing directive line - but it should still pass once that's fixed, too. Exercising a bug in qmake usually involves code that won't compile anyway, making it tricky to write a test that reveals the bug but that passes once it's fixed. Change-Id: I08a1d7cc5e3d7fd1ac0a48e5c09dfdfbb7580b11 Reviewed-by: Oswald Buddenhagen --- qmake/generators/makefiledeps.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'qmake') diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index 8c51a20aa6..535f0561cc 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -509,22 +509,21 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) for(; x < buffer_len; ++x) { if (buffer[x] == ' ' || buffer[x] == '\t') { // keep going - } else if (buffer[x] == '/') { + } else if (buffer[x] == '/' && x + 1 < buffer_len && + (buffer[x + 1] == '/' || buffer[x + 1] == '*')) { ++x; - if(buffer_len >= x) { - if (buffer[x] == '/') { // C++-style comment - for (; x < buffer_len && !qmake_endOfLine(buffer[x]); ++x) {} // skip - beginning = 1; - } else if (buffer[x] == '*') { // C-style comment - for(++x; x < buffer_len; ++x) { - if (buffer[x] == '*') { - if (x + 1 < buffer_len && buffer[x + 1] == '/') { - ++x; - break; - } - } else if (qmake_endOfLine(buffer[x])) { - ++line_count; + if (buffer[x] == '/') { // C++-style comment + for (; x < buffer_len && !qmake_endOfLine(buffer[x]); ++x) {} // skip + beginning = 1; + } else { // C-style comment + while (++x < buffer_len) { + if (buffer[x] == '*') { + if (x + 1 < buffer_len && buffer[x + 1] == '/') { + ++x; // skip '*'; for loop skips '/'. + break; } + } else if (qmake_endOfLine(buffer[x])) { + ++line_count; } } } -- cgit v1.2.3 From 3780b3da9969a67f4ebd92813b73f8ca15632707 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 12 Nov 2015 11:12:52 +0100 Subject: Skip spaces (after #) earlier to catch blank line or end-of-buffer. The C preprocessor does believe in a # [nothing] line; and we may as well give up before checking for keywords if we've run out of buffer. Change-Id: I64dc3ad2808435389d0d7b56dcbc9d92ae72aa6e Reviewed-by: Oswald Buddenhagen --- qmake/generators/makefiledeps.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'qmake') diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index 535f0561cc..7cdd757052 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -539,8 +539,18 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) break; // preprocessor directive - if (beginning && buffer[x] == '#') + if (beginning && buffer[x] == '#') { + // Advance to start of preprocessing directive + while (++x < buffer_len + && (buffer[x] == ' ' || buffer[x] == '\t')) {} // skip + + if (qmake_endOfLine(buffer[x])) { + ++line_count; + beginning = 1; + continue; + } break; + } // quoted strings if (buffer[x] == '\'' || buffer[x] == '"') { @@ -561,13 +571,7 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) if(x >= buffer_len) break; - //got a preprocessor symbol - ++x; - while(x < buffer_len) { - if (buffer[x] != ' ' && buffer[x] != '\t') - break; - ++x; - } + // Got a preprocessor directive int keyword_len = 0; const char *const keyword = buffer + x; -- cgit v1.2.3 From 213111f0fca36be27122c0e407989853fc01ef82 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Wed, 18 Nov 2015 13:52:43 +0100 Subject: Rework scan for keyword in preprocessor directive. When looking for the keyword in a preprocessor directive, we were checking for non-word characters to find its end. If that check failed (i.e. we had a word character) we would then check for EOL (which necessarily failed, on a word character). That made no sense. However, we genuinely have no interest in a directive with nothing after the keyword, so do check for EOL after the loop (once we've skipped spaces after the keyword). The loop itself was made needlessly complicated by, on finding the end of the keyword, skipping over later space inside the loop. Moved this outside the loop. Change-Id: Iccc2d445bf44deb75604e7fa60f2464e7397d8ed Reviewed-by: Oswald Buddenhagen --- qmake/generators/makefiledeps.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'qmake') diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index 7cdd757052..5623fb5860 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -572,22 +572,18 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) break; // Got a preprocessor directive - - int keyword_len = 0; const char *const keyword = buffer + x; - while(x+keyword_len < buffer_len) { - if (buffer[x + keyword_len] < 'a' || buffer[x + keyword_len] > 'z') { - for (x += keyword_len; - x < buffer_len && (buffer[x] == ' ' || buffer[x] == '\t'); - x++) {} // skip spaces after keyword - break; - } else if (qmake_endOfLine(buffer[x + keyword_len])) { - x += keyword_len-1; - keyword_len = 0; - break; - } - keyword_len++; - } + for (; + x < buffer_len && buffer[x] >= 'a' && buffer[x] <= 'z'; + x++) {} // skip over identifier + int keyword_len = buffer + x - keyword; + for (; + x < buffer_len && (buffer[x] == ' ' || buffer[x] == '\t'); + x++) {} // skip spaces after keyword + + /* Keyword with nothing after it, e.g. #endif: not interesting. */ + if (qmake_endOfLine(buffer[x])) + keyword_len = 0; if((keyword_len == 7 && !strncmp(keyword, "include", 7)) // C & Obj-C || (keyword_len == 6 && !strncmp(keyword, "import", 6))) { // Obj-C -- cgit v1.2.3 From 0c73bafe23cc81110baaf4ff416fe1750686cc1f Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 12 Nov 2015 16:25:58 +0100 Subject: Simplify a loop's set-up and control. Change-Id: Ie9e002d7d7fb269f3a99cce98e4250a866523360 Reviewed-by: Oswald Buddenhagen --- qmake/generators/makefiledeps.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'qmake') diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index 5623fb5860..f655010677 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -554,8 +554,8 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) // quoted strings if (buffer[x] == '\'' || buffer[x] == '"') { - const char term = buffer[x++]; - for(; x < buffer_len; ++x) { + const char term = buffer[x]; + while (++x < buffer_len) { if (buffer[x] == term) { ++x; break; -- cgit v1.2.3 From 8da24d8a5c6cebed975190cb5fd83b08d6188ebf Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 12 Nov 2015 16:30:15 +0100 Subject: Comment to point out problem with CRLF handling. Change-Id: I6352c5c68183207b9dfd332fbecc89c1c8c16d20 Reviewed-by: Oswald Buddenhagen --- qmake/generators/makefiledeps.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'qmake') diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index f655010677..f4479750c8 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -56,6 +56,7 @@ QT_BEGIN_NAMESPACE +// FIXME: a line ending in CRLF gets counted as two lines. #if 1 #define qmake_endOfLine(c) (c == '\r' || c == '\n') #else -- cgit v1.2.3