diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-07-06 14:12:43 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-07-07 08:24:51 +0000 |
commit | d4e767995f49c5ddf2c82c916b1e981f97d595e0 (patch) | |
tree | f4042972746e065702a0578feac3c99c2f439b1e | |
parent | 2445e3e579273876987b7dd9ff0b919104bbf607 (diff) |
lupdate: Factor out parsing of Python backslash escaping
Move code to a helper parseStringEscape() and add EOF
checking.
Task-number: PYSIDE-2380
Change-Id: If9e64ad790355751ec15d6139a0190bb0872685f
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
(cherry picked from commit 08fe8fc69d82d31a41d33cf9685f58eb1071d6a1)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/linguist/lupdate/python.cpp | 103 |
1 files changed, 60 insertions, 43 deletions
diff --git a/src/linguist/lupdate/python.cpp b/src/linguist/lupdate/python.cpp index 4a7966578..1cadadc59 100644 --- a/src/linguist/lupdate/python.cpp +++ b/src/linguist/lupdate/python.cpp @@ -125,11 +125,68 @@ static void startTokenizer(const QString &fileName, int (*getCharFunc)(), yyContextStack.clear(); } -static Token parseString() +static bool parseStringEscape() { static const char tab[] = "abfnrtv"; static const char backTab[] = "\a\b\f\n\r\t\v"; + yyCh = getChar(); + if (yyCh == EOF) + return false; + + if (yyCh == 'x') { + QByteArray hex = "0"; + yyCh = getChar(); + if (yyCh == EOF) + return false; + while (std::isxdigit(yyCh)) { + hex += char(yyCh); + yyCh = getChar(); + if (yyCh == EOF) + return false; + } + uint n; +#ifdef Q_CC_MSVC + sscanf_s(hex, "%x", &n); +#else + std::sscanf(hex, "%x", &n); +#endif + if (yyStringLen < sizeof(yyString) - 1) + yyString[yyStringLen++] = char(n); + return true; + } + + if (yyCh >= '0' && yyCh < '8') { + QByteArray oct; + int n = 0; + do { + oct += char(yyCh); + ++n; + yyCh = getChar(); + if (yyCh == EOF) + return false; + } while (yyCh >= '0' && yyCh < '8' && n < 3); +#ifdef Q_CC_MSVC + sscanf_s(oct, "%o", &n); +#else + std::sscanf(oct, "%o", &n); +#endif + if (yyStringLen < sizeof(yyString) - 1) + yyString[yyStringLen++] = char(n); + return true; + } + + const char *p = std::strchr(tab, yyCh); + if (yyStringLen < sizeof(yyString) - 1) { + yyString[yyStringLen++] = p == nullptr + ? char(yyCh) : backTab[p - tab]; + } + yyCh = getChar(); + return true; +} + +static Token parseString() +{ int quoteChar = yyCh; bool tripleQuote = false; bool singleQuote = true; @@ -169,48 +226,8 @@ static Token parseString() } if (yyCh == '\\') { - yyCh = getChar(); - - if (yyCh == 'x') { - QByteArray hex = "0"; - - yyCh = getChar(); - while (std::isxdigit(yyCh)) { - hex += char(yyCh); - yyCh = getChar(); - } - uint n; -#ifdef Q_CC_MSVC - sscanf_s(hex, "%x", &n); -#else - std::sscanf(hex, "%x", &n); -#endif - if (yyStringLen < sizeof(yyString) - 1) - yyString[yyStringLen++] = char(n); - } else if (yyCh >= '0' && yyCh < '8') { - QByteArray oct; - int n = 0; - - do { - oct += char(yyCh); - ++n; - yyCh = getChar(); - } while (yyCh >= '0' && yyCh < '8' && n < 3); -#ifdef Q_CC_MSVC - sscanf_s(oct, "%o", &n); -#else - std::sscanf(oct, "%o", &n); -#endif - if (yyStringLen < sizeof(yyString) - 1) - yyString[yyStringLen++] = char(n); - } else { - const char *p = std::strchr(tab, yyCh); - if (yyStringLen < sizeof(yyString) - 1) { - yyString[yyStringLen++] = (p == nullptr) - ? char(yyCh) : backTab[p - tab]; - } - yyCh = getChar(); - } + if (!parseStringEscape()) + return Tok_Eof; } else { char *yStart = yyString + yyStringLen; char *yp = yStart; |