open Format open Config let set_index_type = function | "default" -> text_index_type := 0 | "swcsa" -> text_index_type := 1 | "rlcsa" -> text_index_type := 2 | s -> raise (Arg.Bad(s)) let usage_msg = Printf.sprintf "%s [options] 'query' [output]" Sys.argv.(0) let pos = ref 0 let anon_fun = fun s -> match !pos with | 0 -> input_file:= s;incr pos | 1 -> query := s; incr pos | 2 -> output_file := Some s; incr pos | _ -> raise (Arg.Bad(s)) let set_logger s = List.iter (fun t -> if t = "" then () else match Utils.String.explode t ':' with [ tr; lvl ] -> let l = try int_of_string lvl with _ -> raise (Arg.Bad (lvl)) in if Logger.is_logger tr then Logger.activate tr l else raise (Arg.Bad (t)) | _ -> raise (Arg.Bad (t)) ) (Utils.String.explode s ',') let pretty_loggers () = ignore(flush_str_formatter()); Pretty.print_list ~sep:", " (fun f s -> fprintf f "%s" s) str_formatter (Logger.available ()); flush_str_formatter () let spec = Arg.align [ "-c", Arg.Set(count_only), " counting only (don't materialize the result set)"; "-two", Arg.Set(twopass), " Use twopass algorithm"; "-f", Arg.Set_int(sample_factor), " sample factor [default=64]"; "-ne", Arg.Clear(index_empty_texts), " don't index empty texts [default=index]"; "-d", Arg.Set(disable_text_collection), " disable text collection[default=false]"; "-s", Arg.Set_string(save_file), " save the intermediate representation into file.srx"; "-b", Arg.Set(bottom_up), " real bottom up run"; "-nj", Arg.Set(no_jump), " disable jumping"; "-nc", Arg.Set(no_cache), " disable caching"; "-nw", Arg.Set(no_wrap_results), " do not wrap results in "; "-p", Arg.Set(do_perf), " dump perf counters (Linux only)"; "-index-type", Arg.Symbol ([ "default"; "swcsa"; "rlcsa" ], set_index_type), " choose text index type"; "-r", Arg.Set_int(repeat), " repeat query execution n time (benchmarking only, default 1)"; "-doc-stats", Arg.Set(docstats), " Compute document statistics (performs full traversal)"; "-v", Arg.Set(verbose), " verbose mode"; ] @ IFNDEF NTRACE THEN [ "-log", Arg.String (set_logger), " enable logging with the specified level. Valid loggers are: " ^ (pretty_loggers ()) ] ELSE [] END let real_spec = spec @ [ "-", Arg.Unit (fun () -> anon_fun "-"), ""; ] let parse_cmdline() = let _ = try Arg.parse_argv Sys.argv real_spec anon_fun usage_msg; if (!pos > 3 || !pos < 2) then raise (Arg.Bad "Invalid number of arguments") with Arg.Bad s | Arg.Help s -> eprintf "%s\n" (Arg.usage_string spec usage_msg); exit 1 in Logger.set_verbose !verbose