diff options
Diffstat (limited to 'gdbremote_parser.cpp')
-rw-r--r-- | gdbremote_parser.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/gdbremote_parser.cpp b/gdbremote_parser.cpp index b9115be..98533c5 100644 --- a/gdbremote_parser.cpp +++ b/gdbremote_parser.cpp @@ -79,6 +79,15 @@ struct Token { } }; +static std::string DecodeBinaryHex(const std::string& data_hex) +{ + std::string data(data_hex.size()/2, '\0'); + for (size_t i = 0; i < data.size(); i++) { + data[i] = Utils::ParseByteFromHexChars(data_hex[i * 2], data_hex[i * 2 + 1]); + } + return data; +} + struct Command { std::string name; Packet (*parse)(const std::vector<Token>&&); @@ -122,6 +131,22 @@ struct Command { { return Packet{PacketType::kQueryTraceStatus}; } + static Packet parseQueryRcmd(const std::vector<Token>&& tokens) + { + if (tokens.size() < 3) + return Packet::None(); + if (tokens[1].type != TokenType::kSeparatorComma) + return Packet::None(); + if (tokens[2].type != TokenType::kHexNumeric) + return Packet::None(); + const std::string& data_encoded = tokens[2].data; + const std::string data = DecodeBinaryHex(data_encoded); + printf("%s\n", data.c_str()); + return Packet{ + PacketType::kQueryRcmd, + std::make_unique<const PacketDataRcmd>(std::move(data)), + }; + } static Packet parseSetThreadForCont(const std::vector<Token>&&) { // TODO arguments @@ -146,7 +171,7 @@ struct Command { } static Packet parseContinueVCont(const std::vector<Token>&& tokens) { - const std::string first_arg = tokens[1].data; + const std::string first_arg = tokens.size() > 1 ? tokens[1].data : ""; // Check if it is "vCont?" command if (first_arg == "?") { return Packet{PacketType::kContinueAskSupported}; @@ -260,6 +285,7 @@ static const Command commands[] = { { "qL", Command::parseQueryRTOSThreadInfo }, { "qAttached", Command::parseQueryAttached }, { "qTStatus", Command::parseQueryTraceStatus }, + { "qRcmd", Command::parseQueryRcmd }, { "Hc", Command::parseSetThreadForCont }, { "Hg", Command::parseSetThreadForOps }, { "vMustReplyEmpty", Command::parseMustReplyEmpty }, |