struct
let current_dir_name = "."
let parent_dir_name = ".."
let dir_sep = "\\"
let is_dir_sep s i = let c = s.[i] in c = '/' || c = '\\' || c = ':'
let rindex_dir_sep s =
let rec pos i =
if i < 0 then raise Not_found
else if is_dir_sep s i then i
else pos (i - 1)
in pos (String.length s - 1)
let is_relative n =
(String.length n < 1 || n.[0] <> '/')
&& (String.length n < 1 || n.[0] <> '\\')
&& (String.length n < 2 || n.[1] <> ':')
let is_implicit n =
is_relative n
&& (String.length n < 2 || String.sub n 0 2 <> "./")
&& (String.length n < 2 || String.sub n 0 2 <> ".\\")
&& (String.length n < 3 || String.sub n 0 3 <> "../")
&& (String.length n < 3 || String.sub n 0 3 <> "..\\")
let check_suffix name suff =
String.length name >= String.length suff &&
(let s = String.sub name (String.length name - String.length suff)
(String.length suff) in
String.lowercase s = String.lowercase suff)
let temp_dir_name =
try Sys.getenv "TEMP" with Not_found -> "."
let quote s =
let l = String.length s in
let b = Buffer.create (l + 20) in
Buffer.add_char b '\"';
let rec loop i =
if i = l then Buffer.add_char b '\"' else
match s.[i] with
| '\"' -> loop_bs 0 i;
| '\\' -> loop_bs 0 i;
| c -> Buffer.add_char b c; loop (i+1);
and loop_bs n i =
if i = l then begin
Buffer.add_char b '\"';
add_bs n;
end else begin
match s.[i] with
| '\"' -> add_bs (2*n+1); Buffer.add_char b '\"'; loop (i+1);
| '\\' -> loop_bs (n+1) (i+1);
| _c -> add_bs n; loop i
end
and add_bs n = for j = 1 to n do Buffer.add_char b '\\'; done
in
loop 0;
Buffer.contents b
let has_drive s =
let is_letter = function
| 'A' .. 'Z' | 'a' .. 'z' -> true
| _ -> false
in
String.length s >= 2 && is_letter s.[0] && s.[1] = ':'
let drive_and_path s =
if has_drive s
then (String.sub s 0 2, String.sub s 2 (String.length s - 2))
else ("", s)
let dirname s =
let (drive, path) = drive_and_path s in
let dir = generic_dirname rindex_dir_sep current_dir_name dir_sep path in
drive ^ dir
let basename s =
let (_drive, path) = drive_and_path s in
generic_basename rindex_dir_sep current_dir_name path
end