1 (**************************************************************************)
2 (* *)
3 (* OCaml *)
4 (* *)
5 (* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *)
6 (* OCaml port by John Malecki and Xavier Leroy *)
7 (* *)
8 (* Copyright 1996 Institut National de Recherche en Informatique et *)
9 (* en Automatique. *)
10 (* *)
11 (* All rights reserved. This file is distributed under the terms of *)
12 (* the GNU Lesser General Public License version 2.1, with the *)
13 (* special exception on linking described in the file LICENSE. *)
14 (* *)
15 (**************************************************************************)
16
17 (* Handling of keyboard interrupts *)
18
19 let interrupted = ref false
20
21 let is_protected = ref false
22
23 let break _signum =
24 if !is_protected
25 then interrupted := true
26 else raise Sys.Break
27
28 let _ =
29 match Sys.os_type with
30 "Win32" -> ()
31 | _ ->
32 Sys.set_signal Sys.sigint (Sys.Signal_handle break);
33 Sys.set_signal Sys.sigpipe (Sys.Signal_handle(fun _ -> raise End_of_file))
34
35 let protect f =
36 if !is_protected then
37 f ()
38 else begin
39 is_protected := true;
40 if not !interrupted then
41 f ();
42 is_protected := false;
43 if !interrupted then begin interrupted := false; raise Sys.Break end
44 end
45
46 let unprotect f =
47 if not !is_protected then
48 f ()
49 else begin
50 is_protected := false;
51 if !interrupted then begin interrupted := false; raise Sys.Break end;
52 f ();
53 is_protected := true
54 end
55