// Copyright 2020 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/debug/wasm/gdb-server/gdb-remote-util.h" using std::string; namespace v8 { namespace internal { namespace wasm { namespace gdb_server { // GDB expects lower case values. static const char kHexChars[] = "0123456789abcdef"; void UInt8ToHex(uint8_t byte, char chars[2]) { DCHECK(chars); chars[0] = kHexChars[byte >> 4]; chars[1] = kHexChars[byte & 0xF]; } bool HexToUInt8(const char chars[2], uint8_t* byte) { uint8_t o1, o2; if (NibbleToUInt8(chars[0], &o1) && NibbleToUInt8(chars[1], &o2)) { *byte = (o1 << 4) + o2; return true; } return false; } bool NibbleToUInt8(char ch, uint8_t* byte) { DCHECK(byte); // Check for nibble of a-f if ((ch >= 'a') && (ch <= 'f')) { *byte = (ch - 'a' + 10); return true; } // Check for nibble of A-F if ((ch >= 'A') && (ch <= 'F')) { *byte = (ch - 'A' + 10); return true; } // Check for nibble of 0-9 if ((ch >= '0') && (ch <= '9')) { *byte = (ch - '0'); return true; } // Not a valid nibble representation return false; } std::vector<std::string> StringSplit(const string& instr, const char* delim) { std::vector<std::string> result; const char* in = instr.data(); if (nullptr == in) return result; // Check if we have nothing to do if (nullptr == delim) { result.push_back(string(in)); return result; } while (*in) { // Toss all preceeding delimiters while (*in && strchr(delim, *in)) in++; // If we still have something to process if (*in) { const char* start = in; size_t len = 0; // Keep moving forward for all valid chars while (*in && (strchr(delim, *in) == nullptr)) { len++; in++; } // Build this token and add it to the array. result.push_back(string{start, len}); } } return result; } std::string Mem2Hex(const uint8_t* mem, size_t count) { std::vector<char> result(count * 2 + 1); for (size_t i = 0; i < count; i++) UInt8ToHex(*mem++, &result[i * 2]); result[count * 2] = '\0'; return result.data(); } std::string Mem2Hex(const std::string& str) { return Mem2Hex(reinterpret_cast<const uint8_t*>(str.data()), str.size()); } } // namespace gdb_server } // namespace wasm } // namespace internal } // namespace v8