diff options
Diffstat (limited to 'lib/pure/pathnorm.nim')
-rw-r--r-- | lib/pure/pathnorm.nim | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/lib/pure/pathnorm.nim b/lib/pure/pathnorm.nim index a33afefbd..ca869fd03 100644 --- a/lib/pure/pathnorm.nim +++ b/lib/pure/pathnorm.nim @@ -66,19 +66,27 @@ proc addNormalizePath*(x: string; result: var string; state: var int; dirSep = D if (state shr 1 == 0) and isSlash(x, b): result.add dirSep state = state or 1 - elif result.len > (state and 1) and isDotDot(x, b): - var d = result.len - # f/.. - while (d-1) > (state and 1) and result[d-1] notin {DirSep, AltSep}: - dec d - if d > 0: setLen(result, d-1) + elif isDotDot(x, b): + if (state shr 1) >= 1: + var d = result.len + # f/.. + while (d-1) > (state and 1) and result[d-1] notin {DirSep, AltSep}: + dec d + if d > 0: + setLen(result, d-1) + dec state, 2 + else: + if result.len > 0 and result[^1] notin {DirSep, AltSep}: + result.add dirSep + result.add substr(x, b[0], b[1]) elif isDot(x, b): discard "discard the dot" elif b[1] >= b[0]: if result.len > 0 and result[^1] notin {DirSep, AltSep}: result.add dirSep result.add substr(x, b[0], b[1]) - inc state, 2 + inc state, 2 + if result == "" and x != "": result = "." proc normalizePath*(path: string; dirSep = DirSep): string = ## Example: @@ -89,7 +97,7 @@ proc normalizePath*(path: string; dirSep = DirSep): string = ## ## - Turns multiple slashes into single slashes. ## - Resolves '/foo/../bar' to '/bar'. - ## - Removes './' from the path. + ## - Removes './' from the path (but "foo/.." becomes ".") result = newStringOfCap(path.len) var state = 0 addNormalizePath(path, result, state, dirSep) |