blob: 2632d71c4431e42c3e2284d70a8f13aba26a29e1 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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/developer/debug/zxdb/common/string_util.h"
#include <inttypes.h>
#include <iomanip>
#include <sstream>
namespace zxdb {
namespace {
std::string DoToHexString(uint64_t value, int digits, bool include_prefix) {
std::ostringstream out;
if (include_prefix)
out << "0x";
if (digits)
out << std::setw(digits) << std::setfill('0');
out << std::hex << value;
return out.str();
}
} // namespace
bool StringBeginsWith(std::string_view str, std::string_view begins_with) {
if (begins_with.size() > str.size())
return false;
std::string_view source = str.substr(0, begins_with.size());
return source == begins_with;
}
bool StringEndsWith(std::string_view str, std::string_view ends_with) {
if (ends_with.size() > str.size())
return false;
std::string_view source = str.substr(str.size() - ends_with.size(), ends_with.size());
return source == ends_with;
}
// Cast signed numbers to their unsigned variant before converting to 64-bit to avoid sign
// extension.
std::string to_hex_string(int8_t i, int digits, bool include_prefix) {
return DoToHexString(static_cast<uint8_t>(i), digits, include_prefix);
}
std::string to_hex_string(uint8_t i, int digits, bool include_prefix) {
return DoToHexString(i, digits, include_prefix);
}
std::string to_hex_string(int16_t i, int digits, bool include_prefix) {
return DoToHexString(static_cast<uint16_t>(i), digits, include_prefix);
}
std::string to_hex_string(uint16_t i, int digits, bool include_prefix) {
return DoToHexString(i, digits, include_prefix);
}
std::string to_hex_string(int32_t i, int digits, bool include_prefix) {
return DoToHexString(static_cast<uint32_t>(i), digits, include_prefix);
}
std::string to_hex_string(uint32_t i, int digits, bool include_prefix) {
return DoToHexString(i, digits, include_prefix);
}
std::string to_hex_string(int64_t i, int digits, bool include_prefix) {
return DoToHexString(static_cast<uint64_t>(i), digits, include_prefix);
}
std::string to_hex_string(uint64_t i, int digits, bool include_prefix) {
return DoToHexString(i, digits, include_prefix);
}
// Format the 128-bit numbers as two 64-bit ones.
std::string to_hex_string(int128_t i, int digits, bool include_prefix) {
return to_hex_string(static_cast<uint128_t>(i), digits, include_prefix);
}
std::string to_hex_string(uint128_t i, int digits, bool include_prefix) {
if (i <= std::numeric_limits<uint64_t>::max())
return to_hex_string(static_cast<uint64_t>(i), digits, include_prefix);
// Compute the padding to apply to just the high 64 bits. The low 64 bits will always have 16.
int high_digits = 0;
if (digits > 16)
high_digits = digits - 16;
std::string result = to_hex_string(static_cast<uint64_t>(i >> 64), high_digits, include_prefix);
result += to_hex_string(static_cast<uint64_t>(i), 16, false);
return result;
}
} // namespace zxdb