(* Copyright (C) 2000, HELM Team. * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://cs.unibo.it/helm/. *) exception IllFormedUri of string Lazy.t type spec = | Decl | Def | Fix of int * int (* fixno, recparamno *) | CoFix of int | Ind of int | Con of int * int (* indtyno, constrno *) type uri = Uri of int * string * spec let eq = (==);; let string_of_uri (Uri (_,s,_)) = s;; module OrderedStrings = struct type t = string let compare (s1 : t) (s2 : t) = compare s1 s2 end ;; module MapStringsToUri = Map.Make(OrderedStrings);; let set_of_uri = ref MapStringsToUri.empty;; (* '.' not allowed in path and foo * * Decl cic:/path/foo.dec * Def cic:/path/foo.def * Fix of int * int cic:/path/foo.fix(i,j) * CoFix of int cic:/path/foo.cfx(i) * Ind of int cic:/path/foo.ind(i) * Con of int * int cic:/path/foo.con(i,j) *) let uri_of_string = let counter = ref 0 in let c () = incr counter; !counter in let get2 s dot = let comma = String.rindex s ',' in let i = int_of_string (String.sub s (dot+5) (comma-dot-5)) in let j = int_of_string (String.sub s (comma+1) (String.length s-comma-2)) in i,j in let get1 s dot = let i = int_of_string (String.sub s (dot+5) (String.length s-1)) in i in fun s -> try MapStringsToUri.find s !set_of_uri with Not_found -> let new_uri = try let dot = String.rindex s '.' in let suffix = String.sub s (dot+1) 3 in match suffix with | "dec" -> Uri (c (), s, Decl) | "def" -> Uri (c (), s, Def) | "fix" -> let i,j = get2 s dot in Uri (c (), s, Fix (i,j)) | "cfx" -> let i = get1 s dot in Uri (c (), s, CoFix (i)) | "ind" -> let i = get1 s dot in Uri (c (), s, Ind (i)) | "con" -> let i,j = get2 s dot in Uri (c (), s, Con (i,j)) | _ -> raise Not_found with Not_found -> raise (IllFormedUri (lazy s)) in set_of_uri := MapStringsToUri.add s new_uri !set_of_uri; new_uri ;; let nuri_of_ouri u indinfo = uri_of_string (string_of_uri (Uri(0,UriManager.string_of_uri u,indinfo))) ;; let ouri_of_nuri u = UriManager.uri_of_string (string_of_uri u) ;;