mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 01:44:37 +00:00
* fix #14082, don't crash on incorrectly formatted input * address code review * remove duplication
25 lines
890 B
Nim
25 lines
890 B
Nim
# Include file that implements 'decodePercent' and friends. Do not import it!
|
|
|
|
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: string, i: var int): char =
|
|
## Converts `%xx` hexadecimal to the charracter 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)
|