let resolve_filename dir filename =
let rec cleanup check ok =
let right = Filename.basename check in
let left = Filename.dirname check in
if (right ="." && Filename.dirname left = left) then
Filename.concat left ok
else
match right with
| "." -> cleanup left ok
| ".." -> cleanup (Filename.dirname left) ok
| "" -> ok
| _ -> cleanup left (if ok ="" then right else Filename.concat right ok)
in
if Filename.is_relative filename then
cleanup (Filename.concat dir filename) ""
else
filename