X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fcomponents%2Fbinaries%2Fxoa%2Fxoa.ml;h=219b906605327240452fba5c3638e34e2dc482b1;hb=040c8158f327a3091c45295e91aaed2dedc137cb;hp=de451f8148f9e17c0a64cd12dc3fdbc6e19d29f1;hpb=81cf2dd18ed76a214ab610447d0c5861998b3d96;p=helm.git diff --git a/matita/components/binaries/xoa/xoa.ml b/matita/components/binaries/xoa/xoa.ml index de451f814..219b90660 100644 --- a/matita/components/binaries/xoa/xoa.ml +++ b/matita/components/binaries/xoa/xoa.ml @@ -9,31 +9,77 @@ \ / This software is distributed as is, NO WARRANTY. V_______________________________________________________________ *) -module R = Helm_registry +module R = Helm_registry module L = Lib module A = Ast -module E = Engine +module E = Engine + +let incremental = ref true +let separate = ref false + +let clear () = + incremental := true; + separate := false; + R.clear () let unm_ex s = Scanf.sscanf s "%u %u" A.mk_exists let unm_or s = - Scanf.sscanf s "%u" A.mk_or + Scanf.sscanf s "%u" A.mk_or let unm_and s = - Scanf.sscanf s "%u" A.mk_and + Scanf.sscanf s "%u" A.mk_and -let process conf = +let process_centralized conf = + let preamble = L.get_preamble conf in + if R.has "xoa.objects" && R.has "xoa.notations" then begin + let ooch = L.open_out preamble (R.get_string "xoa.objects") in + let noch = L.open_out preamble (R.get_string "xoa.notations") in + List.iter (L.out_include ooch) (R.get_list R.string "xoa.include"); + L.out_include ooch (R.get_string "xoa.notations" ^ ".ma"); + List.iter (E.generate ooch noch) (R.get_list unm_ex "xoa.ex"); + List.iter (E.generate ooch noch) (R.get_list unm_or "xoa.or"); + List.iter (E.generate ooch noch) (R.get_list unm_and "xoa.and"); + close_out noch; close_out ooch + end + +let generate (p, o, n) = function + | A.Exists (c, v) as d -> + let oname = Printf.sprintf "%s/ex_%u_%u" o c v in + let nname = Printf.sprintf "%s/ex_%u_%u" n c v in + if !incremental && L.exists_out oname && L.exists_out nname then () else + begin + let ooch = L.open_out p oname in + let noch = L.open_out p nname in + List.iter (L.out_include ooch) (R.get_list R.string "xoa.include"); + L.out_include ooch (nname ^ ".ma"); + E.generate ooch noch d; + close_out noch; close_out ooch + end + | A.Or c -> () + | A.And c -> () + +let process_distributed conf = let preamble = L.get_preamble conf in - let ooch = L.open_out preamble (R.get_string "xoa.objects") in - let noch = L.open_out preamble (R.get_string "xoa.notations") in - List.iter (L.out_include ooch) (R.get_list R.string "xoa.include"); - List.iter (E.generate ooch noch) (R.get_list unm_ex "xoa.ex"); - List.iter (E.generate ooch noch) (R.get_list unm_or "xoa.or"); - List.iter (E.generate ooch noch) (R.get_list unm_and "xoa.and"); - close_out noch; close_out ooch + if R.has "xoa.objects" && R.has "xoa.notations" then begin + let st = preamble, R.get_string "xoa.objects", R.get_string "xoa.notations" in + List.iter (generate st) (R.get_list unm_ex "xoa.ex"); + List.iter (generate st) (R.get_list unm_or "xoa.or"); + List.iter (generate st) (R.get_list unm_and "xoa.and"); + end + +let process conf = + if !separate then process_distributed conf else process_centralized conf let _ = - let help = "Usage: xoa [ ]*\n" in - Arg.parse [] process help + let help = "Usage: xoa [ -Xs | ]*\n" in + let help_X = " Clear configuration" in + let help_s = " Generate separate objects" in + let help_u = " Update existing separate files" in + Arg.parse [ + "-X", Arg.Unit clear, help_X; + "-s", Arg.Set separate, help_s; + "-u", Arg.Clear incremental, help_u; + ] process help