diff options
Diffstat (limited to 'lldb/source/Utility')
-rw-r--r-- | lldb/source/Utility/StringExtractor.cpp | 78 | ||||
-rw-r--r-- | lldb/source/Utility/StringExtractor.h | 13 | ||||
-rw-r--r-- | lldb/source/Utility/StringExtractorGDBRemote.cpp | 45 | ||||
-rw-r--r-- | lldb/source/Utility/StringExtractorGDBRemote.h | 19 |
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_ |