X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Ftatoo.ml;h=ca79411bc66358b451ec7012088d2e67446c999b;hp=1b8c17d999f1ff09647ff257a0bce80206eb6169;hb=969febf12344a3fe3bf793a323b2e88f7b20ebae;hpb=b00bff88c7902e828804c06b7f9dc55222fdc84e diff --git a/src/tatoo.ml b/src/tatoo.ml index 1b8c17d..ca79411 100644 --- a/src/tatoo.ml +++ b/src/tatoo.ml @@ -14,39 +14,73 @@ (***********************************************************************) (* - Time-stamp: + Time-stamp: *) -let doc = - let fd = open_in Sys.argv.(1) in - let d = Naive_tree.load_xml_file fd in - close_in fd; d +open Format +let time f arg msg = + let t1 = Unix.gettimeofday () in + let r = f arg in + let t2 = Unix.gettimeofday () in + let time = (t2 -. t1) *. 1000. in + Logger.msg `STATS "%s: %fms" msg time; + r -let query = - let arg2 = Sys.argv.(2) in - Xpath.Parser.parse (Ulexing.from_latin1_string arg2) -let auto = - Xpath.Compile.path query +let main () = + let () = Options.parse () in + let doc = + let fd = open_in !Options.input_file in + let d = time Naive_tree.load_xml_file fd "parsing xml document" in + close_in fd; d + in + let query = + time + Xpath.Parser.parse + (Ulexing.from_latin1_string !Options.query) + "parsing XPath query" + in + let auto = + time Xpath.Compile.path query "compiling XPath query" + in + let output = + match !Options.output_file with + | None | Some "-" | Some "/dev/stdout" -> stdout + | Some f -> open_out f + in + if !Options.stats then begin + Logger.msg `STATS "Query: %a " Xpath.Ast.print_path query; + Logger.msg `STATS "@[Automaton: @\n%a@]" Ata.print auto; + end; + + let module Naive = Eval.Make(Naive_tree) in + let results = + time (Naive.eval auto doc) (Naive_tree.root doc) "evaluating query" + in + time (fun () -> + output_string output "\n"; + if !Options.count then begin + output_string output (string_of_int (List.length results)); + output_char output '\n'; + end else + List.iter (fun n -> + Naive_tree.print_xml output doc n; + output_char output '\n' + ) results; + output_string output "\n"; + flush output; + if output != stdout then close_out output + +) () "serializing results" -open Format let () = - fprintf err_formatter "Query: %a\n%!" Xpath.Ast.print_path query; - fprintf err_formatter "Automata: %a\n%!" Ata.print auto; - fprintf err_formatter "Evaluating automaton:\n%!"; - let module Naive = Eval.Make(Naive_tree) in - let t1 = Unix.gettimeofday() in - let results = Naive.eval auto doc (Naive_tree.root doc) in - let teval = (Unix.gettimeofday () -. t1) *. 1000. in - let t1 = Unix.gettimeofday () in - output_string stdout "\n"; - List.iter (fun n -> - Naive_tree.print_xml stdout doc n; - output_char stdout '\n' - ) results; - output_string stdout "\n"; - let tprint = (Unix.gettimeofday () -. t1) *. 1000. in - flush stdout; - fprintf err_formatter "evaluation time: %fms\nserialization time: %fms\n%!" teval tprint + try + main () + with + Arg.Bad msg -> eprintf "Error: %s\n%!" msg; Options.usage (); exit 1 + | Sys_error msg -> eprintf "Error: %s\n%!" msg; exit 2 + | Tree.Parse_error msg -> eprintf "Error: file %s, %s\n%!" !Options.input_file msg; exit 3 + | Xpath.Ulexer.Error (s, e, msg) -> eprintf "Error: character %i-%i: %s\n%!" s e msg; exit 4 + | e -> eprintf "FATAL ERROR: %s\n%!" (Printexc.to_string e); exit 128