Files
AnyPS5/core/libs/tests/GuestAddressConversion.cpp
T
hypermistandClaude Opus 5.5 14dbed4ed1 feat(libkernel): export htonl, ntohl, htons and ntohs
libkernel exports the byte order conversions; they swap the bytes of
their 32- or 16-bit argument.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RbLgECLQ2bpDM7oe2urGZK
2026-10-21 01:48:48 +13:00

655 lines
50 KiB
C++

#include "prx/libc/include/general/VabiMacros.hpp"
#include <array>
#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <stdexcept>
extern "C" {
int APS5_VABI __inet_pton_nid_postfix(int, const char*, void*);
const char* APS5_VABI __inet_ntop_nid_postfix(int, const void*, char*, std::uint32_t);
int APS5_VABI inet_pton_nid_postfix(int, const char*, void*);
const char* APS5_VABI inet_ntop_nid_postfix(int, const void*, char*, std::uint32_t);
int* APS5_VABI __error_nid_postfix();
std::uint32_t APS5_VABI htonl_nid_postfix(std::uint32_t);
std::uint32_t APS5_VABI ntohl_nid_postfix(std::uint32_t);
std::uint16_t APS5_VABI htons_nid_postfix(std::uint16_t);
std::uint16_t APS5_VABI ntohs_nid_postfix(std::uint16_t);
}
static void Require(bool value) { if (!value) std::abort(); }
using Ntop = const char* (APS5_VABI *)(int, const void*, char*, std::uint32_t);
struct PtonCase { bool plain; int family; const char* text; int result; int error; const char* bytes; };
struct NtopCase { bool plain; int family; const char* source; std::uint32_t size; bool succeeds; int error; const char* bytes; std::size_t lastTouched; };
struct PadCase { int family; const char* source; std::uint32_t size; std::size_t lastTouched; };
static const PtonCase ConsolePton[] = {
{false, 2, "1.2.3.4", 1, 0, "01020304aaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "0.0.0.0", 1, 0, "00000000aaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "255.255.255.255", 1, 0, "ffffffffaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "256.1.1.1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.04", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "001.002.003.004", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.0", 1, 0, "01020300aaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "127.1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.4.5", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1..2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, " 1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.4 ", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "0x1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.-1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.4/24", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "::1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::", 1, 0, "00000000000000000000000000000000"},
{false, 28, "::1", 1, 0, "00000000000000000000000000000001"},
{false, 28, "1::", 1, 0, "00010000000000000000000000000000"},
{false, 28, "1:2:3:4:5:6:7:8", 1, 0, "00010002000300040005000600070008"},
{false, 28, "1:2:3:4:5:6:7::", 1, 0, "00010002000300040005000600070000"},
{false, 28, "::2:3:4:5:6:7:8", 1, 0, "00000002000300040005000600070008"},
{false, 28, "1::2:3:4:5:6:7", 1, 0, "00010000000200030004000500060007"},
{false, 28, "1:2:3:4:5:6:7:8:9", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1::2::3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::ffff:1.2.3.4", 1, 0, "00000000000000000000ffff01020304"},
{false, 28, "::1.2.3.4", 1, 0, "00000000000000000000000001020304"},
{false, 28, "1:2:3:4:5:6:1.2.3.4", 1, 0, "00010002000300040005000601020304"},
{false, 28, "1:2:3:4:5:6:7:1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "fe80::1%eth0", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "FE80::ABCD", 1, 0, "fe80000000000000000000000000abcd"},
{false, 28, "12345::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "00001::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1:2:3:4:5:6:7:8:", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, ":1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "0:0:0:0:0:0:0:0", 1, 0, "00000000000000000000000000000000"},
{false, 28, "1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, ":", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, ":::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 9999, "1.2.3.4", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 0, "1.2.3.4", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "192.0.2.17", 1, 0, "c0000211aaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "not-an-address", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "256.1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.4.5", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.4.", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, " 1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "0x1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1..3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "1.2.3.-4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 2, "255.0.7.100", 1, 0, "ff000764aaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "2001:db8::17", 1, 0, "20010db8000000000000000000000017"},
{false, 28, "not-an-address", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::ffff:192.0.2.17", 1, 0, "00000000000000000000ffffc0000211"},
{false, 28, "::ffff:01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::ffff:1.2.3.04", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1:2:3:4:5:6:7:8::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::1:2:3:4:5:6:7:8", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1::2::3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, ":::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, ":1::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1::2:", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, ":1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1:2:3:4:5:6:7:8:9", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "12345::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "fe80::1%eth0", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1.2.3.4::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::1.2.3.4:1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "::g", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1:2:3:4:5:6:1.2.3.4:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1:2:3:4:5:6:7:1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 28, "1:2:3:4:5:6:7::", 1, 0, "00010002000300040005000600070000"},
{false, 28, "ABCD:ef01::1", 1, 0, "abcdef01000000000000000000000001"},
{false, 28, "::ffff:0.0.0.1", 1, 0, "00000000000000000000ffff00000001"},
{false, 28, "::ffff:0:1:0", 1, 0, "0000000000000000ffff000000010000"},
{false, 28, "::1", 1, 0, "00000000000000000000000000000001"},
{false, 28, "::", 1, 0, "00000000000000000000000000000000"},
{false, 28, "1::", 1, 0, "00010000000000000000000000000000"},
{false, 28, "::2", 1, 0, "00000000000000000000000000000002"},
{false, 28, "::1.2.3.4", 1, 0, "00000000000000000000000001020304"},
{false, 28, "1:0:0:2:0:0:0:3", 1, 0, "00010000000000020000000000000003"},
{false, 28, "1:0:2:0:3:0:4:0", 1, 0, "00010000000200000003000000040000"},
{false, 28, "0:0:1:0:0:2:0:0", 1, 0, "00000000000100000000000200000000"},
{false, 28, "::ffff:1.2.3.4", 1, 0, "00000000000000000000ffff01020304"},
{false, 28, "2001:DB8::17", 1, 0, "20010db8000000000000000000000017"},
{false, 28, "0:0:0:0:0:0:1:0", 1, 0, "00000000000000000000000000010000"},
{false, 28, "::1:0", 1, 0, "00000000000000000000000000010000"},
{false, 28, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 1, 0, "ffffffffffffffffffffffffffffffff"},
{false, 10, "::1", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{false, 9999, "1.2.3.4", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "192.0.2.17", 1, 0, "c0000211aaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "not-an-address", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "256.1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "1.2.3.4.5", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "1.2.3.4.", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, " 1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "0x1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "1..3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "1.2.3.-4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 2, "255.0.7.100", 1, 0, "ff000764aaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "2001:db8::17", 1, 0, "20010db8000000000000000000000017"},
{true, 28, "not-an-address", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "::ffff:192.0.2.17", 1, 0, "00000000000000000000ffffc0000211"},
{true, 28, "::ffff:01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "::ffff:1.2.3.04", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1:2:3:4:5:6:7:8::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "::1:2:3:4:5:6:7:8", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1::2::3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, ":::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, ":1::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1::2:", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, ":1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1:2:3:4:5:6:7:8:9", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "12345::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "fe80::1%eth0", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1.2.3.4::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "::1.2.3.4:1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "::g", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1:2:3:4:5:6:1.2.3.4:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1:2:3:4:5:6:7:1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 28, "1:2:3:4:5:6:7::", 1, 0, "00010002000300040005000600070000"},
{true, 28, "ABCD:ef01::1", 1, 0, "abcdef01000000000000000000000001"},
{true, 28, "::ffff:0.0.0.1", 1, 0, "00000000000000000000ffff00000001"},
{true, 28, "::ffff:0:1:0", 1, 0, "0000000000000000ffff000000010000"},
{true, 28, "::1", 1, 0, "00000000000000000000000000000001"},
{true, 28, "::", 1, 0, "00000000000000000000000000000000"},
{true, 28, "1::", 1, 0, "00010000000000000000000000000000"},
{true, 28, "::2", 1, 0, "00000000000000000000000000000002"},
{true, 28, "::1.2.3.4", 1, 0, "00000000000000000000000001020304"},
{true, 28, "1:0:0:2:0:0:0:3", 1, 0, "00010000000000020000000000000003"},
{true, 28, "1:0:2:0:3:0:4:0", 1, 0, "00010000000200000003000000040000"},
{true, 28, "0:0:1:0:0:2:0:0", 1, 0, "00000000000100000000000200000000"},
{true, 28, "::ffff:1.2.3.4", 1, 0, "00000000000000000000ffff01020304"},
{true, 28, "2001:DB8::17", 1, 0, "20010db8000000000000000000000017"},
{true, 28, "0:0:0:0:0:0:1:0", 1, 0, "00000000000000000000000000010000"},
{true, 28, "::1:0", 1, 0, "00000000000000000000000000010000"},
{true, 28, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 1, 0, "ffffffffffffffffffffffffffffffff"},
{true, 10, "::1", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{true, 9999, "1.2.3.4", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
};
static const NtopCase ConsoleNtop[] = {
{false, 2, "01020304", 16, true, 0, "312e322e332e34005a5a5a5a5a5a5a5a", 0},
{false, 2, "00000000", 16, true, 0, "302e302e302e30005a5a5a5a5a5a5a5a", 0},
{false, 2, "ffffffff", 16, true, 0, "3235352e3235352e3235352e32353500", 0},
{false, 2, "01020304", 8, true, 0, "312e322e332e3400", 0},
{false, 2, "01020304", 7, false, 28, "5a5a5a5a5a5a5a", 0},
{false, 2, "01020304", 0, false, 28, "", 0},
{false, 28, "00000000000000000000000000000000", 46, true, 0, "3a3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00000000000000000000000000000001", 46, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00010000000000000000000000000000", 46, true, 0, "313a3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00010000000000020000000000000003", 46, true, 0, "313a303a303a323a3a33000000000000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00010000000000020000000000030004", 46, true, 0, "313a3a323a303a303a333a3400000000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00010000000200030004000500060007", 46, true, 0, "313a303a323a333a343a353a363a3700000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00000000000000000000ffff01020304", 46, true, 0, "3a3a666666663a312e322e332e340000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00000000000000000000000001020304", 46, true, 0, "3a3a312e322e332e3400000000000000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00000000000000000000000000000002", 46, true, 0, "3a3a3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00000000000000000000ffff00000000", 46, true, 0, "3a3a666666663a302e302e302e300000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "0000000000000000ffff000001020304", 46, true, 0, "3a3a666666663a303a3130323a333034000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "abcd0000000000000000000000000000", 46, true, 0, "616263643a3a00000000000000000000000000000000000000000000000000000000000000000000000000000000", 0},
{false, 28, "00000000000000000000000000000001", 4, true, 0, "3a3a3100", 0},
{false, 28, "00000000000000000000000000000001", 3, false, 28, "5a5a5a", 0},
{false, 28, "ffffffffffffffffffffffffffffffff", 46, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600000000000000", 0},
{false, 28, "ffffffffffffffffffffffffffffffff", 40, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600", 0},
{false, 28, "ffffffffffffffffffffffffffffffff", 39, false, 28, "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", 0},
{false, 28, "00000000000000000000ffffffffffff", 46, true, 0, "3a3a666666663a3235352e3235352e3235352e323535000000000000000000000000000000000000000000000000", 0},
{false, 9999, "01020304000000000000000000000000", 16, false, 47, "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", 0},
{false, 2, "c0000211", 64, true, 0, "3139322e302e322e313700", 11},
{false, 2, "c0000211", 11, true, 0, "3139322e302e322e313700", 11},
{false, 2, "c0000211", 10, false, 28, "", 0},
{false, 2, "c0000211", 1, false, 28, "", 0},
{false, 2, "ff000764", 64, true, 0, "3235352e302e372e31303000", 12},
{false, 2, "ff000764", 12, true, 0, "3235352e302e372e31303000", 12},
{false, 2, "ff000764", 11, false, 28, "", 0},
{false, 2, "ff000764", 1, false, 28, "", 0},
{false, 28, "20010db8000000000000000000000017", 64, true, 0, "323030313a6462383a3a313700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "20010db8000000000000000000000017", 13, true, 0, "323030313a6462383a3a313700", 13},
{false, 28, "20010db8000000000000000000000017", 12, false, 28, "", 0},
{false, 28, "20010db8000000000000000000000017", 1, false, 28, "", 0},
{false, 28, "00000000000000000000ffffc0000211", 64, true, 0, "3a3a666666663a3139322e302e322e31370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000ffffc0000211", 18, true, 0, "3a3a666666663a3139322e302e322e313700", 18},
{false, 28, "00000000000000000000ffffc0000211", 17, false, 28, "", 0},
{false, 28, "00000000000000000000ffffc0000211", 1, false, 28, "", 0},
{false, 28, "00010002000300040005000600070000", 64, true, 0, "313a323a333a343a353a363a373a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00010002000300040005000600070000", 16, true, 0, "313a323a333a343a353a363a373a3000", 16},
{false, 28, "00010002000300040005000600070000", 15, false, 28, "", 0},
{false, 28, "00010002000300040005000600070000", 1, false, 28, "", 0},
{false, 28, "abcdef01000000000000000000000001", 64, true, 0, "616263643a656630313a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "abcdef01000000000000000000000001", 13, true, 0, "616263643a656630313a3a3100", 13},
{false, 28, "abcdef01000000000000000000000001", 12, false, 28, "", 0},
{false, 28, "abcdef01000000000000000000000001", 1, false, 28, "", 0},
{false, 28, "00000000000000000000ffff00000001", 64, true, 0, "3a3a666666663a302e302e302e310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000ffff00000001", 15, true, 0, "3a3a666666663a302e302e302e3100", 15},
{false, 28, "00000000000000000000ffff00000001", 14, false, 28, "", 0},
{false, 28, "00000000000000000000ffff00000001", 1, false, 28, "", 0},
{false, 28, "0000000000000000ffff000000010000", 64, true, 0, "3a3a666666663a303a313a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "0000000000000000ffff000000010000", 13, true, 0, "3a3a666666663a303a313a3000", 13},
{false, 28, "0000000000000000ffff000000010000", 12, false, 28, "", 0},
{false, 28, "0000000000000000ffff000000010000", 1, false, 28, "", 0},
{false, 28, "00000000000000000000000000000001", 64, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000000000000001", 4, true, 0, "3a3a3100", 4},
{false, 28, "00000000000000000000000000000001", 3, false, 28, "", 0},
{false, 28, "00000000000000000000000000000001", 1, false, 28, "", 0},
{false, 28, "00000000000000000000000000000000", 64, true, 0, "3a3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000000000000000", 3, true, 0, "3a3a00", 3},
{false, 28, "00000000000000000000000000000000", 2, false, 28, "", 0},
{false, 28, "00000000000000000000000000000000", 1, false, 28, "", 0},
{false, 28, "00010000000000000000000000000000", 64, true, 0, "313a3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00010000000000000000000000000000", 4, true, 0, "313a3a00", 4},
{false, 28, "00010000000000000000000000000000", 3, false, 28, "", 0},
{false, 28, "00010000000000000000000000000000", 1, false, 28, "", 0},
{false, 28, "00000000000000000000000000000002", 64, true, 0, "3a3a3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000000000000002", 4, true, 0, "3a3a3200", 4},
{false, 28, "00000000000000000000000000000002", 3, false, 28, "", 0},
{false, 28, "00000000000000000000000000000002", 1, false, 28, "", 0},
{false, 28, "00000000000000000000000001020304", 64, true, 0, "3a3a312e322e332e3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000000001020304", 10, true, 0, "3a3a312e322e332e3400", 10},
{false, 28, "00000000000000000000000001020304", 9, false, 28, "", 0},
{false, 28, "00000000000000000000000001020304", 1, false, 28, "", 0},
{false, 28, "00010000000000020000000000000003", 64, true, 0, "313a303a303a323a3a33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00010000000000020000000000000003", 11, true, 0, "313a303a303a323a3a3300", 11},
{false, 28, "00010000000000020000000000000003", 10, false, 28, "", 0},
{false, 28, "00010000000000020000000000000003", 1, false, 28, "", 0},
{false, 28, "00010000000200000003000000040000", 64, true, 0, "313a303a323a303a333a303a343a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00010000000200000003000000040000", 16, true, 0, "313a303a323a303a333a303a343a3000", 16},
{false, 28, "00010000000200000003000000040000", 15, false, 28, "", 0},
{false, 28, "00010000000200000003000000040000", 1, false, 28, "", 0},
{false, 28, "00000000000100000000000200000000", 64, true, 0, "3a3a313a303a303a323a303a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000100000000000200000000", 14, true, 0, "3a3a313a303a303a323a303a3000", 14},
{false, 28, "00000000000100000000000200000000", 13, false, 28, "", 0},
{false, 28, "00000000000100000000000200000000", 1, false, 28, "", 0},
{false, 28, "00000000000000000000ffff01020304", 64, true, 0, "3a3a666666663a312e322e332e340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000ffff01020304", 15, true, 0, "3a3a666666663a312e322e332e3400", 15},
{false, 28, "00000000000000000000ffff01020304", 14, false, 28, "", 0},
{false, 28, "00000000000000000000ffff01020304", 1, false, 28, "", 0},
{false, 28, "20010db8000000000000000000000017", 64, true, 0, "323030313a6462383a3a313700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "20010db8000000000000000000000017", 13, true, 0, "323030313a6462383a3a313700", 13},
{false, 28, "20010db8000000000000000000000017", 12, false, 28, "", 0},
{false, 28, "20010db8000000000000000000000017", 1, false, 28, "", 0},
{false, 28, "00000000000000000000000000010000", 64, true, 0, "3a3a302e312e302e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000000000010000", 10, true, 0, "3a3a302e312e302e3000", 10},
{false, 28, "00000000000000000000000000010000", 9, false, 28, "", 0},
{false, 28, "00000000000000000000000000010000", 1, false, 28, "", 0},
{false, 28, "00000000000000000000000000010000", 64, true, 0, "3a3a302e312e302e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{false, 28, "00000000000000000000000000010000", 10, true, 0, "3a3a302e312e302e3000", 10},
{false, 28, "00000000000000000000000000010000", 9, false, 28, "", 0},
{false, 28, "00000000000000000000000000010000", 1, false, 28, "", 0},
{false, 28, "ffffffffffffffffffffffffffffffff", 64, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600000000000000000000000000000000000000000000000000", 64},
{false, 28, "ffffffffffffffffffffffffffffffff", 40, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600", 40},
{false, 28, "ffffffffffffffffffffffffffffffff", 39, false, 28, "", 0},
{false, 28, "ffffffffffffffffffffffffffffffff", 1, false, 28, "", 0},
{false, 10, "01020304", 64, false, 47, "", 0},
{false, 9999, "01020304", 64, false, 47, "", 0},
{true, 2, "c0000211", 64, true, 0, "3139322e302e322e313700", 11},
{true, 2, "c0000211", 11, true, 0, "3139322e302e322e313700", 11},
{true, 2, "c0000211", 10, false, 28, "", 0},
{true, 2, "c0000211", 1, false, 28, "", 0},
{true, 2, "ff000764", 64, true, 0, "3235352e302e372e31303000", 12},
{true, 2, "ff000764", 12, true, 0, "3235352e302e372e31303000", 12},
{true, 2, "ff000764", 11, false, 28, "", 0},
{true, 2, "ff000764", 1, false, 28, "", 0},
{true, 28, "20010db8000000000000000000000017", 64, true, 0, "323030313a6462383a3a313700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "20010db8000000000000000000000017", 13, true, 0, "323030313a6462383a3a313700", 13},
{true, 28, "20010db8000000000000000000000017", 12, false, 28, "", 0},
{true, 28, "20010db8000000000000000000000017", 1, false, 28, "", 0},
{true, 28, "00000000000000000000ffffc0000211", 64, true, 0, "3a3a666666663a3139322e302e322e31370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000ffffc0000211", 18, true, 0, "3a3a666666663a3139322e302e322e313700", 18},
{true, 28, "00000000000000000000ffffc0000211", 17, false, 28, "", 0},
{true, 28, "00000000000000000000ffffc0000211", 1, false, 28, "", 0},
{true, 28, "00010002000300040005000600070000", 64, true, 0, "313a323a333a343a353a363a373a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00010002000300040005000600070000", 16, true, 0, "313a323a333a343a353a363a373a3000", 16},
{true, 28, "00010002000300040005000600070000", 15, false, 28, "", 0},
{true, 28, "00010002000300040005000600070000", 1, false, 28, "", 0},
{true, 28, "abcdef01000000000000000000000001", 64, true, 0, "616263643a656630313a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "abcdef01000000000000000000000001", 13, true, 0, "616263643a656630313a3a3100", 13},
{true, 28, "abcdef01000000000000000000000001", 12, false, 28, "", 0},
{true, 28, "abcdef01000000000000000000000001", 1, false, 28, "", 0},
{true, 28, "00000000000000000000ffff00000001", 64, true, 0, "3a3a666666663a302e302e302e310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000ffff00000001", 15, true, 0, "3a3a666666663a302e302e302e3100", 15},
{true, 28, "00000000000000000000ffff00000001", 14, false, 28, "", 0},
{true, 28, "00000000000000000000ffff00000001", 1, false, 28, "", 0},
{true, 28, "0000000000000000ffff000000010000", 64, true, 0, "3a3a666666663a303a313a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "0000000000000000ffff000000010000", 13, true, 0, "3a3a666666663a303a313a3000", 13},
{true, 28, "0000000000000000ffff000000010000", 12, false, 28, "", 0},
{true, 28, "0000000000000000ffff000000010000", 1, false, 28, "", 0},
{true, 28, "00000000000000000000000000000001", 64, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000000000000001", 4, true, 0, "3a3a3100", 4},
{true, 28, "00000000000000000000000000000001", 3, false, 28, "", 0},
{true, 28, "00000000000000000000000000000001", 1, false, 28, "", 0},
{true, 28, "00000000000000000000000000000000", 64, true, 0, "3a3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000000000000000", 3, true, 0, "3a3a00", 3},
{true, 28, "00000000000000000000000000000000", 2, false, 28, "", 0},
{true, 28, "00000000000000000000000000000000", 1, false, 28, "", 0},
{true, 28, "00010000000000000000000000000000", 64, true, 0, "313a3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00010000000000000000000000000000", 4, true, 0, "313a3a00", 4},
{true, 28, "00010000000000000000000000000000", 3, false, 28, "", 0},
{true, 28, "00010000000000000000000000000000", 1, false, 28, "", 0},
{true, 28, "00000000000000000000000000000002", 64, true, 0, "3a3a3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000000000000002", 4, true, 0, "3a3a3200", 4},
{true, 28, "00000000000000000000000000000002", 3, false, 28, "", 0},
{true, 28, "00000000000000000000000000000002", 1, false, 28, "", 0},
{true, 28, "00000000000000000000000001020304", 64, true, 0, "3a3a312e322e332e3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000000001020304", 10, true, 0, "3a3a312e322e332e3400", 10},
{true, 28, "00000000000000000000000001020304", 9, false, 28, "", 0},
{true, 28, "00000000000000000000000001020304", 1, false, 28, "", 0},
{true, 28, "00010000000000020000000000000003", 64, true, 0, "313a303a303a323a3a33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00010000000000020000000000000003", 11, true, 0, "313a303a303a323a3a3300", 11},
{true, 28, "00010000000000020000000000000003", 10, false, 28, "", 0},
{true, 28, "00010000000000020000000000000003", 1, false, 28, "", 0},
{true, 28, "00010000000200000003000000040000", 64, true, 0, "313a303a323a303a333a303a343a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00010000000200000003000000040000", 16, true, 0, "313a303a323a303a333a303a343a3000", 16},
{true, 28, "00010000000200000003000000040000", 15, false, 28, "", 0},
{true, 28, "00010000000200000003000000040000", 1, false, 28, "", 0},
{true, 28, "00000000000100000000000200000000", 64, true, 0, "3a3a313a303a303a323a303a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000100000000000200000000", 14, true, 0, "3a3a313a303a303a323a303a3000", 14},
{true, 28, "00000000000100000000000200000000", 13, false, 28, "", 0},
{true, 28, "00000000000100000000000200000000", 1, false, 28, "", 0},
{true, 28, "00000000000000000000ffff01020304", 64, true, 0, "3a3a666666663a312e322e332e340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000ffff01020304", 15, true, 0, "3a3a666666663a312e322e332e3400", 15},
{true, 28, "00000000000000000000ffff01020304", 14, false, 28, "", 0},
{true, 28, "00000000000000000000ffff01020304", 1, false, 28, "", 0},
{true, 28, "20010db8000000000000000000000017", 64, true, 0, "323030313a6462383a3a313700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "20010db8000000000000000000000017", 13, true, 0, "323030313a6462383a3a313700", 13},
{true, 28, "20010db8000000000000000000000017", 12, false, 28, "", 0},
{true, 28, "20010db8000000000000000000000017", 1, false, 28, "", 0},
{true, 28, "00000000000000000000000000010000", 64, true, 0, "3a3a302e312e302e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000000000010000", 10, true, 0, "3a3a302e312e302e3000", 10},
{true, 28, "00000000000000000000000000010000", 9, false, 28, "", 0},
{true, 28, "00000000000000000000000000010000", 1, false, 28, "", 0},
{true, 28, "00000000000000000000000000010000", 64, true, 0, "3a3a302e312e302e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64},
{true, 28, "00000000000000000000000000010000", 10, true, 0, "3a3a302e312e302e3000", 10},
{true, 28, "00000000000000000000000000010000", 9, false, 28, "", 0},
{true, 28, "00000000000000000000000000010000", 1, false, 28, "", 0},
{true, 28, "ffffffffffffffffffffffffffffffff", 64, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600000000000000000000000000000000000000000000000000", 64},
{true, 28, "ffffffffffffffffffffffffffffffff", 40, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600", 40},
{true, 28, "ffffffffffffffffffffffffffffffff", 39, false, 28, "", 0},
{true, 28, "ffffffffffffffffffffffffffffffff", 1, false, 28, "", 0},
{true, 10, "01020304", 64, false, 47, "", 0},
{true, 9999, "01020304", 64, false, 47, "", 0},
{false, 28, "00000000000000000000000000000001", 65, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 65},
{false, 2, "01020304", 65, true, 0, "312e322e332e3400", 8},
{false, 28, "00000000000000000000000000000001", 128, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 128},
{false, 2, "01020304", 128, true, 0, "312e322e332e3400", 8},
{false, 28, "00000000000000000000000000000001", 1024, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1024},
{false, 2, "01020304", 1024, true, 0, "312e322e332e3400", 8},
{false, 28, "00000000000000000000000000000001", 4096, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 4096},
{false, 2, "01020304", 4096, true, 0, "312e322e332e3400", 8},
{false, 28, "00000000000000000000000000000001", 65536, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 65536},
{false, 2, "01020304", 65536, true, 0, "312e322e332e3400", 8},
{true, 28, "00000000000000000000000000000001", 65, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 65},
{true, 2, "01020304", 65, true, 0, "312e322e332e3400", 8},
{true, 28, "00000000000000000000000000000001", 128, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 128},
{true, 2, "01020304", 128, true, 0, "312e322e332e3400", 8},
{true, 28, "00000000000000000000000000000001", 1024, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1024},
{true, 2, "01020304", 1024, true, 0, "312e322e332e3400", 8},
{true, 28, "00000000000000000000000000000001", 4096, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 4096},
{true, 2, "01020304", 4096, true, 0, "312e322e332e3400", 8},
{true, 28, "00000000000000000000000000000001", 65536, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 65536},
{true, 2, "01020304", 65536, true, 0, "312e322e332e3400", 8},
};
static const PadCase ConsolePaddingBoth[] = {
{28, "00000000000000000000000000000001", 4, 4},
{28, "00000000000000000000000000000001", 5, 5},
{28, "00000000000000000000000000000001", 16, 16},
{28, "00000000000000000000000000000001", 45, 45},
{28, "00000000000000000000000000000001", 46, 46},
{28, "00000000000000000000000000000001", 47, 47},
{28, "00000000000000000000000000000001", 64, 64},
{28, "ffffffffffffffffffffffffffffffff", 64, 64},
{2, "01020304", 8, 8},
{2, "01020304", 16, 8},
{2, "01020304", 64, 8},
};
static const PadCase ConsolePaddingLarge[] = {
{28, "00000000000000000000000000000001", 65, 65},
{28, "00000000000000000000000000000001", 128, 128},
{28, "00000000000000000000000000000001", 1024, 1024},
{28, "00000000000000000000000000000001", 4096, 4096},
{28, "00000000000000000000000000000001", 65536, 65536},
{2, "01020304", 65, 8},
{2, "01020304", 128, 8},
{2, "01020304", 1024, 8},
{2, "01020304", 4096, 8},
{2, "01020304", 65536, 8},
};
static const PadCase ConsolePaddingUnderscored[] = {
{28, "00000000000000000000000000000001", 64, 64},
{28, "00000000000000000000000000000001", 65, 65},
{28, "00000000000000000000000000000001", 128, 128},
{28, "00000000000000000000000000000001", 256, 256},
{28, "00000000000000000000000000000001", 1024, 1024},
{2, "01020304", 64, 8},
{2, "01020304", 65, 8},
{2, "01020304", 128, 8},
{2, "01020304", 256, 8},
{2, "01020304", 1024, 8},
};
static unsigned HexValue(char digit) { return digit <= '9' ? static_cast<unsigned>(digit - '0') : static_cast<unsigned>(digit - 'a' + 10); }
static std::size_t FromHex(const char* hex, unsigned char* out) {
std::size_t index = 0;
for (; hex[2 * index]; ++index) out[index] = static_cast<unsigned char>(HexValue(hex[2 * index]) << 4 | HexValue(hex[2 * index + 1]));
return index;
}
static bool SameBytes(const void* data, const char* hex) {
const auto* bytes = static_cast<const unsigned char*>(data);
for (std::size_t index = 0; hex[2 * index]; ++index)
if (bytes[index] != (HexValue(hex[2 * index]) << 4 | HexValue(hex[2 * index + 1]))) return false;
return true;
}
template <typename TCall>
static bool Throws(TCall call) {
try {
call();
} catch (const std::runtime_error&) {
return true;
}
return false;
}
static char Wide[70000];
static void CheckConsolePton() {
for (const PtonCase& sample : ConsolePton) {
unsigned char destination[16];
std::memset(destination, 0xAA, sizeof(destination));
*__error_nid_postfix() = 0;
const int result = sample.plain ? inet_pton_nid_postfix(sample.family, sample.text, destination)
: __inet_pton_nid_postfix(sample.family, sample.text, destination);
Require(result == sample.result);
Require(*__error_nid_postfix() == sample.error);
Require(SameBytes(destination, sample.bytes));
}
}
static void CheckConsoleNtop() {
for (const NtopCase& sample : ConsoleNtop) {
unsigned char source[16]{};
FromHex(sample.source, source);
std::memset(Wide, 'Z', sizeof(Wide));
*__error_nid_postfix() = 0;
const char* result = sample.plain ? inet_ntop_nid_postfix(sample.family, source, Wide, sample.size)
: __inet_ntop_nid_postfix(sample.family, source, Wide, sample.size);
Require(result == (sample.succeeds ? Wide : nullptr));
Require(*__error_nid_postfix() == sample.error);
Require(SameBytes(Wide, sample.bytes));
if (!sample.lastTouched && sample.succeeds) continue;
const std::size_t shown = std::strlen(sample.bytes) / 2;
for (std::size_t index = shown; index < sample.lastTouched; ++index) Require(Wide[index] != 'Z');
for (std::size_t index = sample.lastTouched; index < sizeof(Wide); ++index) Require(Wide[index] == 'Z');
}
}
static void CheckConsolePadding(const PadCase* samples, std::size_t count, Ntop ntop) {
for (std::size_t sample = 0; sample < count; ++sample) {
unsigned char source[16]{};
FromHex(samples[sample].source, source);
std::memset(Wide, 'Z', sizeof(Wide));
Require(ntop(samples[sample].family, source, Wide, samples[sample].size) == Wide);
for (std::size_t index = std::strlen(Wide); index < samples[sample].lastTouched; ++index) Require(Wide[index] == '\0');
for (std::size_t index = samples[sample].lastTouched; index < sizeof(Wide); ++index) Require(Wide[index] == 'Z');
}
}
static void CheckNullPointers() {
const unsigned char loopback[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
const unsigned char quad[16] = {1, 2, 3, 4};
unsigned char bytes[16]{};
char text[64];
Require(Throws([&] { __inet_ntop_nid_postfix(28, nullptr, text, sizeof(text)); }));
Require(Throws([&] { __inet_ntop_nid_postfix(2, nullptr, text, sizeof(text)); }));
Require(Throws([&] { __inet_ntop_nid_postfix(28, loopback, nullptr, 46); }));
Require(Throws([&] { __inet_ntop_nid_postfix(2, quad, nullptr, 16); }));
Require(Throws([&] { inet_ntop_nid_postfix(28, nullptr, text, sizeof(text)); }));
Require(Throws([&] { inet_ntop_nid_postfix(28, loopback, nullptr, 46); }));
Require(Throws([&] { __inet_ntop_nid_postfix(2, nullptr, text, 0); }));
Require(Throws([&] { __inet_ntop_nid_postfix(28, nullptr, text, 1); }));
Require(Throws([&] { inet_ntop_nid_postfix(2, nullptr, text, 0); }));
Require(Throws([&] { inet_ntop_nid_postfix(28, nullptr, text, 1); }));
for (Ntop ntop : {__inet_ntop_nid_postfix, inet_ntop_nid_postfix}) {
*__error_nid_postfix() = 0;
Require(ntop(28, loopback, nullptr, 3) == nullptr && *__error_nid_postfix() == 28);
*__error_nid_postfix() = 0;
Require(ntop(2, quad, nullptr, 7) == nullptr && *__error_nid_postfix() == 28);
*__error_nid_postfix() = 0;
Require(ntop(2, quad, nullptr, 0) == nullptr && *__error_nid_postfix() == 28);
}
Require(Throws([&] { __inet_pton_nid_postfix(2, nullptr, bytes); }));
Require(Throws([&] { __inet_pton_nid_postfix(28, nullptr, bytes); }));
Require(Throws([&] { __inet_pton_nid_postfix(2, "1.2.3.4", nullptr); }));
Require(Throws([&] { __inet_pton_nid_postfix(28, "::1", nullptr); }));
Require(Throws([&] { inet_pton_nid_postfix(2, nullptr, bytes); }));
Require(Throws([&] { inet_pton_nid_postfix(2, "1.2.3.4", nullptr); }));
*__error_nid_postfix() = 0;
Require(__inet_pton_nid_postfix(2, "1.2.3", nullptr) == 0 && *__error_nid_postfix() == 0);
Require(__inet_pton_nid_postfix(28, "zzz", nullptr) == 0 && *__error_nid_postfix() == 0);
Require(__inet_pton_nid_postfix(2, "", nullptr) == 0 && *__error_nid_postfix() == 0);
Require(inet_pton_nid_postfix(2, "1.2.3", nullptr) == 0 && *__error_nid_postfix() == 0);
Require(inet_pton_nid_postfix(28, "zzz", nullptr) == 0 && *__error_nid_postfix() == 0);
Require(inet_pton_nid_postfix(2, "", nullptr) == 0 && *__error_nid_postfix() == 0);
*__error_nid_postfix() = 0;
Require(__inet_ntop_nid_postfix(9999, nullptr, text, sizeof(text)) == nullptr && *__error_nid_postfix() == 47);
*__error_nid_postfix() = 0;
Require(__inet_ntop_nid_postfix(9999, bytes, nullptr, 46) == nullptr && *__error_nid_postfix() == 47);
*__error_nid_postfix() = 0;
Require(__inet_pton_nid_postfix(9999, nullptr, bytes) == -1 && *__error_nid_postfix() == 47);
*__error_nid_postfix() = 0;
Require(__inet_pton_nid_postfix(9999, "1.2.3.4", nullptr) == -1 && *__error_nid_postfix() == 47);
*__error_nid_postfix() = 0;
Require(inet_ntop_nid_postfix(9999, nullptr, text, sizeof(text)) == nullptr && *__error_nid_postfix() == 47);
*__error_nid_postfix() = 0;
Require(inet_ntop_nid_postfix(9999, quad, nullptr, 46) == nullptr && *__error_nid_postfix() == 47);
*__error_nid_postfix() = 0;
Require(inet_pton_nid_postfix(9999, nullptr, bytes) == -1 && *__error_nid_postfix() == 47);
*__error_nid_postfix() = 0;
Require(inet_pton_nid_postfix(9999, "1.2.3.4", nullptr) == -1 && *__error_nid_postfix() == 47);
}
static void CheckErrnoKept() {
unsigned char bytes[16]{};
char text[64];
*__error_nid_postfix() = 13;
Require(__inet_pton_nid_postfix(2, "1.2.3.4", bytes) == 1 && *__error_nid_postfix() == 13);
Require(__inet_pton_nid_postfix(2, "1.2.3", bytes) == 0 && *__error_nid_postfix() == 13);
Require(__inet_pton_nid_postfix(28, "::1", bytes) == 1 && *__error_nid_postfix() == 13);
Require(__inet_ntop_nid_postfix(2, bytes, text, sizeof(text)) == text && *__error_nid_postfix() == 13);
}
int main() {
Require(htonl_nid_postfix(0x11223344u) == 0x44332211u && ntohl_nid_postfix(0x44332211u) == 0x11223344u);
Require(htons_nid_postfix(0x1234) == 0x3412 && ntohs_nid_postfix(0x3412) == 0x1234);
const std::uint32_t loopback = htonl_nid_postfix(0x7f000001u);
unsigned char loopbackBytes[4];
std::memcpy(loopbackBytes, &loopback, sizeof(loopback));
Require(loopbackBytes[0] == 127 && loopbackBytes[3] == 1);
for (int family : {2, 28}) {
const char* input = family == 2 ? "192.0.2.17" : "2001:db8::17";
std::array<unsigned char, 16> address{};
Require(__inet_pton_nid_postfix(family, input, address.data()) == 1);
char output[64]{};
Require(__inet_ntop_nid_postfix(family, address.data(), output, sizeof(output)) == output);
Require(std::strcmp(input, output) == 0);
output[0] = 'x';
Require(__inet_ntop_nid_postfix(family, address.data(), output, 1) == nullptr);
Require(*__error_nid_postfix() == 28 && output[0] == 'x');
const auto original = address;
Require(__inet_pton_nid_postfix(family, "not-an-address", address.data()) == 0);
Require(address == original);
}
std::array<unsigned char, 16> address{};
Require(__inet_pton_nid_postfix(10, "::1", address.data()) == -1);
Require(*__error_nid_postfix() == 47); // Linux AF_INET6 is not PS5 AF_INET6
Require(__inet_pton_nid_postfix(2, "256.1.2.3", address.data()) == 0);
Require(__inet_pton_nid_postfix(28, "::ffff:192.0.2.17", address.data()) == 1);
Require(address[10] == 255 && address[11] == 255 && address[12] == 192 && address[15] == 17);
for (const char* rejected : {"01.2.3.4", "1.2.3", "1.2.3.4.5", "1.2.3.4.", " 1.2.3.4", "0x1.2.3.4", "1..3.4", "1.2.3.-4"}) {
address.fill(0xA5);
Require(__inet_pton_nid_postfix(2, rejected, address.data()) == 0);
Require(address[0] == 0xA5);
}
for (const char* rejected : {"::ffff:01.2.3.4", "::ffff:1.2.3.04", "1:2:3:4:5:6:7:8::", "::1:2:3:4:5:6:7:8", "1::2::3", ":::", ":1::", "1::2:", ":1:2:3:4:5:6:7",
"1:2:3:4:5:6:7", "1:2:3:4:5:6:7:8:9", "12345::", "fe80::1%eth0", "1.2.3.4::", "::1.2.3.4:1", "::g", "1:2:3:4:5:6:1.2.3.4:7",
"1:2:3:4:5:6:7:1.2.3.4", ""}) {
address.fill(0xA5);
Require(__inet_pton_nid_postfix(28, rejected, address.data()) == 0);
Require(address[0] == 0xA5 && address[15] == 0xA5);
}
Require(__inet_pton_nid_postfix(28, "1:2:3:4:5:6:7::", address.data()) == 1);
Require(address[13] == 7 && address[14] == 0 && address[1] == 1);
Require(__inet_pton_nid_postfix(28, "ABCD:ef01::1", address.data()) == 1);
Require(address[0] == 0xAB && address[1] == 0xCD && address[2] == 0xEF && address[3] == 0x01 && address[15] == 1);
struct Text { const char* bytesAsText; const char* expected; };
const Text samples[] = {
{"::ffff:0.0.0.1", "::ffff:0.0.0.1"}, {"::ffff:0:1:0", "::ffff:0:1:0"}, {"::1", "::1"}, {"::", "::"}, {"1::", "1::"},
{"::2", "::2"}, {"::1.2.3.4", "::1.2.3.4"}, {"1:0:0:2:0:0:0:3", "1:0:0:2::3"}, {"1:0:2:0:3:0:4:0", "1:0:2:0:3:0:4:0"},
{"0:0:1:0:0:2:0:0", "::1:0:0:2:0:0"}, {"::ffff:1.2.3.4", "::ffff:1.2.3.4"}, {"2001:DB8::17", "2001:db8::17"}};
for (const Text& sample : samples) {
Require(__inet_pton_nid_postfix(28, sample.bytesAsText, address.data()) == 1);
char output[64]{};
Require(__inet_ntop_nid_postfix(28, address.data(), output, sizeof(output)) == output);
Require(std::strcmp(output, sample.expected) == 0);
const auto length = std::strlen(sample.expected);
std::memset(output, 'x', sizeof(output));
Require(__inet_ntop_nid_postfix(28, address.data(), output, static_cast<std::uint32_t>(length + 1)) == output);
Require(std::strcmp(output, sample.expected) == 0);
std::memset(output, 'x', sizeof(output));
*__error_nid_postfix() = 0;
Require(__inet_ntop_nid_postfix(28, address.data(), output, static_cast<std::uint32_t>(length)) == nullptr);
Require(*__error_nid_postfix() == 28 && output[0] == 'x');
}
address.fill(0xFF);
char widest[64]{};
Require(__inet_ntop_nid_postfix(28, address.data(), widest, sizeof(widest)) == widest);
Require(std::strcmp(widest, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") == 0);
const unsigned char fourth[4] = {255, 0, 7, 100};
Require(__inet_ntop_nid_postfix(2, fourth, widest, 12) == widest && std::strcmp(widest, "255.0.7.100") == 0);
Require(__inet_ntop_nid_postfix(2, fourth, widest, 11) == nullptr && *__error_nid_postfix() == 28);
Require(__inet_ntop_nid_postfix(10, fourth, widest, sizeof(widest)) == nullptr && *__error_nid_postfix() == 47);
CheckConsolePton();
CheckConsoleNtop();
CheckConsolePadding(ConsolePaddingBoth, sizeof(ConsolePaddingBoth) / sizeof(ConsolePaddingBoth[0]), __inet_ntop_nid_postfix);
CheckConsolePadding(ConsolePaddingBoth, sizeof(ConsolePaddingBoth) / sizeof(ConsolePaddingBoth[0]), inet_ntop_nid_postfix);
CheckConsolePadding(ConsolePaddingUnderscored, sizeof(ConsolePaddingUnderscored) / sizeof(ConsolePaddingUnderscored[0]), __inet_ntop_nid_postfix);
CheckConsolePadding(ConsolePaddingLarge, sizeof(ConsolePaddingLarge) / sizeof(ConsolePaddingLarge[0]), __inet_ntop_nid_postfix);
CheckConsolePadding(ConsolePaddingLarge, sizeof(ConsolePaddingLarge) / sizeof(ConsolePaddingLarge[0]), inet_ntop_nid_postfix);
CheckNullPointers();
CheckErrnoKept();
}