[Lldb-commits] [lldb] r279997 - Copy StringExtractor to StdStringExtractor.
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Tue Aug 30 06:43:37 PDT 2016
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 <zturner at 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 <labath at 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 at 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 at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list