summaryrefslogtreecommitdiffstats
path: root/lldb/source/Utility
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Utility')
-rw-r--r--lldb/source/Utility/StringExtractor.cpp78
-rw-r--r--lldb/source/Utility/StringExtractor.h13
-rw-r--r--lldb/source/Utility/StringExtractorGDBRemote.cpp45
-rw-r--r--lldb/source/Utility/StringExtractorGDBRemote.h19
4 files changed, 149 insertions, 6 deletions
diff --git a/lldb/source/Utility/StringExtractor.cpp b/lldb/source/Utility/StringExtractor.cpp
index 2f4bcecda8f..d4ce470d56f 100644
--- a/lldb/source/Utility/StringExtractor.cpp
+++ b/lldb/source/Utility/StringExtractor.cpp
@@ -168,10 +168,68 @@ StringExtractor::GetU32 (uint32_t fail_value, int base)
{
char *end = NULL;
const char *start = m_packet.c_str();
- const char *uint_cstr = start + m_index;
- uint32_t result = ::strtoul (uint_cstr, &end, base);
+ const char *cstr = start + m_index;
+ uint32_t result = ::strtoul (cstr, &end, base);
- if (end && end != uint_cstr)
+ if (end && end != cstr)
+ {
+ m_index = end - start;
+ return result;
+ }
+ }
+ return fail_value;
+}
+
+int32_t
+StringExtractor::GetS32 (int32_t fail_value, int base)
+{
+ if (m_index < m_packet.size())
+ {
+ char *end = NULL;
+ const char *start = m_packet.c_str();
+ const char *cstr = start + m_index;
+ int32_t result = ::strtol (cstr, &end, base);
+
+ if (end && end != cstr)
+ {
+ m_index = end - start;
+ return result;
+ }
+ }
+ return fail_value;
+}
+
+
+uint64_t
+StringExtractor::GetU64 (uint64_t fail_value, int base)
+{
+ if (m_index < m_packet.size())
+ {
+ char *end = NULL;
+ const char *start = m_packet.c_str();
+ const char *cstr = start + m_index;
+ uint64_t result = ::strtoull (cstr, &end, base);
+
+ if (end && end != cstr)
+ {
+ m_index = end - start;
+ return result;
+ }
+ }
+ return fail_value;
+}
+
+int64_t
+StringExtractor::GetS64 (int64_t fail_value, int base)
+{
+ if (m_index < m_packet.size())
+ {
+ char *end = NULL;
+ const char *start = m_packet.c_str();
+ const char *cstr = start + m_index;
+ int64_t result = ::strtoll (cstr, &end, base);
+
+ if (end && end != cstr)
{
m_index = end - start;
return result;
@@ -371,6 +429,20 @@ StringExtractor::GetHexByteString (std::string &str)
return str.size();
}
+size_t
+StringExtractor::GetHexByteStringTerminatedBy (std::string &str,
+ char terminator)
+{
+ str.clear();
+ char ch;
+ while ((ch = GetHexU8(0,false)) != '\0')
+ str.append(1, ch);
+ if (Peek() && *Peek() == terminator)
+ return str.size();
+ str.clear();
+ return str.size();
+}
+
bool
StringExtractor::GetNameColonValue (std::string &name, std::string &value)
{
diff --git a/lldb/source/Utility/StringExtractor.h b/lldb/source/Utility/StringExtractor.h
index 0ded3101fcc..2aab3b09f47 100644
--- a/lldb/source/Utility/StringExtractor.h
+++ b/lldb/source/Utility/StringExtractor.h
@@ -101,9 +101,18 @@ public:
bool
GetNameColonValue (std::string &name, std::string &value);
+ int32_t
+ GetS32 (int32_t fail_value, int base = 0);
+
uint32_t
GetU32 (uint32_t fail_value, int base = 0);
+ int64_t
+ GetS64 (int64_t fail_value, int base = 0);
+
+ uint64_t
+ GetU64 (uint64_t fail_value, int base = 0);
+
uint32_t
GetHexMaxU32 (bool little_endian, uint32_t fail_value);
@@ -119,6 +128,10 @@ public:
size_t
GetHexByteString (std::string &str);
+ size_t
+ GetHexByteStringTerminatedBy (std::string &str,
+ char terminator);
+
const char *
Peek ()
{
diff --git a/lldb/source/Utility/StringExtractorGDBRemote.cpp b/lldb/source/Utility/StringExtractorGDBRemote.cpp
index 7e06a0f59bc..6e32481ccc5 100644
--- a/lldb/source/Utility/StringExtractorGDBRemote.cpp
+++ b/lldb/source/Utility/StringExtractorGDBRemote.cpp
@@ -94,6 +94,9 @@ StringExtractorGDBRemote::GetServerPacketType () const
else if (PACKET_STARTS_WITH ("QSetSTDERR:")) return eServerPacketType_QSetSTDERR;
else if (PACKET_STARTS_WITH ("QSetWorkingDir:")) return eServerPacketType_QSetWorkingDir;
break;
+ case 'L':
+ if (PACKET_STARTS_WITH ("QLaunchArch:")) return eServerPacketType_QLaunchArch;
+ break;
}
break;
@@ -120,14 +123,21 @@ StringExtractorGDBRemote::GetServerPacketType () const
if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo;
break;
+ case 'K':
+ if (PACKET_STARTS_WITH ("qKillSpawnedProcess")) return eServerPacketType_qKillSpawnedProcess;
+ break;
+
case 'L':
- if (PACKET_MATCHES ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer;
+ if (PACKET_STARTS_WITH ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer;
if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess;
break;
case 'P':
- if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID;
+ if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID;
+ if (PACKET_STARTS_WITH ("qPlatform_RunCommand:")) return eServerPacketType_qPlatform_RunCommand;
+ if (PACKET_STARTS_WITH ("qPlatform_IO_MkDir:")) return eServerPacketType_qPlatform_IO_MkDir;
break;
+
case 'S':
if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest;
@@ -138,6 +148,21 @@ StringExtractorGDBRemote::GetServerPacketType () const
break;
}
break;
+ case 'v':
+ if (PACKET_STARTS_WITH("vFile:"))
+ {
+ if (PACKET_STARTS_WITH("vFile:open:")) return eServerPacketType_vFile_Open;
+ else if (PACKET_STARTS_WITH("vFile:close:")) return eServerPacketType_vFile_Close;
+ else if (PACKET_STARTS_WITH("vFile:pread")) return eServerPacketType_vFile_pRead;
+ else if (PACKET_STARTS_WITH("vFile:pwrite")) return eServerPacketType_vFile_pWrite;
+ else if (PACKET_STARTS_WITH("vFile:size")) return eServerPacketType_vFile_Size;
+ else if (PACKET_STARTS_WITH("vFile:exists")) return eServerPacketType_vFile_Exists;
+ else if (PACKET_STARTS_WITH("vFile:stat")) return eServerPacketType_vFile_Stat;
+ else if (PACKET_STARTS_WITH("vFile:mode")) return eServerPacketType_vFile_Mode;
+ else if (PACKET_STARTS_WITH("vFile:MD5")) return eServerPacketType_vFile_MD5;
+
+ }
+ break;
}
return eServerPacketType_unimplemented;
}
@@ -180,3 +205,19 @@ StringExtractorGDBRemote::GetError ()
}
return 0;
}
+
+size_t
+StringExtractorGDBRemote::GetEscapedBinaryData (std::string &str)
+{
+ str.clear();
+ char ch;
+ while (GetBytesLeft())
+ {
+ ch = GetChar();
+ if (ch == 0x7d)
+ ch = (GetChar() ^ 0x20);
+ str.append(1,ch);
+ }
+ return str.size();
+}
+
diff --git a/lldb/source/Utility/StringExtractorGDBRemote.h b/lldb/source/Utility/StringExtractorGDBRemote.h
index 5a24d894b10..fe500ecda5d 100644
--- a/lldb/source/Utility/StringExtractorGDBRemote.h
+++ b/lldb/source/Utility/StringExtractorGDBRemote.h
@@ -53,17 +53,30 @@ public:
eServerPacketType_qGroupName,
eServerPacketType_qHostInfo,
eServerPacketType_qLaunchGDBServer,
+ eServerPacketType_qKillSpawnedProcess,
eServerPacketType_qLaunchSuccess,
eServerPacketType_qProcessInfoPID,
eServerPacketType_qSpeedTest,
eServerPacketType_qUserName,
eServerPacketType_QEnvironment,
+ eServerPacketType_QLaunchArch,
eServerPacketType_QSetDisableASLR,
eServerPacketType_QSetSTDIN,
eServerPacketType_QSetSTDOUT,
eServerPacketType_QSetSTDERR,
eServerPacketType_QSetWorkingDir,
- eServerPacketType_QStartNoAckMode
+ eServerPacketType_QStartNoAckMode,
+ eServerPacketType_qPlatform_RunCommand,
+ eServerPacketType_qPlatform_IO_MkDir,
+ eServerPacketType_vFile_Open,
+ eServerPacketType_vFile_Close,
+ eServerPacketType_vFile_pRead,
+ eServerPacketType_vFile_pWrite,
+ eServerPacketType_vFile_Size,
+ eServerPacketType_vFile_Mode,
+ eServerPacketType_vFile_Exists,
+ eServerPacketType_vFile_MD5,
+ eServerPacketType_vFile_Stat
};
ServerPacketType
@@ -98,6 +111,10 @@ public:
// digits. Otherwise the error encoded in XX is returned.
uint8_t
GetError();
+
+ size_t
+ GetEscapedBinaryData (std::string &str);
+
};
#endif // utility_StringExtractorGDBRemote_h_
OpenPOWER on IntegriCloud