// File: /workspace/github_cpp_makefile_star2_O1/night-shift[P]Srl/src/lib/ToolsBtsConv.cpp
// Function: GLOBAL__sub_I_ToolsBtsConv.cpp
void Tools::hex_to_bytes(uint8_t* dest, size_t dest_size, const uint8_t* str, size_t str_len)
{
    if(str_len % 2 != 0) {
        throw Exception("Unable to convert hex string to binary data. Size of source must be even.");
    }

    if(dest_size < str_len / 2) {
        throw Exception("Unable to convert hex string to binary data. Destination buffer too small.");
    }

    const auto conv = [](uint8_t& c) {
        if(c >= '0' && c <= '9') {
            c -= '0';

        } else if(c >= 'A' && c <= 'F') {
            c = (c - 'A') + 10;

        } else if(c >= 'a' && c <= 'f') {
            c = (c - 'a') + 10;

        } else {
            throw Exception("Unable to convert hex string to binary data. String malformed.");
        }
    };

    uint8_t low = 0, high = 0;
    uint8_t packed = 0;

    for (size_t in_idx = 0, out_idx = 0; in_idx < str_len;
                in_idx += 2, out_idx++) {

        high = str[in_idx];
        low  = str[in_idx + 1];

        conv(high);
        conv(low);

        packed = (high << 4U) | low;
        dest[out_idx] = packed;
    }
}

// Assembly:
pushq %rbx
leaq 0x1bef8(%rip), %rax     # 0x29710
movq %rax, 0x1bee1(%rip)     # 0x29700
movl $0x6c6f6f42, 0x1bee7(%rip) # imm = 0x6C6F6F42
movl $0x4, %eax
movq %rax, 0x1bed3(%rip)     # 0x29708
xorl %ebx, %ebx
movb %bl, 0x1bed7(%rip)      # 0x29714
leaq 0x1beec(%rip), %rcx     # 0x29730
movq %rcx, 0x1bed5(%rip)     # 0x29720
movw $0x3849, 0x1bedc(%rip)  # imm = 0x3849
movq $0x2, 0x1bec9(%rip) # 0x29728
movb %bl, 0x1becd(%rip)      # 0x29732
leaq 0x1bee4(%rip), %rcx     # 0x29750
movq %rcx, 0x1becd(%rip)     # 0x29740
movl $0x384955, 0x1bed3(%rip) # imm = 0x384955
movl $0x3, %ecx
movq %rcx, 0x1bebf(%rip)     # 0x29748
leaq 0x1bee0(%rip), %rdx     # 0x29770
movq %rdx, 0x1bec9(%rip)     # 0x29760
movl $0x363149, 0x1becf(%rip) # imm = 0x363149
movq %rcx, 0x1bec0(%rip)     # 0x29768
leaq 0x1bee1(%rip), %rdx     # 0x29790
movq %rdx, 0x1beca(%rip)     # 0x29780
movl $0x36314955, 0x1bed0(%rip) # imm = 0x36314955
movq %rax, 0x1bec1(%rip)     # 0x29788
movb %bl, 0x1bec7(%rip)      # 0x29794
leaq 0x1bedc(%rip), %rdx     # 0x297b0
movq %rdx, 0x1bec5(%rip)     # 0x297a0
movl $0x323349, 0x1becb(%rip) # imm = 0x323349
movq %rcx, 0x1bebc(%rip)     # 0x297a8
leaq 0x1bedd(%rip), %rdx     # 0x297d0
movq %rdx, 0x1bec6(%rip)     # 0x297c0
movl $0x32334955, 0x1becc(%rip) # imm = 0x32334955
movq %rax, 0x1bebd(%rip)     # 0x297c8
movb %bl, 0x1bec3(%rip)      # 0x297d4
leaq 0x1bed8(%rip), %rdx     # 0x297f0
movq %rdx, 0x1bec1(%rip)     # 0x297e0
movl $0x343649, 0x1bec7(%rip) # imm = 0x343649
movq %rcx, 0x1beb8(%rip)     # 0x297e8
leaq 0x1bed9(%rip), %rcx     # 0x29810
movq %rcx, 0x1bec2(%rip)     # 0x29800
movl $0x34364955, 0x1bec8(%rip) # imm = 0x34364955
movq %rax, 0x1beb9(%rip)     # 0x29808
movb %bl, 0x1bebf(%rip)      # 0x29814
leaq 0x1bed4(%rip), %rcx     # 0x29830
movq %rcx, 0x1bebd(%rip)     # 0x29820
movl $0x32335046, 0x1bec3(%rip) # imm = 0x32335046
movq %rax, 0x1beb4(%rip)     # 0x29828
movb %bl, 0x1beba(%rip)      # 0x29834
leaq 0x1becf(%rip), %rcx     # 0x29850
movq %rcx, 0x1beb8(%rip)     # 0x29840
movl $0x34365046, 0x1bebe(%rip) # imm = 0x34365046
movq %rax, 0x1beaf(%rip)     # 0x29848
movb %bl, 0x1beb5(%rip)      # 0x29854
leaq 0x1beca(%rip), %rcx     # 0x29870
movq %rcx, 0x1beb3(%rip)     # 0x29860
movl $0x6c6c754e, 0x1beb9(%rip) # imm = 0x6C6C754E
movq %rax, 0x1beaa(%rip)     # 0x29868
movb %bl, 0x1beb0(%rip)      # 0x29874
leaq 0x1bec5(%rip), %rax     # 0x29890
movq %rax, 0x1beae(%rip)     # 0x29880
movw $0x676e, 0x1beb9(%rip)  # imm = 0x676E
movl $0x69727453, 0x1beab(%rip) # imm = 0x69727453
movl $0x6, %eax
movq %rax, 0x1be97(%rip)     # 0x29888
movb %bl, 0x1be9f(%rip)      # 0x29896
leaq 0x1beb2(%rip), %rcx     # 0x298b0
movq %rcx, 0x1be9b(%rip)     # 0x298a0
movw $0x7972, 0x1bea6(%rip)  # imm = 0x7972
movl $0x616e6942, 0x1be98(%rip) # imm = 0x616E6942
movq %rax, 0x1be89(%rip)     # 0x298a8
movb %bl, 0x1be91(%rip)      # 0x298b6
leaq 0x1bea4(%rip), %rcx     # 0x298d0
movq %rcx, 0x1be8d(%rip)     # 0x298c0
movw $0x7463, 0x1be98(%rip)  # imm = 0x7463
movl $0x656a624f, 0x1be8a(%rip) # imm = 0x656A624F
movq %rax, 0x1be7b(%rip)     # 0x298c8
movb %bl, 0x1be83(%rip)      # 0x298d6
leaq 0x1be96(%rip), %rax     # 0x298f0
movq %rax, 0x1be7f(%rip)     # 0x298e0
movb $0x79, 0x1be8c(%rip)    # 0x298f4
movl $0x61727241, 0x1be7e(%rip) # imm = 0x61727241
movq $0x5, 0x1be6b(%rip) # 0x298e8
movb %bl, 0x1be72(%rip)      # 0x298f5
leaq 0x1be86(%rip), %rax     # 0x29910
movq %rax, 0x1be6f(%rip)     # 0x29900
movabsq $0x6e455f65706f6353, %rax # imm = 0x6E455F65706F6353
movq %rax, 0x1be6e(%rip)     # 0x29910
movb $0x64, 0x1be6f(%rip)    # 0x29918
movq $0x9, 0x1be54(%rip) # 0x29908
movb %bl, 0x1be5f(%rip)      # 0x29919
leaq -0x2f1(%rip), %rdi      # 0xd7d0
leaq 0x1ad60(%rip), %rdx     # 0x28828
xorl %esi, %esi
callq 0xb840
leaq 0x115a9(%rip), %rax     # 0x1f07f
movq %rax, 0x1be43(%rip)     # 0x29920
movl $0x3, 0x1be41(%rip)     # 0x29928
movw $0x10c, %ax             # imm = 0x10C
movw %ax, 0x1be3a(%rip)      # 0x2992c
movb %bl, 0x1be36(%rip)      # 0x2992e
leaq 0x11557(%rip), %rcx     # 0x1f056
movq %rcx, 0x1be2a(%rip)     # 0x29930
movl $0x5, %ecx
movl %ecx, 0x1be27(%rip)     # 0x29938
movw %ax, 0x1be24(%rip)      # 0x2993c
movb %bl, 0x1be20(%rip)      # 0x2993e
leaq 0x11549(%rip), %rdx     # 0x1f06e
movq %rdx, 0x1be14(%rip)     # 0x29940
movl %ecx, 0x1be16(%rip)     # 0x29948
movw %ax, 0x1be13(%rip)      # 0x2994c
movb %bl, 0x1be0f(%rip)      # 0x2994e
leaq 0x11516(%rip), %rcx     # 0x1f05c
movq %rcx, 0x1be03(%rip)     # 0x29950
movl $0x6, 0x1be01(%rip)     # 0x29958
movw %ax, 0x1bdfe(%rip)      # 0x2995c
movb %bl, 0x1bdfa(%rip)      # 0x2995e
leaq 0x114f8(%rip), %rcx     # 0x1f063
movq %rcx, 0x1bdee(%rip)     # 0x29960
movl $0x10, 0x1bdec(%rip)    # 0x29968
movw %ax, 0x1bde9(%rip)      # 0x2996c
movb %bl, 0x1bde5(%rip)      # 0x2996e
leaq 0x114e4(%rip), %rcx     # 0x1f074
movq %rcx, 0x1bdd9(%rip)     # 0x29970
movl $0xe, 0x1bdd7(%rip)     # 0x29978
movw %ax, 0x1bdd4(%rip)      # 0x2997c
movb %bl, 0x1bdd0(%rip)      # 0x2997e
leaq 0x114ce(%rip), %rcx     # 0x1f083
movq %rcx, 0x1bdc4(%rip)     # 0x29980
movl $0xb, 0x1bdc2(%rip)     # 0x29988
movw %ax, 0x1bdbf(%rip)      # 0x2998c
movb %bl, 0x1bdbb(%rip)      # 0x2998e
movq $0x0, 0x1bdb2(%rip) # 0x29990
movl $0x0, 0x1bdb0(%rip)     # 0x29998
movw %ax, 0x1bdad(%rip)      # 0x2999c
movb %bl, 0x1bda9(%rip)      # 0x2999e
popq %rbx
retq