123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687(*********************************************************************************)(* Stog *)(* *)(* Copyright (C) 2012-2024 INRIA All rights reserved. *)(* Author: Maxence Guesdon, INRIA Saclay *)(* *)(* This program 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, version 3 of the License. *)(* *)(* This program 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 this program; if not, write to the Free Software *)(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA *)(* 02111-1307 USA *)(* *)(* As a special exception, you have permission to link this program *)(* with the OCaml compiler and distribute executables, as long as you *)(* follow the requirements of the GNU GPL in regard to all of the *)(* software in the executable aside from the OCaml compiler. *)(* *)(* Contact: Maxence.Guesdon@inria.fr *)(* *)(*********************************************************************************)(** *)exceptionInvalidofstringletinvalids=raise(Invalids);;typepath={path:stringlist;path_absolute:bool;}letpathpathpath_absolute={path;path_absolute};;letcompare=Stdlib.compare;;moduleOrdered=structtypet=pathletcompare=compareend;;moduleMap=Map.Make(Ordered)moduleSet=Set.Make(Ordered)letappendpl={pwithpath=p.path@l};;letchop_extensionpath=matchList.revpath.pathwith[]->None|s::q->trylets=Filename.chop_extensionsinSome{pathwithpath=List.rev(s::q)}withInvalid_argument_->(* no extension *)None;;letto_stringpath=Printf.sprintf"%s%s"(ifpath.path_absolutethen"/"else"")(String.concat"/"path.path)letof_strings=letlen=String.lengthsiniflen<=0thenfailwith(Printf.sprintf"Invalid path: %S"s);let(abs,s)=matchs.[0]with'/'->(true,String.subs1(len-1))|_->(false,s)in{path=Stog_base.Misc.split_strings['/'];path_absolute=abs;};;letparentp=assertp.path_absolute;matchList.revp.pathwith[]->p|_::q->{pwithpath=List.revq};;