File: bdump.ml

package info (click to toggle)
biniou 1.0.12-2
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 216 kB
  • sloc: ml: 1,808; makefile: 175
file content (74 lines) | stat: -rw-r--r-- 2,117 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
open Printf

let () =
  let file = ref None in
  let dic = ref [] in
  let dic_file = ref (Bi_dump.default_dict_path ()) in
  let use_global_dictionary = ref true in
  let options = [
    "-d", Arg.String (fun s -> dic := Bi_dump.load_lines !dic s),
    "file
          File containing words to add to the dictionary, one per line";

    "-h", Arg.String (fun s -> dic_file := Some s),
    "file
          Location of the dictionary used for unhashing.
          Default: $HOME/.bdump-dict on Unix,
                   $HOMEPATH\\_bdump-dict on Windows";

    "-w", Arg.String (fun s -> dic := List.rev_append (Bi_dump.split s) !dic),
    "word1,word2,...
          Comma-separated list of words to add to the dictionary";

    "-x", Arg.Clear use_global_dictionary,
    sprintf "
          Do not load nor update the dictionary used for name
          unhashing.";
  ]
  in
  let msg = sprintf "Usage: %s [file] [options]" Sys.argv.(0) in
  let error () =
    Arg.usage options msg in
  let set_file s =
    match !file with
	None -> file := Some s
      | Some _ -> error ()
  in
  Arg.parse options set_file msg;

  if !use_global_dictionary then (
    let must_save = !dic <> [] in
    dic := Bi_dump.load_dictionary !dic_file !dic;
    if must_save then
      Bi_dump.save_dictionary !dic_file !dic
  );

  let unhash = Bi_io.make_unhash !dic in
  let ic =
    match !file with
	None -> stdin
      | Some s -> open_in_bin s
  in
  let inbuf = Bi_inbuf.from_string (Bi_dump.load ic) in
  let value_count = ref 0 in
  Printexc.record_backtrace true;
  (try
    while true do
      (try ignore (Bi_inbuf.peek inbuf)
       with Bi_inbuf.End_of_input -> raise Exit);
      Bi_io.print_view_of_tree (Bi_io.read_tree ~unhash inbuf);
      print_newline ();
      incr value_count;
    done;
   with
       Exit -> ()
     | e ->
         Printf.eprintf "Broken input after reading %i value%s: \
                         exception %s\n"
           !value_count (if !value_count > 1 then "s" else "")
           (Printexc.to_string e);
         Printexc.print_backtrace stderr;
         flush stderr
  );

  close_in ic