diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index d2e4e458fee..161d48c424a 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2542,7 +2542,7 @@ QByteArray GdbEngine::breakpointLocation(BreakpointModelId id) ? data.fileName : breakLocation(data.fileName); // The argument is simply a C-quoted version of the argument to the // non-MI "break" command, including the "original" quoting it wants. - return "\"\\\"" + GdbMi::escapeCString(fileName).toLocal8Bit() + "\\\":" + return "\"\\\"" + GdbMi::escapeCString(fileName.toLocal8Bit()) + "\\\":" + QByteArray::number(data.lineNumber) + '"'; } @@ -2552,7 +2552,7 @@ QByteArray GdbEngine::breakpointLocation2(BreakpointModelId id) const BreakpointParameters &data = handler->breakpointData(id); const QString fileName = data.pathUsage == BreakpointUseFullPath ? data.fileName : breakLocation(data.fileName); - return GdbMi::escapeCString(fileName).toLocal8Bit() + ':' + return GdbMi::escapeCString(fileName.toLocal8Bit()) + ':' + QByteArray::number(data.lineNumber); } @@ -2685,7 +2685,7 @@ void GdbEngine::handleBreakInsert1(const GdbResponse &response) const QString fileName = handler->fileName(id); const int lineNumber = handler->lineNumber(id); QByteArray cmd = "trace " - "\"" + GdbMi::escapeCString(fileName).toLocal8Bit() + "\":" + "\"" + GdbMi::escapeCString(fileName.toLocal8Bit()) + "\":" + QByteArray::number(lineNumber); QVariant vid = QVariant::fromValue(id); postCommand(cmd, NeedsStop | RebuildBreakpointModel, diff --git a/src/plugins/debugger/gdb/gdbmi.cpp b/src/plugins/debugger/gdb/gdbmi.cpp index 42e06e5bff6..a6c24629863 100644 --- a/src/plugins/debugger/gdb/gdbmi.cpp +++ b/src/plugins/debugger/gdb/gdbmi.cpp @@ -246,69 +246,36 @@ void GdbMi::dumpChildren(QByteArray * str, bool multiline, int indent) const } } -template -struct EscapeTraits +QByteArray GdbMi::escapeCString(const QByteArray &ba) { - static CharType at(const String &s, int i) - { return s.at(i); } - static void appendChar(CharType c, String *s) - { s->append(c); } - static void appendString(const char *c, String *s) - { s->append(c); } -}; - -template <> -struct EscapeTraits -{ - static ushort at(const QString &s, int i) - { return s.at(i).unicode(); } - static void appendChar(ushort c, QString *s) - { s->append(QLatin1Char(c)); } - static void appendString(const char *c, QString *s) - { s->append(QLatin1String(c)); } -}; - -template -inline ST escapeCStringTpl(const ST &ba) -{ - ST ret; + QByteArray ret; ret.reserve(ba.length() * 2); for (int i = 0; i < ba.length(); ++i) { - const CT c = EscapeTraits::at(ba, i); + const uchar c = ba.at(i); switch (c) { - case '\\': EscapeTraits::appendString("\\\\", &ret); break; - case '\a': EscapeTraits::appendString("\\a", &ret); break; - case '\b': EscapeTraits::appendString("\\b", &ret); break; - case '\f': EscapeTraits::appendString("\\f", &ret); break; - case '\n': EscapeTraits::appendString("\\n", &ret); break; - case '\r': EscapeTraits::appendString("\\r", &ret); break; - case '\t': EscapeTraits::appendString("\\t", &ret); break; - case '\v': EscapeTraits::appendString("\\v", &ret); break; - case '"': EscapeTraits::appendString("\\\"", &ret); break; + case '\\': ret += "\\\\"; break; + case '\a': ret += "\\a"; break; + case '\b': ret += "\\b"; break; + case '\f': ret += "\\f"; break; + case '\n': ret += "\\n"; break; + case '\r': ret += "\\r"; break; + case '\t': ret += "\\t"; break; + case '\v': ret += "\\v"; break; + case '"': ret += "\\\""; break; default: if (c < 32 || c == 127) { - EscapeTraits::appendChar('\\', &ret); - EscapeTraits::appendChar('0' + (c >> 6), &ret); - EscapeTraits::appendChar('0' + ((c >> 3) & 7), &ret); - EscapeTraits::appendChar('0' + (c & 7), &ret); + ret += '\\'; + ret += ('0' + (c >> 6)); + ret += ('0' + ((c >> 3) & 7)); + ret += ('0' + (c & 7)); } else { - EscapeTraits::appendChar(c, &ret); + ret += c; } } } return ret; } -QString GdbMi::escapeCString(const QString &ba) -{ - return escapeCStringTpl(ba); -} - -QByteArray GdbMi::escapeCString(const QByteArray &ba) -{ - return escapeCStringTpl(ba); -} - QByteArray GdbMi::toString(bool multiline, int indent) const { QByteArray result; diff --git a/src/plugins/debugger/gdb/gdbmi.h b/src/plugins/debugger/gdb/gdbmi.h index fe36eafb75c..26df7fb1c9a 100644 --- a/src/plugins/debugger/gdb/gdbmi.h +++ b/src/plugins/debugger/gdb/gdbmi.h @@ -135,7 +135,6 @@ private: static QByteArray parseCString(const char *&from, const char *to); static QByteArray escapeCString(const QByteArray &ba); - static QString escapeCString(const QString &ba); void parseResultOrValue(const char *&from, const char *to); void parseValue(const char *&from, const char *to); void parseTuple(const char *&from, const char *to);