diff options
| author | hjk <hjk@qt.io> | 2023-02-24 08:31:58 +0100 |
|---|---|---|
| committer | hjk <hjk@qt.io> | 2023-02-24 12:46:01 +0000 |
| commit | 6cd8bca691a260d2cc6a0e8b579888974a24cd69 (patch) | |
| tree | fcd9fdb851e4166edf26870435e6afbc25b54984 /src/plugins/debugger/debuggerprotocol.cpp | |
| parent | 040ebf81719b0c43af25f3336599f23ceb94c01b (diff) | |
| download | qt-creator-6cd8bca691a260d2cc6a0e8b579888974a24cd69.tar.gz | |
Debugger: Simplify gdb output parsing structure
The base problem is that gdb output is weird outside the 7 bit
ASCII range. Could be true UTF-8, or \x encoded UTF-8 byte
sequences, i.e. three layers of encoding.
Change-Id: Id9ee4bd4a8979624f9682f28064c3ac599afe4b9
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/plugins/debugger/debuggerprotocol.cpp')
| -rw-r--r-- | src/plugins/debugger/debuggerprotocol.cpp | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/src/plugins/debugger/debuggerprotocol.cpp b/src/plugins/debugger/debuggerprotocol.cpp index 808b5625d0..301949f822 100644 --- a/src/plugins/debugger/debuggerprotocol.cpp +++ b/src/plugins/debugger/debuggerprotocol.cpp @@ -109,8 +109,6 @@ static bool parseOctalEscapedHelper(DebuggerOutputParser &parser, QByteArray &bu { if (parser.remainingChars() < 4) return false; - if (!parser.isCurrent('\\')) - return false; const char c1 = parser.lookAhead(1).unicode(); const char c2 = parser.lookAhead(2).unicode(); @@ -127,8 +125,6 @@ static bool parseHexEscapedHelper(DebuggerOutputParser &parser, QByteArray &buff { if (parser.remainingChars() < 4) return false; - if (!parser.isCurrent('\\')) - return false; if (parser.lookAhead(1) != 'x') return false; @@ -142,7 +138,7 @@ static bool parseHexEscapedHelper(DebuggerOutputParser &parser, QByteArray &buff return true; } -static void parseSimpleEscape(DebuggerOutputParser &parser, QString &result) +static void parseSimpleEscape(DebuggerOutputParser &parser, QByteArray &result) { if (parser.isAtEnd()) { qDebug() << "MI Parse Error, unterminated backslash escape"; @@ -167,23 +163,18 @@ static void parseSimpleEscape(DebuggerOutputParser &parser, QString &result) } } -// Reads subsequent \123 or \x12 entities and converts to Utf8, -// *or* one escaped char, *or* one unescaped char. -static void parseCharOrEscape(DebuggerOutputParser &parser, QString &result) +// Reads one \123 or \x12 entity, *or* one escaped char, *or* one unescaped char. +static void parseCharOrEscape(DebuggerOutputParser &parser, QByteArray &result) { - QByteArray buffer; - while (parseOctalEscapedHelper(parser, buffer)) - ; - while (parseHexEscapedHelper(parser, buffer)) - ; - - if (!buffer.isEmpty()) { - result.append(QString::fromUtf8(buffer)); - } else if (parser.isCurrent('\\')) { + if (parser.isCurrent('\\')) { + if (parseOctalEscapedHelper(parser, result)) + return; + if (parseHexEscapedHelper(parser, result)) + return; parser.advance(); parseSimpleEscape(parser, result); } else { - result += parser.readChar(); + result += char(parser.readChar().unicode()); } } @@ -199,12 +190,12 @@ QString DebuggerOutputParser::readCString() } ++from; // Skip initial quote. - QString result; + QByteArray result; result.reserve(30); while (from < to) { if (*from == '"') { ++from; - return result; + return QString::fromUtf8(result); } parseCharOrEscape(*this, result); } |
