url/unicode

Unicode-related routines

Copyright (C) 2025-2026 Trayambak Rai (xtrayambak@disroot.org)

Consts

C0ControlPercentEncode: array[32, uint8] = [255'u, 255'u, 255'u, 255'u, 0'u,
    0'u, 0'u, 0'u, 0'u, 0'u, 0'u, 0'u, 0'u, 0'u, 0'u, 128'u, 255'u, 255'u,
    255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u,
    255'u, 255'u, 255'u]
FragmentPercentEncode: array[32, uint8] = [255'u, 255'u, 255'u, 255'u, 5'u, 0'u,
    0'u, 80'u, 0'u, 0'u, 0'u, 0'u, 1'u, 0'u, 0'u, 128'u, 255'u, 255'u, 255'u,
    255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u,
    255'u, 255'u]
HexToBinaryTable: array[55, uint8] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0,
                                      0, 0, 0, 10, 11, 12, 13, 14, 15, 0, 0, 0,
                                      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                      0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13,
                                      14, 15]
QueryPercentEncode: array[32, uint8] = [255'u, 255'u, 255'u, 255'u, 13'u, 0'u,
                                        0'u, 80'u, 0'u, 0'u, 0'u, 0'u, 0'u, 0'u,
                                        0'u, 128'u, 255'u, 255'u, 255'u, 255'u,
                                        255'u, 255'u, 255'u, 255'u, 255'u,
                                        255'u, 255'u, 255'u, 255'u, 255'u,
                                        255'u, 255'u]
SpecialQueryPercentEncode: array[32, uint8] = [255'u, 255'u, 255'u, 255'u,
    141'u, 0'u, 0'u, 80'u, 0'u, 0'u, 0'u, 0'u, 0'u, 0'u, 0'u, 128'u, 255'u,
    255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u,
    255'u, 255'u, 255'u, 255'u]
UserInfoPercentEncode: array[32, uint8] = [255'u, 255'u, 255'u, 255'u, 13'u,
    128'u, 0'u, 252'u, 1'u, 0'u, 0'u, 120'u, 1'u, 0'u, 0'u, 184'u, 255'u, 255'u,
    255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u, 255'u,
    255'u, 255'u, 255'u]

Procs

func bitAt(a: openArray[uint8]; i: uint8): bool {.inline, ...raises: [], cdecl,
    ...tags: [], forbids: [].}
func convertHexToBinary(c: char): uint8 {.inline, ...raises: [], cdecl, ...tags: [],
    forbids: [].}
func isAsciiHexDigit(c: uint8 | char): bool {.inline, ...raises: [], cdecl.}
func isForbiddenHostCodePoint(c: char): bool {.inline, ...raises: [], tags: [],
    forbids: [].}
func percentDecode(input: StringView; firstPercent: uint32): string {.
    ...raises: [], tags: [], forbids: [].}
func percentEncode(input: StringView; characterSet: openArray[uint8]): string {.
    cdecl, ...raises: [], tags: [], forbids: [].}
func toAscii(plain: StringView; firstPercent: uint32): Option[string] {.
    ...raises: [], tags: [], forbids: [].}