let normalize_path s =
let s = Str.global_replace (Str.regexp "//") "/" s in
let l = Str.split (Str.regexp "/") s in
- let rec aux = function
- | [] -> []
- | he::".."::tl -> aux tl
- | he::"."::tl -> aux (he::tl)
- | he::tl -> he :: aux tl
+ let rec aux acc = function
+ | [] -> acc
+ | he::"."::tl -> aux acc (he::tl)
+ | he::".."::tl when he <> ".." -> aux [] (acc @ tl)
+ | he::tl -> aux (acc@[he]) tl
in
(if Str.string_match (Str.regexp "^/") s 0 then "/" else "") ^
- String.concat "/" (aux l)
+ String.concat "/" (aux [] l)
^ (if Str.string_match (Str.regexp "/$") s 0 then "/" else "")
;;
try
if (Unix.stat path).Unix.st_kind = Unix.S_REG then path
else aux tl
- with Unix.Unix_error _ -> aux tl
+ with Unix.Unix_error _ as exn ->
+ aux tl
in
try
aux paths