X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Ftatoo.ml;h=6dc66efe22226ce38d9a775f9f2b7c4534840faa;hp=1b8c17d999f1ff09647ff257a0bce80206eb6169;hb=5b5dcd45cf86701ccfe917c1d6ad73b83bb523c3;hpb=f71defc62c481fe8a3a161d904790f3ca117a8cb diff --git a/src/tatoo.ml b/src/tatoo.ml index 1b8c17d..6dc66ef 100644 --- a/src/tatoo.ml +++ b/src/tatoo.ml @@ -14,39 +14,65 @@ (***********************************************************************) (* - 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 - - -let query = - let arg2 = Sys.argv.(2) in - Xpath.Parser.parse (Ulexing.from_latin1_string arg2) - -let auto = - Xpath.Compile.path query - 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 main () = + let () = Options.parse () in + let doc = + let fd = open_in !Options.input_file in + let d = Naive_tree.load_xml_file fd in + close_in fd; d + in + let query = + Xpath.Parser.parse (Ulexing.from_latin1_string !Options.query) + in + let auto = + Xpath.Compile.path 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 + fprintf err_formatter "@[STATS: Query: %a @]@." Xpath.Ast.print_path query; + fprintf err_formatter "@[STATS: @[Automaton: @\n"; + Ata.print err_formatter auto; + fprintf err_formatter "@]@]@."; + end; 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"; + 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"; let tprint = (Unix.gettimeofday () -. t1) *. 1000. in - flush stdout; - fprintf err_formatter "evaluation time: %fms\nserialization time: %fms\n%!" teval tprint + flush output; + if output != stdout then close_out output; + if !Options.stats then begin + fprintf err_formatter "@[STATS: evaluation time: %fms@]@." teval; + fprintf err_formatter "@[STATS: serialization time: %fms@]@." tprint + end + + +let () = + 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