X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2FmatitaEngine.ml;h=144250fb9b55e634312523693f15f1c309d8add5;hb=94188b0cbaff6340464d90cc13ee246ea7ec3284;hp=913ba87f6a835e8269bdd3973297ed7b81ddff03;hpb=894d518aa760c9f816ddb0dc2b3fa88e1fe20a94;p=helm.git diff --git a/matita/matita/matitaEngine.ml b/matita/matita/matitaEngine.ml index 913ba87f6..144250fb9 100644 --- a/matita/matita/matitaEngine.ml +++ b/matita/matita/matitaEngine.ml @@ -63,16 +63,39 @@ let clean_exit baseuri exn = raise (FailureCompiling (baseuri,exn)) ;; +let cut prefix s = + let lenp = String.length prefix in + let lens = String.length s in + assert (lens > lenp); + assert (String.sub s 0 lenp = prefix); + String.sub s lenp (lens-lenp) +;; + +let print_string = + let indent = ref 0 in + let print_string ~right_justify s = + let ss = + match right_justify with + None -> "" + | Some (ss,len_ss) -> + let i = 80 - !indent - len_ss - String.length s in + if i > 0 then String.make i ' ' ^ ss else ss + in + assert (!indent >=0); + print_string (String.make !indent ' ' ^ s ^ ss) in + fun enter ?right_justify s -> + if enter then (print_string ~right_justify s; incr indent) else (decr indent; print_string ~right_justify s) +;; -let pp_times fname rc big_bang big_bang_u big_bang_s = +let pp_times ss fname rc big_bang big_bang_u big_bang_s = if not (Helm_registry.get_bool "matita.verbose") then let { Unix.tms_utime = u ; Unix.tms_stime = s} = Unix.times () in let r = Unix.gettimeofday () -. big_bang in let u = u -. big_bang_u in let s = s -. big_bang_s in let extra = try Sys.getenv "BENCH_EXTRA_TEXT" with Not_found -> "" in - let rc,rcascii = - if rc then "OK","Ok" else "FAIL","Fail" in + let rc = + if rc then "OK" else "FAIL" in let times = let fmt t = let seconds = int_of_float t in @@ -83,20 +106,12 @@ let pp_times fname rc big_bang big_bang_u big_bang_s = in Printf.sprintf "%s %s %s" (fmt r) (fmt u) (fmt s) in - let s = Printf.sprintf "%-4s %s %s" rc times extra in - print_endline s; + let s = Printf.sprintf "%-14s %s %s\n" rc times extra in + print_string false ~right_justify:(s,31) ss; flush stdout; HLog.message ("Compilation of "^Filename.basename fname^": "^rc) ;; -let cut prefix s = - let lenp = String.length prefix in - let lens = String.length s in - assert (lens > lenp); - assert (String.sub s 0 lenp = prefix); - String.sub s lenp (lens-lenp) -;; - let activate_extraction baseuri fname = () (* MATITA 1.0 @@ -159,6 +174,24 @@ let baseuri_of_script ~include_paths fname = raise (Failure ("File not found: "^fname)) ;; +(* given a path to a ma file inside the include_paths, returns the + new include_paths associated to that file *) +let read_include_paths ~include_paths file = + try + let root, _buri, _fname, _tgt = + Librarian.baseuri_of_script ~include_paths:[] file in + let includes = + try + Str.split (Str.regexp " ") + (List.assoc "include_paths" (Librarian.load_root_file (root^"/root"))) + with Not_found -> [] + in + let rc = root :: includes in + List.iter (HLog.debug) rc; rc + with Librarian.NoRootFor _ | Librarian.FileNotFound _ -> + [] +;; + let rec get_ast status ~compiling ~asserted ~include_paths strm = match GrafiteParser.parse_statement status strm with (GrafiteAst.Executable @@ -174,14 +207,14 @@ let rec get_ast status ~compiling ~asserted ~include_paths strm = and eval_from_stream ~compiling ~asserted ~include_paths ?do_heavy_checks status str cb = let matita_debug = Helm_registry.get_bool "matita.debug" in - let rec loop asserted status = - let asserted,stop,status = + let rec loop asserted status str = + let asserted,stop,status,str = try let cont = try Some (get_ast status ~compiling ~asserted ~include_paths str) with End_of_file -> None in match cont with - | None -> asserted, true, status + | None -> asserted, true, status, str | Some (asserted,ast) -> cb status ast; let new_statuses = @@ -191,15 +224,26 @@ and eval_from_stream ~compiling ~asserted ~include_paths ?do_heavy_checks status [s,None] -> s | _::(_,Some (_,value))::_ -> raise (TryingToAdd (lazy (GrafiteAstPp.pp_alias value))) - | _ -> assert false + | _ -> assert false in + (* CSC: complex patch to re-build the lexer since the tokens may + have changed. Note: this way we loose look-ahead tokens. + Hence the "include" command must be terminated (no look-ahead) *) + let str = + match ast with + (GrafiteAst.Executable + (_,GrafiteAst.NCommand + (_,(GrafiteAst.Include _ | GrafiteAst.Notation _)))) -> + GrafiteParser.parsable_statement status + (GrafiteParser.strm_of_parsable str) + | _ -> str in - asserted, false, status + asserted, false, status, str with exn when not matita_debug -> raise (EnrichedWithStatus (exn, status)) in - if stop then asserted,status else loop asserted status + if stop then asserted,status else loop asserted status str in - loop asserted status + loop asserted status str and compile ~compiling ~asserted ~include_paths fname = if List.mem fname compiling then raise (CircularDependency fname); @@ -216,6 +260,11 @@ and compile ~compiling ~asserted ~include_paths fname = Unix.times () in let time = Unix.time () in + let cc = + let rex = Str.regexp ".*opt$" in + if Str.string_match rex Sys.argv.(0) 0 then "matitac.opt" + else "matitac" in + let s = Printf.sprintf "%s %s" cc (cut (root^"/") fname) in try (* cleanup of previously compiled objects *) if (not (Http_getter_storage.is_empty ~local:true baseuri)) @@ -226,13 +275,7 @@ and compile ~compiling ~asserted ~include_paths fname = end; HLog.message ("compiling " ^ Filename.basename fname ^ " in " ^ baseuri); if not (Helm_registry.get_bool "matita.verbose") then - (let cc = - let rex = Str.regexp ".*opt$" in - if Str.string_match rex Sys.argv.(0) 0 then "matitac.opt" - else "matitac" - in - let s = Printf.sprintf "%s %-35s " cc (cut (root^"/") fname) in - print_string s; flush stdout); + (print_string true (s ^ "\n"); flush stdout); (* we dalay this error check until we print 'matitac file ' *) assert (Http_getter_storage.is_empty ~local:true baseuri); (* create dir for XML files *) @@ -268,7 +311,7 @@ and compile ~compiling ~asserted ~include_paths fname = in HLog.message (sprintf "execution of %s completed in %s." fname (hou^min^sec)); - pp_times fname true big_bang big_bang_u big_bang_s; + pp_times s fname true big_bang big_bang_u big_bang_s; asserted (* MATITA 1.0: debbo fare time_travel sulla ng_library? LexiconSync.time_travel @@ -280,14 +323,24 @@ and compile ~compiling ~asserted ~include_paths fname = (* MATITA 1.0: debbo fare time_travel sulla ng_library? LexiconSync.time_travel ~present:lexicon ~past:initial_lexicon_status; * *) - pp_times fname false big_bang big_bang_u big_bang_s; + pp_times s fname false big_bang big_bang_u big_bang_s; clean_exit baseuri exn and assert_ng ~already_included ~compiling ~asserted ~include_paths mapath = - let _,baseuri,fullmapath,_ = Librarian.baseuri_of_script ~include_paths mapath in + let root,baseuri,fullmapath,_ = + Librarian.baseuri_of_script ~include_paths mapath in if List.mem fullmapath asserted then asserted,false else begin + let include_paths = + let includes = + try + Str.split (Str.regexp " ") + (List.assoc "include_paths" (Librarian.load_root_file (root^"/root"))) + with Not_found -> [] + in + root::includes @ + Helm_registry.get_list Helm_registry.string "matita.includes" in let baseuri = NUri.uri_of_string baseuri in let ngtime_of baseuri = let ngpath = NCicLibrary.ng_path_of_baseuri baseuri in @@ -312,6 +365,8 @@ and assert_ng ~already_included ~compiling ~asserted ~include_paths mapath = in asserted, b || b1 || let _,baseuri,_,_ = + (*CSC: bug here? include_paths should be empty and + mapath should be absolute *) Librarian.baseuri_of_script ~include_paths mapath in let baseuri = NUri.uri_of_string baseuri in (match ngtime_of baseuri with