summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-07-06 14:12:43 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-07-07 08:24:51 +0000
commitd4e767995f49c5ddf2c82c916b1e981f97d595e0 (patch)
treef4042972746e065702a0578feac3c99c2f439b1e
parent2445e3e579273876987b7dd9ff0b919104bbf607 (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.cpp103
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;