move decode_helpers to std/private (#16209)
This commit is contained in:
parent
af984a3db9
commit
139075e965
3 changed files with 5 additions and 7 deletions
22
lib/std/private/decode_helpers.nim
Normal file
22
lib/std/private/decode_helpers.nim
Normal file
|
|
@ -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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue