130fdc8d8SChris Lattner //===-- StringExtractor.cpp -------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 10c982c768SGreg Clayton #include "Utility/StringExtractor.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner // C Includes 1378709173SStephen Wilson #include <stdlib.h> 1478709173SStephen Wilson 1530fdc8d8SChris Lattner // C++ Includes 1630fdc8d8SChris Lattner // Other libraries and framework includes 1730fdc8d8SChris Lattner // Project includes 1830fdc8d8SChris Lattner 19*3852b3e1SGreg Clayton static const uint8_t 20*3852b3e1SGreg Clayton g_hex_ascii_to_hex_integer[256] = { 21*3852b3e1SGreg Clayton 22*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 23*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 24*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 25*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 26*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 27*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 28*3852b3e1SGreg Clayton 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 29*3852b3e1SGreg Clayton 0x8, 0x9, 255, 255, 255, 255, 255, 255, 30*3852b3e1SGreg Clayton 255, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 255, 31*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 32*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 33*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 34*3852b3e1SGreg Clayton 255, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 255, 35*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 36*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 37*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 38*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 39*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 40*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 41*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 42*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 43*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 44*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 45*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 46*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 47*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 48*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 49*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 50*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 51*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 52*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 53*3852b3e1SGreg Clayton 255, 255, 255, 255, 255, 255, 255, 255, 54*3852b3e1SGreg Clayton }; 55*3852b3e1SGreg Clayton 5630fdc8d8SChris Lattner static inline int 5730fdc8d8SChris Lattner xdigit_to_sint (char ch) 5830fdc8d8SChris Lattner { 5930fdc8d8SChris Lattner if (ch >= 'a' && ch <= 'f') 6030fdc8d8SChris Lattner return 10 + ch - 'a'; 611e89cd80SBenjamin Kramer if (ch >= 'A' && ch <= 'F') 621e89cd80SBenjamin Kramer return 10 + ch - 'A'; 6330fdc8d8SChris Lattner return ch - '0'; 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 6630fdc8d8SChris Lattner static inline unsigned int 6730fdc8d8SChris Lattner xdigit_to_uint (uint8_t ch) 6830fdc8d8SChris Lattner { 6930fdc8d8SChris Lattner if (ch >= 'a' && ch <= 'f') 7030fdc8d8SChris Lattner return 10u + ch - 'a'; 711e89cd80SBenjamin Kramer if (ch >= 'A' && ch <= 'F') 721e89cd80SBenjamin Kramer return 10u + ch - 'A'; 7330fdc8d8SChris Lattner return ch - '0'; 7430fdc8d8SChris Lattner } 7530fdc8d8SChris Lattner 7630fdc8d8SChris Lattner //---------------------------------------------------------------------- 7730fdc8d8SChris Lattner // StringExtractor constructor 7830fdc8d8SChris Lattner //---------------------------------------------------------------------- 7930fdc8d8SChris Lattner StringExtractor::StringExtractor() : 8030fdc8d8SChris Lattner m_packet(), 8130fdc8d8SChris Lattner m_index (0) 8230fdc8d8SChris Lattner { 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner 8630fdc8d8SChris Lattner StringExtractor::StringExtractor(const char *packet_cstr) : 8730fdc8d8SChris Lattner m_packet(), 8830fdc8d8SChris Lattner m_index (0) 8930fdc8d8SChris Lattner { 9030fdc8d8SChris Lattner if (packet_cstr) 9130fdc8d8SChris Lattner m_packet.assign (packet_cstr); 9230fdc8d8SChris Lattner } 9330fdc8d8SChris Lattner 9430fdc8d8SChris Lattner 9530fdc8d8SChris Lattner //---------------------------------------------------------------------- 9630fdc8d8SChris Lattner // StringExtractor copy constructor 9730fdc8d8SChris Lattner //---------------------------------------------------------------------- 9830fdc8d8SChris Lattner StringExtractor::StringExtractor(const StringExtractor& rhs) : 9930fdc8d8SChris Lattner m_packet (rhs.m_packet), 10030fdc8d8SChris Lattner m_index (rhs.m_index) 10130fdc8d8SChris Lattner { 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 10530fdc8d8SChris Lattner //---------------------------------------------------------------------- 10630fdc8d8SChris Lattner // StringExtractor assignment operator 10730fdc8d8SChris Lattner //---------------------------------------------------------------------- 10830fdc8d8SChris Lattner const StringExtractor& 10930fdc8d8SChris Lattner StringExtractor::operator=(const StringExtractor& rhs) 11030fdc8d8SChris Lattner { 11130fdc8d8SChris Lattner if (this != &rhs) 11230fdc8d8SChris Lattner { 11330fdc8d8SChris Lattner m_packet = rhs.m_packet; 11430fdc8d8SChris Lattner m_index = rhs.m_index; 11530fdc8d8SChris Lattner 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner return *this; 11830fdc8d8SChris Lattner } 11930fdc8d8SChris Lattner 12030fdc8d8SChris Lattner //---------------------------------------------------------------------- 12130fdc8d8SChris Lattner // Destructor 12230fdc8d8SChris Lattner //---------------------------------------------------------------------- 12330fdc8d8SChris Lattner StringExtractor::~StringExtractor() 12430fdc8d8SChris Lattner { 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 12730fdc8d8SChris Lattner 12830fdc8d8SChris Lattner char 12930fdc8d8SChris Lattner StringExtractor::GetChar (char fail_value) 13030fdc8d8SChris Lattner { 13130fdc8d8SChris Lattner if (m_index < m_packet.size()) 13230fdc8d8SChris Lattner { 13330fdc8d8SChris Lattner char ch = m_packet[m_index]; 13430fdc8d8SChris Lattner ++m_index; 13530fdc8d8SChris Lattner return ch; 13630fdc8d8SChris Lattner } 13730fdc8d8SChris Lattner m_index = UINT32_MAX; 13830fdc8d8SChris Lattner return fail_value; 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner 14130fdc8d8SChris Lattner //---------------------------------------------------------------------- 14230fdc8d8SChris Lattner // Extract an unsigned character from two hex ASCII chars in the packet 14330fdc8d8SChris Lattner // string 14430fdc8d8SChris Lattner //---------------------------------------------------------------------- 14530fdc8d8SChris Lattner uint8_t 1467b70be39SGreg Clayton StringExtractor::GetHexU8 (uint8_t fail_value, bool set_eof_on_fail) 14730fdc8d8SChris Lattner { 148*3852b3e1SGreg Clayton uint32_t i = m_index; 149*3852b3e1SGreg Clayton if ((i + 2) <= m_packet.size()) 15030fdc8d8SChris Lattner { 151*3852b3e1SGreg Clayton const uint8_t hi_nibble = g_hex_ascii_to_hex_integer[m_packet[i]]; 152*3852b3e1SGreg Clayton const uint8_t lo_nibble = g_hex_ascii_to_hex_integer[m_packet[i+1]]; 153*3852b3e1SGreg Clayton if (hi_nibble < 16 && lo_nibble < 16) 154*3852b3e1SGreg Clayton { 15530fdc8d8SChris Lattner m_index += 2; 15630fdc8d8SChris Lattner return (hi_nibble << 4) + lo_nibble; 15730fdc8d8SChris Lattner } 158*3852b3e1SGreg Clayton } 1597b70be39SGreg Clayton if (set_eof_on_fail || m_index >= m_packet.size()) 16030fdc8d8SChris Lattner m_index = UINT32_MAX; 16130fdc8d8SChris Lattner return fail_value; 16230fdc8d8SChris Lattner } 16330fdc8d8SChris Lattner 16430fdc8d8SChris Lattner uint32_t 16532e0a750SGreg Clayton StringExtractor::GetU32 (uint32_t fail_value, int base) 16632e0a750SGreg Clayton { 16732e0a750SGreg Clayton if (m_index < m_packet.size()) 16832e0a750SGreg Clayton { 16932e0a750SGreg Clayton char *end = NULL; 17032e0a750SGreg Clayton const char *start = m_packet.c_str(); 17132e0a750SGreg Clayton const char *uint_cstr = start + m_index; 17232e0a750SGreg Clayton uint32_t result = ::strtoul (uint_cstr, &end, base); 17332e0a750SGreg Clayton 17432e0a750SGreg Clayton if (end && end != uint_cstr) 17532e0a750SGreg Clayton { 17632e0a750SGreg Clayton m_index = end - start; 17732e0a750SGreg Clayton return result; 17832e0a750SGreg Clayton } 17932e0a750SGreg Clayton } 18032e0a750SGreg Clayton return fail_value; 18132e0a750SGreg Clayton } 18232e0a750SGreg Clayton 18332e0a750SGreg Clayton 18432e0a750SGreg Clayton uint32_t 18530fdc8d8SChris Lattner StringExtractor::GetHexMaxU32 (bool little_endian, uint32_t fail_value) 18630fdc8d8SChris Lattner { 18730fdc8d8SChris Lattner uint32_t result = 0; 18830fdc8d8SChris Lattner uint32_t nibble_count = 0; 18930fdc8d8SChris Lattner 19030fdc8d8SChris Lattner if (little_endian) 19130fdc8d8SChris Lattner { 19230fdc8d8SChris Lattner uint32_t shift_amount = 0; 19330fdc8d8SChris Lattner while (m_index < m_packet.size() && ::isxdigit (m_packet[m_index])) 19430fdc8d8SChris Lattner { 19530fdc8d8SChris Lattner // Make sure we don't exceed the size of a uint32_t... 19630fdc8d8SChris Lattner if (nibble_count >= (sizeof(uint32_t) * 2)) 19730fdc8d8SChris Lattner { 19830fdc8d8SChris Lattner m_index = UINT32_MAX; 19930fdc8d8SChris Lattner return fail_value; 20030fdc8d8SChris Lattner } 20130fdc8d8SChris Lattner 20230fdc8d8SChris Lattner uint8_t nibble_lo; 20330fdc8d8SChris Lattner uint8_t nibble_hi = xdigit_to_sint (m_packet[m_index]); 20430fdc8d8SChris Lattner ++m_index; 20530fdc8d8SChris Lattner if (m_index < m_packet.size() && ::isxdigit (m_packet[m_index])) 20630fdc8d8SChris Lattner { 20730fdc8d8SChris Lattner nibble_lo = xdigit_to_sint (m_packet[m_index]); 20830fdc8d8SChris Lattner ++m_index; 20930fdc8d8SChris Lattner result |= ((uint32_t)nibble_hi << (shift_amount + 4)); 21030fdc8d8SChris Lattner result |= ((uint32_t)nibble_lo << shift_amount); 21130fdc8d8SChris Lattner nibble_count += 2; 21230fdc8d8SChris Lattner shift_amount += 8; 21330fdc8d8SChris Lattner } 21430fdc8d8SChris Lattner else 21530fdc8d8SChris Lattner { 21630fdc8d8SChris Lattner result |= ((uint32_t)nibble_hi << shift_amount); 21730fdc8d8SChris Lattner nibble_count += 1; 21830fdc8d8SChris Lattner shift_amount += 4; 21930fdc8d8SChris Lattner } 22030fdc8d8SChris Lattner 22130fdc8d8SChris Lattner } 22230fdc8d8SChris Lattner } 22330fdc8d8SChris Lattner else 22430fdc8d8SChris Lattner { 22530fdc8d8SChris Lattner while (m_index < m_packet.size() && ::isxdigit (m_packet[m_index])) 22630fdc8d8SChris Lattner { 22730fdc8d8SChris Lattner // Make sure we don't exceed the size of a uint32_t... 22830fdc8d8SChris Lattner if (nibble_count >= (sizeof(uint32_t) * 2)) 22930fdc8d8SChris Lattner { 23030fdc8d8SChris Lattner m_index = UINT32_MAX; 23130fdc8d8SChris Lattner return fail_value; 23230fdc8d8SChris Lattner } 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner uint8_t nibble = xdigit_to_sint (m_packet[m_index]); 23530fdc8d8SChris Lattner // Big Endian 23630fdc8d8SChris Lattner result <<= 4; 23730fdc8d8SChris Lattner result |= nibble; 23830fdc8d8SChris Lattner 23930fdc8d8SChris Lattner ++m_index; 24030fdc8d8SChris Lattner ++nibble_count; 24130fdc8d8SChris Lattner } 24230fdc8d8SChris Lattner } 24330fdc8d8SChris Lattner return result; 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner uint64_t 24730fdc8d8SChris Lattner StringExtractor::GetHexMaxU64 (bool little_endian, uint64_t fail_value) 24830fdc8d8SChris Lattner { 24930fdc8d8SChris Lattner uint64_t result = 0; 25030fdc8d8SChris Lattner uint32_t nibble_count = 0; 25130fdc8d8SChris Lattner 25230fdc8d8SChris Lattner if (little_endian) 25330fdc8d8SChris Lattner { 25430fdc8d8SChris Lattner uint32_t shift_amount = 0; 25530fdc8d8SChris Lattner while (m_index < m_packet.size() && ::isxdigit (m_packet[m_index])) 25630fdc8d8SChris Lattner { 25730fdc8d8SChris Lattner // Make sure we don't exceed the size of a uint64_t... 25830fdc8d8SChris Lattner if (nibble_count >= (sizeof(uint64_t) * 2)) 25930fdc8d8SChris Lattner { 26030fdc8d8SChris Lattner m_index = UINT32_MAX; 26130fdc8d8SChris Lattner return fail_value; 26230fdc8d8SChris Lattner } 26330fdc8d8SChris Lattner 26430fdc8d8SChris Lattner uint8_t nibble_lo; 26530fdc8d8SChris Lattner uint8_t nibble_hi = xdigit_to_sint (m_packet[m_index]); 26630fdc8d8SChris Lattner ++m_index; 26730fdc8d8SChris Lattner if (m_index < m_packet.size() && ::isxdigit (m_packet[m_index])) 26830fdc8d8SChris Lattner { 26930fdc8d8SChris Lattner nibble_lo = xdigit_to_sint (m_packet[m_index]); 27030fdc8d8SChris Lattner ++m_index; 27130fdc8d8SChris Lattner result |= ((uint64_t)nibble_hi << (shift_amount + 4)); 27230fdc8d8SChris Lattner result |= ((uint64_t)nibble_lo << shift_amount); 27330fdc8d8SChris Lattner nibble_count += 2; 27430fdc8d8SChris Lattner shift_amount += 8; 27530fdc8d8SChris Lattner } 27630fdc8d8SChris Lattner else 27730fdc8d8SChris Lattner { 27830fdc8d8SChris Lattner result |= ((uint64_t)nibble_hi << shift_amount); 27930fdc8d8SChris Lattner nibble_count += 1; 28030fdc8d8SChris Lattner shift_amount += 4; 28130fdc8d8SChris Lattner } 28230fdc8d8SChris Lattner 28330fdc8d8SChris Lattner } 28430fdc8d8SChris Lattner } 28530fdc8d8SChris Lattner else 28630fdc8d8SChris Lattner { 28730fdc8d8SChris Lattner while (m_index < m_packet.size() && ::isxdigit (m_packet[m_index])) 28830fdc8d8SChris Lattner { 28930fdc8d8SChris Lattner // Make sure we don't exceed the size of a uint64_t... 29030fdc8d8SChris Lattner if (nibble_count >= (sizeof(uint64_t) * 2)) 29130fdc8d8SChris Lattner { 29230fdc8d8SChris Lattner m_index = UINT32_MAX; 29330fdc8d8SChris Lattner return fail_value; 29430fdc8d8SChris Lattner } 29530fdc8d8SChris Lattner 29630fdc8d8SChris Lattner uint8_t nibble = xdigit_to_sint (m_packet[m_index]); 29730fdc8d8SChris Lattner // Big Endian 29830fdc8d8SChris Lattner result <<= 4; 29930fdc8d8SChris Lattner result |= nibble; 30030fdc8d8SChris Lattner 30130fdc8d8SChris Lattner ++m_index; 30230fdc8d8SChris Lattner ++nibble_count; 30330fdc8d8SChris Lattner } 30430fdc8d8SChris Lattner } 30530fdc8d8SChris Lattner return result; 30630fdc8d8SChris Lattner } 30730fdc8d8SChris Lattner 30830fdc8d8SChris Lattner size_t 30930fdc8d8SChris Lattner StringExtractor::GetHexBytes (void *dst_void, size_t dst_len, uint8_t fail_fill_value) 31030fdc8d8SChris Lattner { 31130fdc8d8SChris Lattner uint8_t *dst = (uint8_t*)dst_void; 31230fdc8d8SChris Lattner size_t bytes_extracted = 0; 31330fdc8d8SChris Lattner while (bytes_extracted < dst_len && GetBytesLeft ()) 31430fdc8d8SChris Lattner { 31530fdc8d8SChris Lattner dst[bytes_extracted] = GetHexU8 (fail_fill_value); 31630fdc8d8SChris Lattner if (IsGood()) 31730fdc8d8SChris Lattner ++bytes_extracted; 31830fdc8d8SChris Lattner else 31930fdc8d8SChris Lattner break; 32030fdc8d8SChris Lattner } 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner for (size_t i = bytes_extracted; i < dst_len; ++i) 32330fdc8d8SChris Lattner dst[i] = fail_fill_value; 32430fdc8d8SChris Lattner 32530fdc8d8SChris Lattner return bytes_extracted; 32630fdc8d8SChris Lattner } 32730fdc8d8SChris Lattner 32830fdc8d8SChris Lattner 32930fdc8d8SChris Lattner // Consume ASCII hex nibble character pairs until we have decoded byte_size 33030fdc8d8SChris Lattner // bytes of data. 33130fdc8d8SChris Lattner 33230fdc8d8SChris Lattner uint64_t 33330fdc8d8SChris Lattner StringExtractor::GetHexWithFixedSize (uint32_t byte_size, bool little_endian, uint64_t fail_value) 33430fdc8d8SChris Lattner { 33530fdc8d8SChris Lattner if (byte_size <= 8 && GetBytesLeft() >= byte_size * 2) 33630fdc8d8SChris Lattner { 33730fdc8d8SChris Lattner uint64_t result = 0; 33830fdc8d8SChris Lattner uint32_t i; 33930fdc8d8SChris Lattner if (little_endian) 34030fdc8d8SChris Lattner { 34130fdc8d8SChris Lattner // Little Endian 34230fdc8d8SChris Lattner uint32_t shift_amount; 34330fdc8d8SChris Lattner for (i = 0, shift_amount = 0; 34430fdc8d8SChris Lattner i < byte_size && m_index != UINT32_MAX; 34530fdc8d8SChris Lattner ++i, shift_amount += 8) 34630fdc8d8SChris Lattner { 34730fdc8d8SChris Lattner result |= ((uint64_t)GetHexU8() << shift_amount); 34830fdc8d8SChris Lattner } 34930fdc8d8SChris Lattner } 35030fdc8d8SChris Lattner else 35130fdc8d8SChris Lattner { 35230fdc8d8SChris Lattner // Big Endian 35330fdc8d8SChris Lattner for (i = 0; i < byte_size && m_index != UINT32_MAX; ++i) 35430fdc8d8SChris Lattner { 35530fdc8d8SChris Lattner result <<= 8; 35630fdc8d8SChris Lattner result |= GetHexU8(); 35730fdc8d8SChris Lattner } 35830fdc8d8SChris Lattner } 35930fdc8d8SChris Lattner } 36030fdc8d8SChris Lattner m_index = UINT32_MAX; 36130fdc8d8SChris Lattner return fail_value; 36230fdc8d8SChris Lattner } 36330fdc8d8SChris Lattner 364de9d0494SGreg Clayton size_t 365de9d0494SGreg Clayton StringExtractor::GetHexByteString (std::string &str) 366de9d0494SGreg Clayton { 367de9d0494SGreg Clayton str.clear(); 368de9d0494SGreg Clayton char ch; 369de9d0494SGreg Clayton while ((ch = GetHexU8()) != '\0') 370de9d0494SGreg Clayton str.append(1, ch); 371de9d0494SGreg Clayton return str.size(); 372de9d0494SGreg Clayton } 373de9d0494SGreg Clayton 37430fdc8d8SChris Lattner bool 37530fdc8d8SChris Lattner StringExtractor::GetNameColonValue (std::string &name, std::string &value) 37630fdc8d8SChris Lattner { 37730fdc8d8SChris Lattner // Read something in the form of NNNN:VVVV; where NNNN is any character 37830fdc8d8SChris Lattner // that is not a colon, followed by a ':' character, then a value (one or 37930fdc8d8SChris Lattner // more ';' chars), followed by a ';' 38030fdc8d8SChris Lattner if (m_index < m_packet.size()) 38130fdc8d8SChris Lattner { 38230fdc8d8SChris Lattner const size_t colon_idx = m_packet.find (':', m_index); 38330fdc8d8SChris Lattner if (colon_idx != std::string::npos) 38430fdc8d8SChris Lattner { 38530fdc8d8SChris Lattner const size_t semicolon_idx = m_packet.find (';', colon_idx); 38630fdc8d8SChris Lattner if (semicolon_idx != std::string::npos) 38730fdc8d8SChris Lattner { 38830fdc8d8SChris Lattner name.assign (m_packet, m_index, colon_idx - m_index); 38930fdc8d8SChris Lattner value.assign (m_packet, colon_idx + 1, semicolon_idx - (colon_idx + 1)); 39030fdc8d8SChris Lattner m_index = semicolon_idx + 1; 39130fdc8d8SChris Lattner return true; 39230fdc8d8SChris Lattner } 39330fdc8d8SChris Lattner } 39430fdc8d8SChris Lattner } 39530fdc8d8SChris Lattner m_index = UINT32_MAX; 39630fdc8d8SChris Lattner return false; 39730fdc8d8SChris Lattner } 398