]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/urimanager/uriManager.ml
andrea.ma removed (superseded by match.ma)
[helm.git] / helm / ocaml / urimanager / uriManager.ml
index 39d058b5e54c0f749a7606150f6ddfc004eb7d73..0697fb73b9a32a50d8961ba48a2237201cac2c5b 100644 (file)
  * http://cs.unibo.it/helm/.
  *)
 
-(* "cic:/a/b/c.con" => [| "cic:/a" ; "cic:/a/b" ; "cic:/a/b/c.con" ; "c" |] *)
+(*
+* "cic:/a/b/c.con" => [| "cic:/a" ; "cic:/a/b" ; "cic:/a/b/c.con" ; "c"; "" |]
+* "cic:/a/b/c.ind#xpointer(1/1)" =>
+*   [| "cic:/a" ; "cic:/a/b" ; "cic:/a/b/c.con" ; "c"; "#xpointer(1/1)" |]
+* "cic:/a/b/c.ind#xpointer(1/1/1)" =>
+*   [| "cic:/a" ; "cic:/a/b" ; "cic:/a/b/c.con" ; "c"; "#xpointer(1/1/1)" |]
+*)
 type uri = string array;;
 
 let eq uri1 uri2 =
- uri1 == uri2
+  uri1 == uri2 
 ;;
 
-let string_of_uri uri = uri.(Array.length uri - 2);;
-let name_of_uri uri = uri.(Array.length uri - 1);;
-let buri_of_uri uri = uri.(Array.length uri - 3);;
-let depth_of_uri uri = Array.length uri - 2;;
+let string_of_uri uri =
+  match  uri.(Array.length uri - 1) with
+  | "" -> 
+      uri.(Array.length uri - 3)
+  | _ -> 
+      String.concat "#" 
+        [ uri.(Array.length uri - 3); uri.(Array.length uri - 1) ]
+
+let name_of_uri uri = uri.(Array.length uri - 2);;
+let buri_of_uri uri = uri.(Array.length uri - 4);;
+let depth_of_uri uri = Array.length uri - 3;;
 
 module OrderedStrings =
  struct
@@ -50,6 +63,24 @@ module SetOfStrings = Map.Make(OrderedStrings);;
 let set_of_uri = ref SetOfStrings.empty;;
 let set_of_prefixes = ref SetOfStrings.empty;;
 
+  
+(* hash conses an uri *)
+let add_to_uriset ?suri uri =
+  let lookup_suri suri =
+    try
+      SetOfStrings.find suri !set_of_uri
+    with Not_found -> assert false
+  in
+  let suri = 
+    match suri with 
+    | None -> string_of_uri uri
+    | Some suri -> suri 
+  in
+  if not(SetOfStrings.mem suri !set_of_uri) then
+    set_of_uri := SetOfStrings.add suri uri !set_of_uri;
+  lookup_suri suri  
+    
+
 (* similar to uri_of_string, but used for prefixes of uris *)
 let normalize prefix =
  try
@@ -62,7 +93,7 @@ let normalize prefix =
 
 exception IllFormedUri of string;;
 
-let mk_prefixes str =
+let mk_prefixes str xpointer =
  let rec aux curi =
   function
      [he] ->
@@ -81,19 +112,36 @@ let mk_prefixes str =
      with Failure "hd" | Failure "tl" ->
       raise (IllFormedUri str))
     in
-    aux ty sp
+    (aux ty sp) @ [xpointer]
+;;
+
+
+let sharp_rex = 
+  Str.regexp "#"
 ;;
 
 let uri_of_string str =
- try
-  SetOfStrings.find str !set_of_uri
- with
-  Not_found ->
-   let uri = Array.of_list (mk_prefixes str) in
-    set_of_uri := SetOfStrings.add str uri !set_of_uri ;
-    uri
+  let base, xpointer =
+    match Str.split sharp_rex str with
+    | [base] -> base,""
+    | [base; xpointer] -> base,xpointer 
+    | _ -> raise (IllFormedUri str)
+  in
+   try
+    SetOfStrings.find str !set_of_uri
+   with
+    Not_found ->
+      let uri = Array.of_list (mk_prefixes base xpointer) in
+      add_to_uriset ~suri:str uri
 ;;
 
+let strip_xpointer uri =
+  let stripped_uri = Array.copy uri in
+  stripped_uri.(Array.length uri - 1) <- "";  (* reset xpointer field *)
+  let suri = string_of_uri stripped_uri in
+  add_to_uriset ~suri stripped_uri
+
+  
 let cicuri_of_uri uri =
  let completeuri = string_of_uri uri in
   let newcompleteuri = 
@@ -104,8 +152,8 @@ let cicuri_of_uri uri =
     uri
    else
     let newuri = Array.copy uri in
-     newuri.(Array.length uri - 2) <- newcompleteuri ;
-     newuri
+     newuri.(Array.length uri - 3) <- newcompleteuri ;
+     add_to_uriset newuri
 ;;
 
 let annuri_of_uri uri =
@@ -114,8 +162,8 @@ let annuri_of_uri uri =
    uri
   else
    let newuri = Array.copy uri in
-    newuri.(Array.length uri - 2) <- completeuri ^ ".ann" ;
-    newuri
+    newuri.(Array.length uri - 3) <- completeuri ^ ".ann" ;
+    add_to_uriset newuri
 ;;
 
 let uri_is_annuri uri =
@@ -126,8 +174,8 @@ let bodyuri_of_uri uri =
  let struri = string_of_uri uri in
   if Str.string_match (Str.regexp ".*\\.con$") (string_of_uri uri) 0 then
    let newuri = Array.copy uri in
-    newuri.(Array.length uri - 2) <- struri ^ ".body" ;
-    Some newuri
+    newuri.(Array.length uri - 3) <- struri ^ ".body" ;
+    Some (add_to_uriset newuri)
   else
    None
 ;;
@@ -135,6 +183,30 @@ let bodyuri_of_uri uri =
 let innertypesuri_of_uri uri =
  let cicuri = cicuri_of_uri uri in
   let newuri = Array.copy cicuri in
-   newuri.(Array.length cicuri - 2) <- (string_of_uri cicuri) ^ ".types" ;
-   newuri
+   newuri.(Array.length cicuri - 3) <- (string_of_uri cicuri) ^ ".types" ;
+   add_to_uriset newuri
 ;;
+
+type uriref = uri * (int list)
+
+let string_of_uriref (uri, fi) =
+   let str = string_of_uri uri in
+   let xp t = "#xpointer(1/" ^ string_of_int (t + 1) in
+   match fi with
+      | []          -> str 
+      | [t]         -> str ^ xp t ^ ")" 
+      | t :: c :: _ -> str ^ xp t ^ "/" ^ string_of_int c ^ ")" 
+
+let compare u1 u2 =
+  let su1 = string_of_uri u1 in
+  let su2 = string_of_uri u2 in
+  Pervasives.compare su1 su2
+
+module OrderedUri =
+struct
+  type t = uri
+  let compare = compare (* the one above, not Pervasives.compare *)
+end
+
+module UriSet = Set.Make (OrderedUri)
+