Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file file.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213moduleLowLevel=struct(** delete a directory that may contain files *)letrmdirdir=Array.iter(funx->Sys.remove(Filename.concatdirx))(Sys.readdirdir);Unix.rmdirdir(** copy a file to another *)letcopysrcdest=letcin=open_insrcandcout=open_outdestandbuff=Bytes.make1024' 'andn=ref0inwhilen:=inputcinbuff01024;!n<>0dooutputcoutbuff0!ndone;close_incin;close_outcout(** rename a file *)letmovesrcdest=tryUnix.renamesrcdestwithUnix.Unix_error(Unix.EXDEV,_,_)->copysrcdestletread_fromfnf=letc=open_infninletr=fcinclose_inc;rletwrite_tofilenamef=letchan=open_outfilenameinletr=fchaninclose_outchan;rletwrite_to_formattedfilenamef=write_tofilename(funchan->letfmt=Format.formatter_of_out_channelchaninletr=ffmtinFormat.fprintffmt"@?";r)letexists=Sys.file_existsletrm=Sys.removeend(* Filename.dir_sep in Ocaml >= 3.11.2 *)letdir_sep=matchSys.os_typewith|"Cygwin"|"Unix"->'/'|"Win32"->'\\'|_->assertfalseletdir_sep_string=String.make1dir_sepmoduleDir=structtypet={dirs:stringlist;is_relative:bool}(* the type t is a stack of directories, innermost is on top *)letprint_sepfmt()=Format.pp_print_charfmtdir_sepletto_strings=letprefix=ifs.is_relativethen""else"/"inMisc.sprintf"%s%a"prefix(Misc.print_listprint_sepFormat.pp_print_string)(List.revs.dirs)letreceat_dirsep_backis=ifs.[i]=dir_septheneat_dirsep_back(i-1)selseiletreceat_dirsep_forwis=ifs.[i]=dir_septheneat_dirsep_forw(i+1)selseiletsplit_seps=letl=String.lengthsinifl=0then[]elseletrecauxacci=leti=eat_dirsep_forwisintryletj=String.index_fromsidir_sepinletdir=String.subsi(j-i)inletacc=dir::accinifj=l-1thenaccelseauxacc(j+1)withNot_found->letj=eat_dirsep_back(l-1)sinString.subsi(j-i+1)::accinaux[]0letfrom_strings=letf={dirs=split_seps;is_relative=Filename.is_relatives}infletconcatd1d2=assertd2.is_relative;{d1withdirs=d2.dirs@d1.dirs}lettemp=from_string(Filename.get_temp_dir_name())letmktrights=Unix.mkdir(to_stringt)rightsletcht=Sys.chdir(to_stringt)letcwd()=from_string(Sys.getcwd())letempty={dirs=[];is_relative=true}letrmd=LowLevel.rmdir(to_stringd)letcompare=Stdlib.compare(* this one is actually difficult ... for now we just compare the elements
*)endtypet={dir:Dir.t;bn:string;ext:stringoption}letdirt=t.dirletextensiont=matcht.extwithSomes->s|None->""letbasenamet=t.bnletfile_to_stringbnext=matchextwithNone->bn|Someext->Misc.sprintf"%s.%s"bnextletto_stringt=letdir=Dir.to_stringt.dirinletsep=ifString.lengthdir<>0&&dir.[String.lengthdir-1]<>'/'then"/"else""inMisc.sprintf"%s%s%s"(Dir.to_stringt.dir)sep(file_to_stringt.bnt.ext)letdebug_to_stringt=Misc.sprintf"(%s,%s,%s)"(Dir.to_stringt.dir)t.bn(extensiont)letsplit_exts=letl=String.lengthsinifs.[l-1]='.'||s.[l-1]=dir_septhen(s,None)elsetryleti=String.rindex_froms(l-1)'.'in(String.subs0i,Some(String.subs(i+1)(l-i-1)))withNot_found->(s,None)letfrom_strings=letd=Dir.from_stringsinmatchd.Dir.dirswith|[]->{dir=d;bn="";ext=None}|fn::dirs->letbn,ext=split_extfnin{dir={Dir.dirs;is_relative=d.Dir.is_relative};bn;ext}letplacedt={twithdir=d}letconcatdt={twithdir=Dir.concatdt.dir}letappendts={twithbn=t.bn^s}letprependts={twithbn=s^t.bn}letset_extts=letext=ifs=""thenNoneelseSomesin{twithext}letclear_dirt={twithdir=Dir.empty}letcompareab=letc=Stdlib.comparea.bnb.bninifc<>0thencelseletc=Stdlib.comparea.extb.extinifc<>0thencelseDir.comparea.dirb.dirmoduleMap=Map.Make(structtypet'=ttypet=t'letcompare=compareend)(** wrappers for low level functions *)letmoveab=LowLevel.move(to_stringa)(to_stringb)letcopyab=LowLevel.copy(to_stringa)(to_stringb)letread_fromtf=LowLevel.read_from(to_stringt)fletwrite_totf=LowLevel.write_to(to_stringt)fletwrite_to_formattedtf=LowLevel.write_to_formatted(to_stringt)fletexistst=LowLevel.exists(to_stringt)letrmt=LowLevel.rm(to_stringt)letopen_outt=open_out(to_stringt)letopen_int=open_in(to_stringt)letopen_in_genfit=open_in_genfi(to_stringt)letmk?(dir=Dir.empty)bnext=letext=ifext=""thenNoneelseSomeextin{dir;bn;ext}