diff options
author | flywind <43030857+xflywind@users.noreply.github.com> | 2020-12-03 02:30:55 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-02 10:30:55 -0800 |
commit | 139075e96565f4b7436e8d2368f85f11852aa668 (patch) | |
tree | c56f45dbd336bf23cc8539ffe7ef9c50aad4253b /lib/std/private | |
parent | af984a3db969d28961a9e765190c091c9aa30880 (diff) | |
download | Nim-139075e96565f4b7436e8d2368f85f11852aa668.tar.gz |
move decode_helpers to std/private (#16209)
Diffstat (limited to 'lib/std/private')
-rw-r--r-- | lib/std/private/decode_helpers.nim | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/std/private/decode_helpers.nim b/lib/std/private/decode_helpers.nim new file mode 100644 index 000000000..586c7cae6 --- /dev/null +++ b/lib/std/private/decode_helpers.nim @@ -0,0 +1,22 @@ +proc handleHexChar*(c: char, x: var int, f: var bool) {.inline.} = + case c + of '0'..'9': x = (x shl 4) or (ord(c) - ord('0')) + of 'a'..'f': x = (x shl 4) or (ord(c) - ord('a') + 10) + of 'A'..'F': x = (x shl 4) or (ord(c) - ord('A') + 10) + else: f = true + +proc decodePercent*(s: openArray[char], i: var int): char = + ## Converts `%xx` hexadecimal to the character with ordinal number `xx`. + ## + ## If `xx` is not a valid hexadecimal value, it is left intact: only the + ## leading `%` is returned as-is, and `xx` characters will be processed in the + ## next step (e.g. in `uri.decodeUrl`) as regular characters. + result = '%' + if i+2 < s.len: + var x = 0 + var failed = false + handleHexChar(s[i+1], x, failed) + handleHexChar(s[i+2], x, failed) + if not failed: + result = chr(x) + inc(i, 2) |