// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net-base/byte_utils.h"

#include <string.h>

#include <base/sys_byteorder.h>

namespace net_base::byte_utils {

std::vector<uint8_t> StringToCStringBytes(std::string_view str) {
  const size_t len = strnlen(str.data(), str.size());
  std::vector<uint8_t> bytes{
      reinterpret_cast<const uint8_t*>(str.data()),
      reinterpret_cast<const uint8_t*>(str.data()) + len};
  bytes.push_back(0);  // Add a null character at the end.
  return bytes;
}

std::string StringFromCStringBytes(base::span<const uint8_t> bytes) {
  const size_t len =
      strnlen(reinterpret_cast<const char*>(bytes.data()), bytes.size());
  return {reinterpret_cast<const char*>(bytes.data()), len};
}

std::vector<uint8_t> ByteStringToBytes(std::string_view bytes) {
  return {reinterpret_cast<const uint8_t*>(bytes.data()),
          reinterpret_cast<const uint8_t*>(bytes.data() + bytes.size())};
}

base::span<const uint8_t> ByteStringAsBytes(std::string_view bytes) {
  return {reinterpret_cast<const uint8_t*>(bytes.data()), bytes.size()};
}

std::string ByteStringFromBytes(base::span<const uint8_t> bytes) {
  return {reinterpret_cast<const char*>(bytes.data()), bytes.size()};
}

}  // namespace net_base::byte_utils
