-exception UnableToQualify
+exception NoRootFor of string
let find_root path =
let paths = List.rev (Str.split (Str.regexp "/") path) in
| [] -> ["/"]
in
let paths = List.map HExtlib.normalize_path (build paths) in
- HExtlib.find_in paths "root"
+ try HExtlib.find_in paths "root"
+ with Failure "find_in" -> raise (NoRootFor path)
;;
-let is_prefix_of d1 d2 =
- let len1 = String.length d1 in
- let len2 = String.length d2 in
- if len2 < len1 then
- false
- else
- let pref = String.sub d2 0 len1 in
- pref = d1 && (len1 = len2 || d2.[len1] = '/')
-;;
-
let ensure_trailing_slash s =
if s = "" then "/" else
if s.[String.length s-1] <> '/' then s^"/" else s
if s.[len-1] = '/' then String.sub s 0 (len-1) else s
;;
+let parse_root rootpath =
+ let data = HExtlib.input_file rootpath in
+ let lines = Str.split (Str.regexp "\n") data in
+ List.map
+ (fun l ->
+ match Str.split (Str.regexp "=") l with
+ | [k;v] -> Pcre.replace ~pat:" " k, Pcre.replace ~pat:" " v
+ | _ -> raise (Failure ("Malformed root file: " ^ rootpath)))
+ lines
+;;
+
+
let find_root_for ~include_paths file =
let include_paths = "" :: Sys.getcwd () :: include_paths in
let path = HExtlib.find_in include_paths file in
try
let mburi = Helm_registry.get "matita.baseuri" in
match Str.split (Str.regexp " ") mburi with
- | [root; buri] when is_prefix_of root path -> ":registry:", root, buri
+ | [root; buri] when HExtlib.is_prefix_of root path ->
+ ":registry:", root, buri
| _ -> raise (Helm_registry.Key_not_found "matita.baseuri")
with Helm_registry.Key_not_found "matita.baseuri" ->
let rootpath = find_root path in
- let data = HExtlib.input_file rootpath in
- let buri =
- let lines = Str.split (Str.regexp "\n") data in
- let lines =
- List.map (fun l ->
- match Str.split (Str.regexp "=") l with
- | [k;v] -> Pcre.replace ~pat:" " k, Pcre.replace ~pat:" " v
- | _ -> raise (Failure ("Malformed root file: " ^ rootpath)))
- lines
- in
- List.assoc "baseuri" lines
- in
+ let buri = List.assoc "baseuri" (parse_root rootpath) in
rootpath, Filename.dirname rootpath, buri
in
(* HLog.debug ("file "^file^" rooted by "^rootpath^""); *)
ensure_trailing_slash root, remove_trailing_slash uri, path
;;
-let filename () =
- try
- Helm_registry.get "matita.filename"
- with Helm_registry.Key_not_found "matita.filename" ->
- try
- match Helm_registry.get_list Helm_registry.string "matita.args" with
- | [x] ->
- HLog.warn ("Using matita.args as filename: "^x);
- Helm_registry.set "matita.filename" x;
- x
- | _ -> raise (Failure "no (or more than one) filename to compile")
- with Helm_registry.Key_not_found "matita.filename" ->
- raise (Failure "Unable to get current file name")
-;;
-
let baseuri_of_script ?(include_paths=[]) file =
let root, buri, path = find_root_for ~include_paths file in
let path = HExtlib.normalize_path path in
match l1, l2 with
| h1::tl1,h2::tl2 when h1 = h2 -> substract tl1 tl2
| l,[] -> l
- | _ -> raise UnableToQualify
+ | _ -> raise (NoRootFor file)
in
let extra_buri = substract lpath lroot in
let chop name =
try Filename.chop_extension name
with Invalid_argument "Filename.chop_extension" -> name
in
+ let extra = String.concat "/" extra_buri in
root,
remove_trailing_slash (HExtlib.normalize_path
- (buri ^ "/" ^ chop (String.concat "/" extra_buri))),
- path
+ (buri ^ "/" ^ chop extra)),
+ path,
+ extra
;;
let find_roots_in_dir dir =