I've seen that one. What kind of changes do you have in mind? I am not sure how these things are related, as the StdString version is already being used only by debugserver (*), and you don't plan to make changes to it (afaik).
(*) $ git grep -l -w StdStringExtractor include/lldb/Utility/StdStringExtractor.h source/Utility/CMakeLists.txt source/Utility/StdStringExtractor.cpp tools/debugserver/debugserver.xcodeproj/project.pbxproj tools/debugserver/source/CMakeLists.txt tools/debugserver/source/JSON.cpp tools/debugserver/source/JSON.h tools/debugserver/source/RNBRemote.cpp pl On 30 August 2016 at 14:37, Zachary Turner <ztur...@google.com> wrote: > Yes, there was a thread on lldb dev about it. After i get all the changes in > to the newer one we can move the old one out > > On Tue, Aug 30, 2016 at 6:32 AM Pavel Labath <lab...@google.com> wrote: >> >> I think we should move the new file away from source/Utility. If it's >> supposed to be used by debugserver only, we probably should move it to >> tools/debugserver/source ? Right now, debugservers cmake file contains >> a hack to be able to include these, so by doing that we will remove >> that as well. >> >> Thoughts ? >> >> pl >> >> PS: judging by the CMakeLists.txt, the other file which is included in >> such a funny way is source/Host/common/StringConvert.cpp >> >> >> On 29 August 2016 at 20:46, Zachary Turner via lldb-commits >> <lldb-commits@lists.llvm.org> wrote: >> > Author: zturner >> > Date: Mon Aug 29 14:45:59 2016 >> > New Revision: 279997 >> > >> > URL: http://llvm.org/viewvc/llvm-project?rev=279997&view=rev >> > Log: >> > Copy StringExtractor to StdStringExtractor. >> > >> > I have some improvements to make to StringExtractor that require >> > using LLVM. debugserver can't take a dependency on LLVM but uses >> > this file, so I'm forking it off into StdStringExtractor and >> > StringExtractor, so that StringExtractor can take advantage of >> > some performance improvements and readability improvements that >> > LLVM can provide. >> > >> > Added: >> > lldb/trunk/include/lldb/Utility/StdStringExtractor.h >> > lldb/trunk/source/Utility/StdStringExtractor.cpp >> > Modified: >> > lldb/trunk/source/Utility/CMakeLists.txt >> > lldb/trunk/tools/debugserver/source/JSON.cpp >> > lldb/trunk/tools/debugserver/source/JSON.h >> > lldb/trunk/tools/debugserver/source/RNBRemote.cpp >> > >> > Added: lldb/trunk/include/lldb/Utility/StdStringExtractor.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Utility/StdStringExtractor.h?rev=279997&view=auto >> > >> > ============================================================================== >> > --- lldb/trunk/include/lldb/Utility/StdStringExtractor.h (added) >> > +++ lldb/trunk/include/lldb/Utility/StdStringExtractor.h Mon Aug 29 >> > 14:45:59 2016 >> > @@ -0,0 +1,181 @@ >> > +//===-- StdStringExtractor.h ------------------------------------*- C++ >> > -*-===// >> > +// >> > +// The LLVM Compiler Infrastructure >> > +// >> > +// This file is distributed under the University of Illinois Open >> > Source >> > +// License. See LICENSE.TXT for details. >> > +// >> > >> > +//===----------------------------------------------------------------------===// >> > + >> > +#ifndef utility_StdStringExtractor_h_ >> > +#define utility_StdStringExtractor_h_ >> > + >> > +// C Includes >> > +// C++ Includes >> > +#include <string> >> > +#include <stdint.h> >> > + >> > +// Other libraries and framework includes >> > +// Project includes >> > + >> > +// Based on StringExtractor, with the added limitation that this file >> > should not >> > +// take a dependency on LLVM, as it is used from debugserver. >> > +class StdStringExtractor >> > +{ >> > +public: >> > + >> > + enum { >> > + BigEndian = 0, >> > + LittleEndian = 1 >> > + }; >> > + >> > //------------------------------------------------------------------ >> > + // Constructors and Destructors >> > + >> > //------------------------------------------------------------------ >> > + StdStringExtractor(); >> > + StdStringExtractor(const char *packet_cstr); >> > + StdStringExtractor(const StdStringExtractor& rhs); >> > + virtual ~StdStringExtractor(); >> > + >> > + >> > //------------------------------------------------------------------ >> > + // Operators >> > + >> > //------------------------------------------------------------------ >> > + const StdStringExtractor& >> > + operator=(const StdStringExtractor& rhs); >> > + >> > + // Returns true if the file position is still valid for the data >> > + // contained in this string extractor object. >> > + bool >> > + IsGood() const >> > + { >> > + return m_index != UINT64_MAX; >> > + } >> > + >> > + uint64_t >> > + GetFilePos () const >> > + { >> > + return m_index; >> > + } >> > + >> > + void >> > + SetFilePos (uint32_t idx) >> > + { >> > + m_index = idx; >> > + } >> > + >> > + void >> > + Clear () >> > + { >> > + m_packet.clear(); >> > + m_index = 0; >> > + } >> > + >> > + void >> > + SkipSpaces (); >> > + >> > + std::string & >> > + GetStringRef () >> > + { >> > + return m_packet; >> > + } >> > + >> > + const std::string & >> > + GetStringRef () const >> > + { >> > + return m_packet; >> > + } >> > + >> > + bool >> > + Empty() >> > + { >> > + return m_packet.empty(); >> > + } >> > + >> > + size_t >> > + GetBytesLeft () >> > + { >> > + if (m_index < m_packet.size()) >> > + return m_packet.size() - m_index; >> > + return 0; >> > + } >> > + >> > + char >> > + GetChar (char fail_value = '\0'); >> > + >> > + char >> > + PeekChar (char fail_value = '\0') >> > + { >> > + const char *cstr = Peek(); >> > + if (cstr) >> > + return cstr[0]; >> > + return fail_value; >> > + } >> > + >> > + int >> > + DecodeHexU8(); >> > + >> > + uint8_t >> > + GetHexU8 (uint8_t fail_value = 0, bool set_eof_on_fail = true); >> > + >> > + bool >> > + GetHexU8Ex (uint8_t& ch, bool set_eof_on_fail = true); >> > + >> > + 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); >> > + >> > + uint64_t >> > + GetHexMaxU64 (bool little_endian, uint64_t fail_value); >> > + >> > + size_t >> > + GetHexBytes (void *dst, size_t dst_len, uint8_t fail_fill_value); >> > + >> > + size_t >> > + GetHexBytesAvail (void *dst, size_t dst_len); >> > + >> > + uint64_t >> > + GetHexWithFixedSize (uint32_t byte_size, bool little_endian, >> > uint64_t fail_value); >> > + >> > + size_t >> > + GetHexByteString (std::string &str); >> > + >> > + size_t >> > + GetHexByteStringFixedLength (std::string &str, uint32_t >> > nibble_length); >> > + >> > + size_t >> > + GetHexByteStringTerminatedBy (std::string &str, >> > + char terminator); >> > + >> > + const char * >> > + Peek () >> > + { >> > + if (m_index < m_packet.size()) >> > + return m_packet.c_str() + m_index; >> > + return nullptr; >> > + } >> > + >> > +protected: >> > + >> > //------------------------------------------------------------------ >> > + // For StdStringExtractor only >> > + >> > //------------------------------------------------------------------ >> > + std::string m_packet; // The string in which to extract data. >> > + uint64_t m_index; // When extracting data from a packet, this >> > index >> > + // will march along as things get >> > extracted. If set >> > + // to UINT64_MAX the end of the packet data >> > was >> > + // reached when decoding information >> > +}; >> > + >> > +#endif // utility_StringExtractor_h_ >> > >> > Modified: lldb/trunk/source/Utility/CMakeLists.txt >> > URL: >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/CMakeLists.txt?rev=279997&r1=279996&r2=279997&view=diff >> > >> > ============================================================================== >> > --- lldb/trunk/source/Utility/CMakeLists.txt (original) >> > +++ lldb/trunk/source/Utility/CMakeLists.txt Mon Aug 29 14:45:59 2016 >> > @@ -12,6 +12,7 @@ add_lldb_library(lldbUtility >> > RegisterNumber.cpp >> > SelectHelper.cpp >> > SharingPtr.cpp >> > + StdStringExtractor.cpp >> > StringExtractor.cpp >> > StringExtractorGDBRemote.cpp >> > StringLexer.cpp >> > >> > Added: lldb/trunk/source/Utility/StdStringExtractor.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/StdStringExtractor.cpp?rev=279997&view=auto >> > >> > ============================================================================== >> > --- lldb/trunk/source/Utility/StdStringExtractor.cpp (added) >> > +++ lldb/trunk/source/Utility/StdStringExtractor.cpp Mon Aug 29 14:45:59 >> > 2016 >> > @@ -0,0 +1,502 @@ >> > +//===-- StdStringExtractor.cpp ----------------------------------*- C++ >> > -*-===// >> > +// >> > +// The LLVM Compiler Infrastructure >> > +// >> > +// This file is distributed under the University of Illinois Open >> > Source >> > +// License. See LICENSE.TXT for details. >> > +// >> > >> > +//===----------------------------------------------------------------------===// >> > + >> > +#include "lldb/Utility/StdStringExtractor.h" >> > + >> > +// C Includes >> > +#include <stdlib.h> >> > + >> > +// C++ Includes >> > +// Other libraries and framework includes >> > +// Project includes >> > + >> > +static inline int >> > +xdigit_to_sint (char ch) >> > +{ >> > + if (ch >= 'a' && ch <= 'f') >> > + return 10 + ch - 'a'; >> > + if (ch >= 'A' && ch <= 'F') >> > + return 10 + ch - 'A'; >> > + if (ch >= '0' && ch <= '9') >> > + return ch - '0'; >> > + return -1; >> > +} >> > + >> > >> > +//---------------------------------------------------------------------- >> > +// StdStringExtractor constructor >> > >> > +//---------------------------------------------------------------------- >> > +StdStringExtractor::StdStringExtractor() : >> > + m_packet(), >> > + m_index (0) >> > +{ >> > +} >> > + >> > + >> > +StdStringExtractor::StdStringExtractor(const char *packet_cstr) : >> > + m_packet(), >> > + m_index (0) >> > +{ >> > + if (packet_cstr) >> > + m_packet.assign (packet_cstr); >> > +} >> > + >> > + >> > >> > +//---------------------------------------------------------------------- >> > +// StdStringExtractor copy constructor >> > >> > +//---------------------------------------------------------------------- >> > +StdStringExtractor::StdStringExtractor(const StdStringExtractor& rhs) : >> > + m_packet (rhs.m_packet), >> > + m_index (rhs.m_index) >> > +{ >> > + >> > +} >> > + >> > >> > +//---------------------------------------------------------------------- >> > +// StdStringExtractor assignment operator >> > >> > +//---------------------------------------------------------------------- >> > +const StdStringExtractor& >> > +StdStringExtractor::operator=(const StdStringExtractor& rhs) >> > +{ >> > + if (this != &rhs) >> > + { >> > + m_packet = rhs.m_packet; >> > + m_index = rhs.m_index; >> > + >> > + } >> > + return *this; >> > +} >> > + >> > >> > +//---------------------------------------------------------------------- >> > +// Destructor >> > >> > +//---------------------------------------------------------------------- >> > +StdStringExtractor::~StdStringExtractor() >> > +{ >> > +} >> > + >> > + >> > +char >> > +StdStringExtractor::GetChar (char fail_value) >> > +{ >> > + if (m_index < m_packet.size()) >> > + { >> > + char ch = m_packet[m_index]; >> > + ++m_index; >> > + return ch; >> > + } >> > + m_index = UINT64_MAX; >> > + return fail_value; >> > +} >> > + >> > >> > +//---------------------------------------------------------------------- >> > +// If a pair of valid hex digits exist at the head of the >> > +// StdStringExtractor they are decoded into an unsigned byte and >> > returned >> > +// by this function >> > +// >> > +// If there is not a pair of valid hex digits at the head of the >> > +// StdStringExtractor, it is left unchanged and -1 is returned >> > >> > +//---------------------------------------------------------------------- >> > +int >> > +StdStringExtractor::DecodeHexU8() >> > +{ >> > + SkipSpaces(); >> > + if (GetBytesLeft() < 2) >> > + { >> > + return -1; >> > + } >> > + const int hi_nibble = xdigit_to_sint(m_packet[m_index]); >> > + const int lo_nibble = xdigit_to_sint(m_packet[m_index+1]); >> > + if (hi_nibble == -1 || lo_nibble == -1) >> > + { >> > + return -1; >> > + } >> > + m_index += 2; >> > + return (uint8_t)((hi_nibble << 4) + lo_nibble); >> > +} >> > + >> > >> > +//---------------------------------------------------------------------- >> > +// Extract an unsigned character from two hex ASCII chars in the packet >> > +// string, or return fail_value on failure >> > >> > +//---------------------------------------------------------------------- >> > +uint8_t >> > +StdStringExtractor::GetHexU8 (uint8_t fail_value, bool set_eof_on_fail) >> > +{ >> > + // On success, fail_value will be overwritten with the next >> > + // character in the stream >> > + GetHexU8Ex(fail_value, set_eof_on_fail); >> > + return fail_value; >> > +} >> > + >> > +bool >> > +StdStringExtractor::GetHexU8Ex (uint8_t& ch, bool set_eof_on_fail) >> > +{ >> > + int byte = DecodeHexU8(); >> > + if (byte == -1) >> > + { >> > + if (set_eof_on_fail || m_index >= m_packet.size()) >> > + m_index = UINT64_MAX; >> > + // ch should not be changed in case of failure >> > + return false; >> > + } >> > + ch = (uint8_t)byte; >> > + return true; >> > +} >> > + >> > +uint32_t >> > +StdStringExtractor::GetU32 (uint32_t fail_value, int base) >> > +{ >> > + if (m_index < m_packet.size()) >> > + { >> > + char *end = nullptr; >> > + const char *start = m_packet.c_str(); >> > + const char *cstr = start + m_index; >> > + uint32_t result = static_cast<uint32_t>(::strtoul (cstr, &end, >> > base)); >> > + >> > + if (end && end != cstr) >> > + { >> > + m_index = end - start; >> > + return result; >> > + } >> > + } >> > + return fail_value; >> > +} >> > + >> > +int32_t >> > +StdStringExtractor::GetS32 (int32_t fail_value, int base) >> > +{ >> > + if (m_index < m_packet.size()) >> > + { >> > + char *end = nullptr; >> > + const char *start = m_packet.c_str(); >> > + const char *cstr = start + m_index; >> > + int32_t result = static_cast<int32_t>(::strtol (cstr, &end, >> > base)); >> > + >> > + if (end && end != cstr) >> > + { >> > + m_index = end - start; >> > + return result; >> > + } >> > + } >> > + return fail_value; >> > +} >> > + >> > + >> > +uint64_t >> > +StdStringExtractor::GetU64 (uint64_t fail_value, int base) >> > +{ >> > + if (m_index < m_packet.size()) >> > + { >> > + char *end = nullptr; >> > + 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 >> > +StdStringExtractor::GetS64 (int64_t fail_value, int base) >> > +{ >> > + if (m_index < m_packet.size()) >> > + { >> > + char *end = nullptr; >> > + 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; >> > + } >> > + } >> > + return fail_value; >> > +} >> > + >> > + >> > +uint32_t >> > +StdStringExtractor::GetHexMaxU32 (bool little_endian, uint32_t >> > fail_value) >> > +{ >> > + uint32_t result = 0; >> > + uint32_t nibble_count = 0; >> > + >> > + SkipSpaces(); >> > + if (little_endian) >> > + { >> > + uint32_t shift_amount = 0; >> > + while (m_index < m_packet.size() && ::isxdigit >> > (m_packet[m_index])) >> > + { >> > + // Make sure we don't exceed the size of a uint32_t... >> > + if (nibble_count >= (sizeof(uint32_t) * 2)) >> > + { >> > + m_index = UINT64_MAX; >> > + return fail_value; >> > + } >> > + >> > + uint8_t nibble_lo; >> > + uint8_t nibble_hi = xdigit_to_sint (m_packet[m_index]); >> > + ++m_index; >> > + if (m_index < m_packet.size() && ::isxdigit >> > (m_packet[m_index])) >> > + { >> > + nibble_lo = xdigit_to_sint (m_packet[m_index]); >> > + ++m_index; >> > + result |= ((uint32_t)nibble_hi << (shift_amount + 4)); >> > + result |= ((uint32_t)nibble_lo << shift_amount); >> > + nibble_count += 2; >> > + shift_amount += 8; >> > + } >> > + else >> > + { >> > + result |= ((uint32_t)nibble_hi << shift_amount); >> > + nibble_count += 1; >> > + shift_amount += 4; >> > + } >> > + >> > + } >> > + } >> > + else >> > + { >> > + while (m_index < m_packet.size() && ::isxdigit >> > (m_packet[m_index])) >> > + { >> > + // Make sure we don't exceed the size of a uint32_t... >> > + if (nibble_count >= (sizeof(uint32_t) * 2)) >> > + { >> > + m_index = UINT64_MAX; >> > + return fail_value; >> > + } >> > + >> > + uint8_t nibble = xdigit_to_sint (m_packet[m_index]); >> > + // Big Endian >> > + result <<= 4; >> > + result |= nibble; >> > + >> > + ++m_index; >> > + ++nibble_count; >> > + } >> > + } >> > + return result; >> > +} >> > + >> > +uint64_t >> > +StdStringExtractor::GetHexMaxU64 (bool little_endian, uint64_t >> > fail_value) >> > +{ >> > + uint64_t result = 0; >> > + uint32_t nibble_count = 0; >> > + >> > + SkipSpaces(); >> > + if (little_endian) >> > + { >> > + uint32_t shift_amount = 0; >> > + while (m_index < m_packet.size() && ::isxdigit >> > (m_packet[m_index])) >> > + { >> > + // Make sure we don't exceed the size of a uint64_t... >> > + if (nibble_count >= (sizeof(uint64_t) * 2)) >> > + { >> > + m_index = UINT64_MAX; >> > + return fail_value; >> > + } >> > + >> > + uint8_t nibble_lo; >> > + uint8_t nibble_hi = xdigit_to_sint (m_packet[m_index]); >> > + ++m_index; >> > + if (m_index < m_packet.size() && ::isxdigit >> > (m_packet[m_index])) >> > + { >> > + nibble_lo = xdigit_to_sint (m_packet[m_index]); >> > + ++m_index; >> > + result |= ((uint64_t)nibble_hi << (shift_amount + 4)); >> > + result |= ((uint64_t)nibble_lo << shift_amount); >> > + nibble_count += 2; >> > + shift_amount += 8; >> > + } >> > + else >> > + { >> > + result |= ((uint64_t)nibble_hi << shift_amount); >> > + nibble_count += 1; >> > + shift_amount += 4; >> > + } >> > + >> > + } >> > + } >> > + else >> > + { >> > + while (m_index < m_packet.size() && ::isxdigit >> > (m_packet[m_index])) >> > + { >> > + // Make sure we don't exceed the size of a uint64_t... >> > + if (nibble_count >= (sizeof(uint64_t) * 2)) >> > + { >> > + m_index = UINT64_MAX; >> > + return fail_value; >> > + } >> > + >> > + uint8_t nibble = xdigit_to_sint (m_packet[m_index]); >> > + // Big Endian >> > + result <<= 4; >> > + result |= nibble; >> > + >> > + ++m_index; >> > + ++nibble_count; >> > + } >> > + } >> > + return result; >> > +} >> > + >> > +size_t >> > +StdStringExtractor::GetHexBytes (void *dst_void, size_t dst_len, >> > uint8_t fail_fill_value) >> > +{ >> > + uint8_t *dst = (uint8_t*)dst_void; >> > + size_t bytes_extracted = 0; >> > + while (bytes_extracted < dst_len && GetBytesLeft ()) >> > + { >> > + dst[bytes_extracted] = GetHexU8 (fail_fill_value); >> > + if (IsGood()) >> > + ++bytes_extracted; >> > + else >> > + break; >> > + } >> > + >> > + for (size_t i = bytes_extracted; i < dst_len; ++i) >> > + dst[i] = fail_fill_value; >> > + >> > + return bytes_extracted; >> > +} >> > + >> > >> > +//---------------------------------------------------------------------- >> > +// Decodes all valid hex encoded bytes at the head of the >> > +// StdStringExtractor, limited by dst_len. >> > +// >> > +// Returns the number of bytes successfully decoded >> > >> > +//---------------------------------------------------------------------- >> > +size_t >> > +StdStringExtractor::GetHexBytesAvail (void *dst_void, size_t dst_len) >> > +{ >> > + uint8_t *dst = (uint8_t*)dst_void; >> > + size_t bytes_extracted = 0; >> > + while (bytes_extracted < dst_len) >> > + { >> > + int decode = DecodeHexU8(); >> > + if (decode == -1) >> > + { >> > + break; >> > + } >> > + dst[bytes_extracted++] = (uint8_t)decode; >> > + } >> > + return bytes_extracted; >> > +} >> > + >> > +// Consume ASCII hex nibble character pairs until we have decoded >> > byte_size >> > +// bytes of data. >> > + >> > +uint64_t >> > +StdStringExtractor::GetHexWithFixedSize (uint32_t byte_size, bool >> > little_endian, uint64_t fail_value) >> > +{ >> > + if (byte_size <= 8 && GetBytesLeft() >= byte_size * 2) >> > + { >> > + uint64_t result = 0; >> > + uint32_t i; >> > + if (little_endian) >> > + { >> > + // Little Endian >> > + uint32_t shift_amount; >> > + for (i = 0, shift_amount = 0; >> > + i < byte_size && IsGood(); >> > + ++i, shift_amount += 8) >> > + { >> > + result |= ((uint64_t)GetHexU8() << shift_amount); >> > + } >> > + } >> > + else >> > + { >> > + // Big Endian >> > + for (i = 0; i < byte_size && IsGood(); ++i) >> > + { >> > + result <<= 8; >> > + result |= GetHexU8(); >> > + } >> > + } >> > + } >> > + m_index = UINT64_MAX; >> > + return fail_value; >> > +} >> > + >> > +size_t >> > +StdStringExtractor::GetHexByteString (std::string &str) >> > +{ >> > + str.clear(); >> > + str.reserve(GetBytesLeft() / 2); >> > + char ch; >> > + while ((ch = GetHexU8()) != '\0') >> > + str.append(1, ch); >> > + return str.size(); >> > +} >> > + >> > +size_t >> > +StdStringExtractor::GetHexByteStringFixedLength (std::string &str, >> > uint32_t nibble_length) >> > +{ >> > + str.clear(); >> > + >> > + uint32_t nibble_count = 0; >> > + for (const char *pch = Peek(); (nibble_count < nibble_length) && >> > (pch != nullptr); str.append(1, GetHexU8(0, false)), pch = Peek (), >> > nibble_count += 2) >> > + {} >> > + >> > + return str.size(); >> > +} >> > + >> > +size_t >> > +StdStringExtractor::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 >> > +StdStringExtractor::GetNameColonValue (std::string &name, std::string >> > &value) >> > +{ >> > + // Read something in the form of NNNN:VVVV; where NNNN is any >> > character >> > + // that is not a colon, followed by a ':' character, then a value >> > (one or >> > + // more ';' chars), followed by a ';' >> > + if (m_index < m_packet.size()) >> > + { >> > + const size_t colon_idx = m_packet.find (':', m_index); >> > + if (colon_idx != std::string::npos) >> > + { >> > + const size_t semicolon_idx = m_packet.find (';', >> > colon_idx); >> > + if (semicolon_idx != std::string::npos) >> > + { >> > + name.assign (m_packet, m_index, colon_idx - m_index); >> > + value.assign (m_packet, colon_idx + 1, semicolon_idx - >> > (colon_idx + 1)); >> > + m_index = semicolon_idx + 1; >> > + return true; >> > + } >> > + } >> > + } >> > + m_index = UINT64_MAX; >> > + return false; >> > +} >> > + >> > +void >> > +StdStringExtractor::SkipSpaces () >> > +{ >> > + const size_t n = m_packet.size(); >> > + while (m_index < n && isspace(m_packet[m_index])) >> > + ++m_index; >> > +} >> > + >> > >> > Modified: lldb/trunk/tools/debugserver/source/JSON.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/JSON.cpp?rev=279997&r1=279996&r2=279997&view=diff >> > >> > ============================================================================== >> > --- lldb/trunk/tools/debugserver/source/JSON.cpp (original) >> > +++ lldb/trunk/tools/debugserver/source/JSON.cpp Mon Aug 29 14:45:59 >> > 2016 >> > @@ -319,7 +319,7 @@ JSONArray::GetNumElements () >> > >> > >> > JSONParser::JSONParser (const char *cstr) : >> > - StringExtractor(cstr) >> > + StdStringExtractor(cstr) >> > { >> > } >> > >> > >> > Modified: lldb/trunk/tools/debugserver/source/JSON.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/JSON.h?rev=279997&r1=279996&r2=279997&view=diff >> > >> > ============================================================================== >> > --- lldb/trunk/tools/debugserver/source/JSON.h (original) >> > +++ lldb/trunk/tools/debugserver/source/JSON.h Mon Aug 29 14:45:59 2016 >> > @@ -10,9 +10,9 @@ >> > #ifndef utility_JSON_h_ >> > #define utility_JSON_h_ >> > >> > -// This cross-project usage is fine as StringExtractor.h is entirely >> > +// This cross-project usage is fine as StdStringExtractor.h is entirely >> > // self-contained. >> > -#include "lldb/Utility/StringExtractor.h" >> > +#include "lldb/Utility/StdStringExtractor.h" >> > >> > // C includes >> > #include <inttypes.h> >> > @@ -338,7 +338,7 @@ public: >> > Vector m_elements; >> > }; >> > >> > -class JSONParser : public StringExtractor >> > +class JSONParser : public StdStringExtractor >> > { >> > public: >> > enum Token >> > >> > Modified: lldb/trunk/tools/debugserver/source/RNBRemote.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/RNBRemote.cpp?rev=279997&r1=279996&r2=279997&view=diff >> > >> > ============================================================================== >> > --- lldb/trunk/tools/debugserver/source/RNBRemote.cpp (original) >> > +++ lldb/trunk/tools/debugserver/source/RNBRemote.cpp Mon Aug 29 >> > 14:45:59 2016 >> > @@ -38,7 +38,7 @@ >> > #include "RNBServices.h" >> > #include "RNBSocket.h" >> > #include "JSON.h" >> > -#include "lldb/Utility/StringExtractor.h" >> > +#include "lldb/Utility/StdStringExtractor.h" >> > #include "MacOSX/Genealogy.h" >> > #include "JSONGenerator.h" >> > >> > @@ -2329,7 +2329,7 @@ RNBRemote::HandlePacket_QSetSTDIO (const >> > // QSetSTDIN >> > // QSetSTDOUT >> > // QSetSTDERR >> > - StringExtractor packet(p); >> > + StdStringExtractor packet(p); >> > packet.SetFilePos (7); >> > char ch = packet.GetChar(); >> > while (packet.GetChar() != ':') >> > @@ -2368,7 +2368,7 @@ RNBRemote::HandlePacket_QSetWorkingDir ( >> > // Only set the working directory if we don't already have a >> > process >> > if (!m_ctx.HasValidProcessID()) >> > { >> > - StringExtractor packet(p += sizeof ("QSetWorkingDir:") - 1); >> > + StdStringExtractor packet(p += sizeof ("QSetWorkingDir:") - 1); >> > if (packet.GetHexByteString (m_ctx.GetWorkingDir())) >> > { >> > struct stat working_dir_stat; >> > @@ -3473,7 +3473,7 @@ RNBRemote::HandlePacket_G (const char *p >> > if (g_num_reg_entries == 0) >> > InitializeRegisters (); >> > >> > - StringExtractor packet(p); >> > + StdStringExtractor packet(p); >> > packet.SetFilePos(1); // Skip the 'G' >> > >> > nub_process_t pid = m_ctx.ProcessID(); >> > @@ -3540,10 +3540,10 @@ RNBRemoteShouldCancelCallback (void *not >> > rnb_err_t >> > RNBRemote::HandlePacket_AllocateMemory (const char *p) >> > { >> > - StringExtractor packet (p); >> > + StdStringExtractor packet (p); >> > packet.SetFilePos(2); // Skip the "_M" >> > >> > - nub_addr_t size = packet.GetHexMaxU64 (StringExtractor::BigEndian, >> > 0); >> > + nub_addr_t size = packet.GetHexMaxU64 >> > (StdStringExtractor::BigEndian, 0); >> > if (size != 0) >> > { >> > if (packet.GetChar() == ',') >> > @@ -3590,9 +3590,9 @@ RNBRemote::HandlePacket_AllocateMemory ( >> > rnb_err_t >> > RNBRemote::HandlePacket_DeallocateMemory (const char *p) >> > { >> > - StringExtractor packet (p); >> > + StdStringExtractor packet (p); >> > packet.SetFilePos(2); // Skip the "_m" >> > - nub_addr_t addr = packet.GetHexMaxU64 (StringExtractor::BigEndian, >> > INVALID_NUB_ADDRESS); >> > + nub_addr_t addr = packet.GetHexMaxU64 >> > (StdStringExtractor::BigEndian, INVALID_NUB_ADDRESS); >> > >> > if (addr != INVALID_NUB_ADDRESS) >> > { >> > @@ -3669,7 +3669,7 @@ RNBRemote::HandlePacket_RestoreRegisterS >> > return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No >> > thread was is set with the Hg packet"); >> > } >> > >> > - StringExtractor packet (p); >> > + StdStringExtractor packet (p); >> > packet.SetFilePos(strlen("QRestoreRegisterState:")); // Skip the >> > "QRestoreRegisterState:" >> > const uint32_t save_id = packet.GetU32(0); >> > >> > @@ -4222,7 +4222,7 @@ RNBRemote::HandlePacket_P (const char *p >> > >> > nub_process_t pid = m_ctx.ProcessID(); >> > >> > - StringExtractor packet (p); >> > + StdStringExtractor packet (p); >> > >> > const char cmd_char = packet.GetChar(); >> > // Register ID is always in big endian >> > @@ -4372,7 +4372,7 @@ RNBRemote::HandlePacket_GetProfileData ( >> > if (pid == INVALID_NUB_PROCESS) >> > return SendPacket ("OK"); >> > >> > - StringExtractor packet(p += sizeof ("qGetProfileData")); >> > + StdStringExtractor packet(p += sizeof ("qGetProfileData")); >> > DNBProfileDataScanType scan_type = eProfileAll; >> > std::string name; >> > std::string value; >> > @@ -4408,7 +4408,7 @@ RNBRemote::HandlePacket_SetEnableAsyncPr >> > if (pid == INVALID_NUB_PROCESS) >> > return SendPacket ("OK"); >> > >> > - StringExtractor packet(p += sizeof ("QSetEnableAsyncProfiling")); >> > + StdStringExtractor packet(p += sizeof >> > ("QSetEnableAsyncProfiling")); >> > bool enable = false; >> > uint64_t interval_usec = 0; >> > DNBProfileDataScanType scan_type = eProfileAll; >> > >> > >> > _______________________________________________ >> > lldb-commits mailing list >> > lldb-commits@lists.llvm.org >> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits