aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Utility/StringExtractorGDBRemote.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Utility/StringExtractorGDBRemote.cpp')
-rw-r--r--lldb/source/Utility/StringExtractorGDBRemote.cpp86
1 files changed, 64 insertions, 22 deletions
diff --git a/lldb/source/Utility/StringExtractorGDBRemote.cpp b/lldb/source/Utility/StringExtractorGDBRemote.cpp
index 3c0a9ca..7e06a0f 100644
--- a/lldb/source/Utility/StringExtractorGDBRemote.cpp
+++ b/lldb/source/Utility/StringExtractorGDBRemote.cpp
@@ -53,48 +53,90 @@ StringExtractorGDBRemote::GetResponseType () const
StringExtractorGDBRemote::ServerPacketType
StringExtractorGDBRemote::GetServerPacketType () const
{
+#define PACKET_MATCHES(s) ((packet_size == (sizeof(s)-1)) && (strcmp((packet_cstr),(s)) == 0))
+#define PACKET_STARTS_WITH(s) ((packet_size >= (sizeof(s)-1)) && ::strncmp(packet_cstr, s, (sizeof(s)-1))==0)
+
// Empty is not a supported packet...
if (m_packet.empty())
return eServerPacketType_invalid;
+ const size_t packet_size = m_packet.size();
const char *packet_cstr = m_packet.c_str();
switch (m_packet[0])
{
case '\x03':
- if (m_packet.size() == 1)
- return eServerPacketType_interrupt;
+ if (packet_size == 1) return eServerPacketType_interrupt;
break;
case '-':
- if (m_packet.size() == 1)
- return eServerPacketType_nack;
+ if (packet_size == 1) return eServerPacketType_nack;
break;
case '+':
- if (m_packet.size() == 1)
- return eServerPacketType_ack;
+ if (packet_size == 1) return eServerPacketType_ack;
break;
+ case 'A':
+ return eServerPacketType_A;
+
case 'Q':
- if (strcmp (packet_cstr, "QStartNoAckMode") == 0)
- return eServerPacketType_QStartNoAckMode;
+ switch (packet_cstr[1])
+ {
+ case 'E':
+ if (PACKET_STARTS_WITH ("QEnvironment:")) return eServerPacketType_QEnvironment;
+ break;
+
+ case 'S':
+ if (PACKET_MATCHES ("QStartNoAckMode")) return eServerPacketType_QStartNoAckMode;
+ else if (PACKET_STARTS_WITH ("QSetDisableASLR:")) return eServerPacketType_QSetDisableASLR;
+ else if (PACKET_STARTS_WITH ("QSetSTDIN:")) return eServerPacketType_QSetSTDIN;
+ else if (PACKET_STARTS_WITH ("QSetSTDOUT:")) return eServerPacketType_QSetSTDOUT;
+ else if (PACKET_STARTS_WITH ("QSetSTDERR:")) return eServerPacketType_QSetSTDERR;
+ else if (PACKET_STARTS_WITH ("QSetWorkingDir:")) return eServerPacketType_QSetWorkingDir;
+ break;
+ }
break;
case 'q':
- if (packet_cstr[1] == 'S' && 0 == ::strncmp(packet_cstr, "qSpeedTest:", strlen("qSpeedTest:")))
- return eServerPacketType_qSpeedTest;
- else if (packet_cstr[1] == 'H' && 0 == ::strcmp (packet_cstr, "qHostInfo"))
- return eServerPacketType_qHostInfo;
- else if (packet_cstr[1] == 'P' && 0 == ::strncmp(packet_cstr, "qProcessInfoPID:", strlen("qProcessInfoPID:")))
- return eServerPacketType_qProcessInfoPID;
- else if (packet_cstr[1] == 'f' && 0 == ::strncmp(packet_cstr, "qfProcessInfo", strlen("qfProcessInfo")))
- return eServerPacketType_qfProcessInfo;
- else if (packet_cstr[1] == 'U' && 0 == ::strncmp(packet_cstr, "qUserName:", strlen("qUserName:")))
- return eServerPacketType_qUserName;
- else if (packet_cstr[1] == 'G' && 0 == ::strncmp(packet_cstr, "qGroupName:", strlen("qGroupName:")))
- return eServerPacketType_qGroupName;
- else if (packet_cstr[1] == 's' && 0 == ::strcmp (packet_cstr, "qsProcessInfo"))
- return eServerPacketType_qsProcessInfo;
+ switch (packet_cstr[1])
+ {
+ case 's':
+ if (PACKET_MATCHES ("qsProcessInfo")) return eServerPacketType_qsProcessInfo;
+ break;
+
+ case 'f':
+ if (PACKET_STARTS_WITH ("qfProcessInfo")) return eServerPacketType_qfProcessInfo;
+ break;
+
+ case 'C':
+ if (packet_size == 2) return eServerPacketType_qC;
+ break;
+
+ case 'G':
+ if (PACKET_STARTS_WITH ("qGroupName:")) return eServerPacketType_qGroupName;
+ break;
+
+ case 'H':
+ if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo;
+ break;
+
+ case 'L':
+ if (PACKET_MATCHES ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer;
+ if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess;
+ break;
+
+ case 'P':
+ if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID;
+ break;
+
+ case 'S':
+ if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest;
+ break;
+
+ case 'U':
+ if (PACKET_STARTS_WITH ("qUserName:")) return eServerPacketType_qUserName;
+ break;
+ }
break;
}
return eServerPacketType_unimplemented;