File: print_sequences.ml

package info (click to toggle)
lambda-term 3.3.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,108 kB
  • sloc: ml: 14,981; ansic: 522; makefile: 32
file content (56 lines) | stat: -rw-r--r-- 1,308 bytes parent folder | download | duplicates (4)
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
(*
 * print_sequences.ml
 * ------------------
 * Copyright : (c) 2012, Jeremie Dimino <jeremie@dimino.org>
 * Licence   : BSD3
 *
 * This file is a part of Lambda-Term.
 *)

(* Script to print sequences returned by the terminal. You can execute
   it like this:

   # ocaml print_sequences.ml
*)

#load "unix.cma";;

let () =
  (* Setup terminal attributes. *)
  let attr = Unix.tcgetattr Unix.stdin in
  Unix.tcsetattr Unix.stdin Unix.TCSAFLUSH {
    attr with
      Unix.c_brkint = false;
      Unix.c_inpck = false;
      Unix.c_istrip = false;
      Unix.c_ixon = false;
      Unix.c_csize = 8;
      Unix.c_parenb = false;
      Unix.c_echo = false;
      Unix.c_icanon = false;
      Unix.c_vmin = 1;
      Unix.c_vtime = 0;
      Unix.c_isig = false;
  };
  (* Read and print key sequences. *)
  print_endline "press 'q' to quit";
  let buf = Bytes.create 128 in
  let rec loop () =
    let n = Unix.read Unix.stdin buf 0 (Bytes.length buf) in
    let s = Bytes.to_string (Bytes.sub buf 0 n) in
    print_endline (String.escaped s);
    if s <> "q" then loop ()
  in
  let result =
    try
      loop ();
      `OK
    with exn ->
      `Exn exn
  in
  (* Reset terminal attributes. *)
  Unix.tcsetattr Unix.stdin Unix.TCSAFLUSH attr;
  match result with
    | `OK -> ()
    | `Exn exn -> raise exn