diff --git a/addons/misc.py b/addons/misc.py index 521cf22e6..d636493d6 100644 --- a/addons/misc.py +++ b/addons/misc.py @@ -28,27 +28,33 @@ def simpleMatch(token, pattern): token = token.next return True +def isStringLiteral(tokenString): + return tokenString.startswith('"') + # check data def check(data): arrayInit = False - for i in range(len(data.rawTokens)): + rawTokens = data.rawTokens + for i in range(len(rawTokens)): if i < 2: continue - tok1 = data.rawTokens[i-2].str - tok2 = data.rawTokens[i-1].str - tok3 = data.rawTokens[i-0].str + tok1 = rawTokens[i-2].str + tok2 = rawTokens[i-1].str + tok3 = rawTokens[i-0].str if tok3 == '}': arrayInit = False elif tok1 == ']' and tok2 == '=' and tok3 == '{': arrayInit = True - elif arrayInit and (tok1 in [',', '{']) and tok2.startswith('"') and tok3.startswith('"'): + elif arrayInit and (tok1 in [',', '{']) and isStringLiteral(tok2) and isStringLiteral(tok3): if tok1 == '{': i2 = i + 1 - while i2 < len(data.rawTokens) and data.rawTokens[i2].str not in [',', '}']: + while i2 < len(rawTokens) and rawTokens[i2].str not in [',', '}']: i2 = i2 + 1 - if i2 >= len(data.rawTokens) or data.rawTokens[i2].str != ',': + if i2 >= len(rawTokens) or rawTokens[i2].str != ',': continue - reportError(data.rawTokens[i], 'style', 'string concatenation', 'stringConcatInArrayInit') + if i + 2 < len(rawTokens) and isStringLiteral(rawTokens[i+1].str) and isStringLiteral(rawTokens[i+2].str): + continue + reportError(rawTokens[i], 'style', 'string concatenation', 'stringConcatInArrayInit') for arg in sys.argv[1:]: if arg == '-verify': diff --git a/addons/test/misc-test.c b/addons/test/misc-test.c index 1eff04abe..10743788c 100644 --- a/addons/test/misc-test.c +++ b/addons/test/misc-test.c @@ -3,3 +3,16 @@ const char *a[] = {"a" "b"}; const char *b[] = {"a","b" "c"}; // stringConcatInArrayInit +const char *c[] = { + "a\n" + "a\n" + "a\n" + "a\n" + "a\n" + , + "b\n" + "b\n" + "b\n" + "b\n" + "b\n" +};