Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file Datalog_unix.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177(* this file is part of datalog. See README for the license *)(** {1 Unix Interpreted Predicates} *)moduleTopDown=Datalog_top_downmoduletypeS=sigmoduleTD:TopDown.Svalsetup_handlers:TD.DB.t->unitend(* main constructor *)moduleMake(TD:TopDown.S)=structmoduleTD=TDmoduleT=TD.TmoduleC=TD.Cletc2str=TD.Const.to_stringletstr2c=TD.Const.of_stringletstr_split~bys=letrecnextaccij=ifi=String.lengthsthenifi>jthenString.subsj(i-j)::accelseaccelseifs.[i]=bythennext(String.subsj(i-j-1)::acc)(i+1)(i+1)elsenextacc(i+1)jinnext[]00(* list files in directory *)let_ls=function|T.Apply(head,[|T.Apply(path,[||])aslit1;_|])->begintryletl=ref[]inletpath=String.trim(c2strpath)inletd=Unix.opendirpathinletrecnext()=letcont=trylets=Unix.readdirdinl:=s::!l;truewithEnd_of_file->falseinifcontthennext()innext();List.map(funf->letf=Filename.concatpathfinlett=T.mk_applyhead[|lit1;T.mk_const(str2cf)|]inC.mk_factt)!lwith_e->[]end|_->[]let_statlit=matchlitwith|T.Apply(head,[|T.Apply(path,[||])ast1;_|])->begintryletpath=String.trim(c2strpath)inletstat=Unix.lstatpathinletkind=matchstat.Unix.st_kindwith|Unix.S_LNK->"link"|Unix.S_BLK->"block"|Unix.S_DIR->"dir"|Unix.S_FIFO->"fifo"|Unix.S_REG->"file"|Unix.S_SOCK->"socket"|_->raiseExitinletkind=T.mk_const(str2ckind)in[C.mk_fact(T.mk_applyhead[|t1;kind|])]withUnix.Unix_error_|Exit->[]end|_->[]let_isDirlit=matchlitwith|T.Apply(_,[|T.Apply(path,[||])|])->begintryletpath=String.trim(c2strpath)inletstat=Unix.lstatpathinletok=matchstat.Unix.st_kindwith|Unix.S_DIR->true|_->falseinifokthen[C.mk_factlit]else[]withUnix.Unix_error_->[]end|_->[]let_isFilelit=matchlitwith|T.Apply(_,[|T.Apply(path,[||])|])->begintryletpath=String.trim(c2strpath)inletstat=Unix.lstatpathinletok=matchstat.Unix.st_kindwith|Unix.S_REG->true|_->falseinifokthen[C.mk_factlit]else[]withUnix.Unix_error_->[]end|_->[]let_isLinklit=matchlitwith|T.Apply(_,[|T.Apply(path,[||])|])->begintryletpath=String.trim(c2strpath)inletstat=Unix.lstatpathinletok=matchstat.Unix.st_kindwith|Unix.S_LNK->true|_->falseinifokthen[C.mk_factlit]else[]withUnix.Unix_error_->[]end|_->[]let_getenvlit=matchlitwith|T.Apply(head,[|T.Apply(var,[||])ast1;_|])->begintryletv=str2c(Unix.getenv(c2strvar))inlett=T.mk_applyhead[|t1;T.mk_constv|]in[C.mk_factt]withNot_found->[]end|_->[]let_splitlit=matchlitwith|T.Apply(head,[|T.Apply(s,[||])ast1;T.Apply(by,[||])ast2;_|])->letby=c2strbyinlets=c2strsinifString.lengthby=1thenletl=str_split~by:by.[0]sinList.map(funtok->C.mk_fact(T.mk_applyhead[|t1;t2;T.mk_const(str2ctok)|]))lelse[]|_->[]let_time=function|T.Apply(head,[|_|])->letf=Unix.time()inletf=str2c(string_of_floatf)in[C.mk_fact(T.mk_applyhead[|T.mk_constf|])]|_->[]lethandlers=[str2c"ls","ls(path, file): lists files in path",_ls;str2c"stat","stat(path,X): binds X to the kind of file path is",_stat;str2c"isDir","isDir(path): true if the path is a directory",_isDir;str2c"isFile","isFile(path): true if the path is a proper file",_isFile;str2c"isLink","isLink(path): true if the path is a symbolic link",_isLink;str2c"getenv","getenv(v,X): binds X to the environment variable v",_getenv;str2c"split","split(str,by,X): binds X to sustrings of str delimited by by",_split;str2c"time","time(T): binds T to the current time",_time]letsetup_handlersdb=TD.DB.interpret_listdbhandlersendmoduleDefault=Make(TopDown.Default)