1 | (*
|
---|
2 | (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
---|
3 | See the copyright notice in the ACK home directory, in the file "Copyright".
|
---|
4 | *)
|
---|
5 |
|
---|
6 | (*$R-*)
|
---|
7 | IMPLEMENTATION MODULE Traps;
|
---|
8 | (*
|
---|
9 | Module: Facility for handling traps
|
---|
10 | Author: Ceriel J.H. Jacobs
|
---|
11 | Version: $Header: /cvsup/minix/src/lib/ack/libm2/Traps.mod,v 1.1 2005/10/10 15:27:46 beng Exp $
|
---|
12 | *)
|
---|
13 |
|
---|
14 | FROM EM IMPORT SIG, LINO, FILN, TRP;
|
---|
15 | FROM Unix IMPORT write;
|
---|
16 | FROM SYSTEM IMPORT ADDRESS, ADR;
|
---|
17 | FROM Arguments IMPORT
|
---|
18 | Argv;
|
---|
19 |
|
---|
20 | PROCEDURE InstallTrapHandler(t: TrapHandler): TrapHandler;
|
---|
21 | (* Install a new trap handler, and return the previous one.
|
---|
22 | Parameter of trap handler is the trap number.
|
---|
23 | *)
|
---|
24 | BEGIN
|
---|
25 | RETURN SIG(t);
|
---|
26 | END InstallTrapHandler;
|
---|
27 |
|
---|
28 | PROCEDURE Message(str: ARRAY OF CHAR);
|
---|
29 | (* Write message "str" on standard error, preceeded by filename and
|
---|
30 | linenumber if possible
|
---|
31 | *)
|
---|
32 | VAR p: POINTER TO CHAR;
|
---|
33 | l: CARDINAL;
|
---|
34 | lino: INTEGER;
|
---|
35 | buf, buf2: ARRAY [0..255] OF CHAR;
|
---|
36 | i, j: CARDINAL;
|
---|
37 | BEGIN
|
---|
38 | p := FILN();
|
---|
39 | IF p # NIL THEN
|
---|
40 | i := 1;
|
---|
41 | buf[0] := '"';
|
---|
42 | WHILE p^ # 0C DO
|
---|
43 | buf[i] := p^;
|
---|
44 | INC(i);
|
---|
45 | p := ADDRESS(p) + 1;
|
---|
46 | END;
|
---|
47 | buf[i] := '"';
|
---|
48 | INC(i);
|
---|
49 | IF write(2, ADR(buf), i) < 0 THEN END;
|
---|
50 | ELSE
|
---|
51 | l := Argv(0, buf);
|
---|
52 | IF write(2, ADR(buf), l-1) < 0 THEN END;
|
---|
53 | END;
|
---|
54 | lino := LINO();
|
---|
55 | i := 0;
|
---|
56 | IF lino # 0 THEN
|
---|
57 | i := 7;
|
---|
58 | buf[0] := ','; buf[1] := ' ';
|
---|
59 | buf[2] := 'l'; buf[3] := 'i'; buf[4] := 'n'; buf[5] := 'e';
|
---|
60 | buf[6] := ' ';
|
---|
61 | IF lino < 0 THEN
|
---|
62 | buf[7] := '-';
|
---|
63 | i := 8;
|
---|
64 | lino := - lino;
|
---|
65 | END;
|
---|
66 | j := 0;
|
---|
67 | REPEAT
|
---|
68 | buf2[j] := CHR(CARDINAL(lino) MOD 10 + ORD('0'));
|
---|
69 | lino := lino DIV 10;
|
---|
70 | INC(j);
|
---|
71 | UNTIL lino = 0;
|
---|
72 | WHILE j > 0 DO
|
---|
73 | DEC(j);
|
---|
74 | buf[i] := buf2[j];
|
---|
75 | INC(i);
|
---|
76 | END;
|
---|
77 | END;
|
---|
78 | buf[i] := ':';
|
---|
79 | buf[i+1] := ' ';
|
---|
80 | IF write(2, ADR(buf), i+2) < 0 THEN END;
|
---|
81 | i := 0;
|
---|
82 | WHILE (i <= HIGH(str)) AND (str[i] # 0C) DO
|
---|
83 | INC(i);
|
---|
84 | END;
|
---|
85 | IF write(2, ADR(str), i) < 0 THEN END;
|
---|
86 | buf[0] := 12C;
|
---|
87 | IF write(2, ADR(buf), 1) < 0 THEN END;
|
---|
88 | END Message;
|
---|
89 |
|
---|
90 | PROCEDURE Trap(n: INTEGER);
|
---|
91 | (* cause trap number "n" to occur *)
|
---|
92 | BEGIN
|
---|
93 | TRP(n);
|
---|
94 | END Trap;
|
---|
95 |
|
---|
96 | END Traps.
|
---|