1988-02-19 15:54:01 +00:00
|
|
|
(*
|
|
|
|
(c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
|
|
See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
|
|
*)
|
|
|
|
|
1987-08-19 18:07:01 +00:00
|
|
|
(*$R-*)
|
1987-06-26 15:59:52 +00:00
|
|
|
IMPLEMENTATION MODULE Traps;
|
1988-02-19 15:54:01 +00:00
|
|
|
(*
|
|
|
|
Module: Facility for handling traps
|
|
|
|
Author: Ceriel J.H. Jacobs
|
|
|
|
Version: $Header$
|
|
|
|
*)
|
|
|
|
|
1987-06-26 15:59:52 +00:00
|
|
|
IMPORT EM;
|
|
|
|
IMPORT Unix;
|
|
|
|
FROM SYSTEM IMPORT ADDRESS, ADR;
|
|
|
|
FROM Arguments IMPORT Argv;
|
|
|
|
|
|
|
|
PROCEDURE InstallTrapHandler(t: TrapHandler): TrapHandler;
|
|
|
|
(* Install a new trap handler, and return the previous one.
|
|
|
|
Parameter of trap handler is the trap number.
|
|
|
|
*)
|
|
|
|
BEGIN
|
|
|
|
RETURN EM.SIG(t);
|
|
|
|
END InstallTrapHandler;
|
|
|
|
|
|
|
|
PROCEDURE Message(str: ARRAY OF CHAR);
|
|
|
|
(* Write message "str" on standard error, preceeded by filename and
|
|
|
|
linenumber if possible
|
|
|
|
*)
|
|
|
|
VAR p, q: POINTER TO CHAR;
|
|
|
|
l: CARDINAL;
|
1988-04-29 14:38:36 +00:00
|
|
|
lino: INTEGER;
|
1987-06-26 15:59:52 +00:00
|
|
|
buf, buf2: ARRAY [0..255] OF CHAR;
|
|
|
|
i, j: CARDINAL;
|
|
|
|
BEGIN
|
|
|
|
p := EM.FILN();
|
|
|
|
IF p # NIL THEN
|
|
|
|
q := p;
|
|
|
|
WHILE p^ # 0C DO
|
|
|
|
p := ADDRESS(p) + 1;
|
|
|
|
END;
|
1988-04-29 14:38:36 +00:00
|
|
|
IF Unix.write(2, q, ADDRESS(p) - ADDRESS(q)) < 0 THEN END;
|
1987-06-26 15:59:52 +00:00
|
|
|
ELSE
|
|
|
|
l := Argv(0, buf);
|
1988-04-29 14:38:36 +00:00
|
|
|
IF Unix.write(2, ADR(buf), l) < 0 THEN END;
|
1987-06-26 15:59:52 +00:00
|
|
|
END;
|
|
|
|
lino := EM.LINO();
|
|
|
|
i := 0;
|
|
|
|
IF lino # 0 THEN
|
|
|
|
i := 2;
|
|
|
|
buf[0] := ',';
|
|
|
|
buf[1] := ' ';
|
|
|
|
IF lino < 0 THEN
|
|
|
|
buf[2] := '-';
|
|
|
|
i := 3;
|
|
|
|
lino := - lino;
|
|
|
|
END;
|
|
|
|
j := 0;
|
|
|
|
REPEAT
|
|
|
|
buf2[j] := CHR(CARDINAL(lino) MOD 10 + ORD('0'));
|
|
|
|
lino := lino DIV 10;
|
|
|
|
INC(j);
|
|
|
|
UNTIL lino = 0;
|
|
|
|
WHILE j > 0 DO
|
|
|
|
DEC(j);
|
|
|
|
buf[i] := buf2[j];
|
|
|
|
INC(i);
|
|
|
|
END;
|
|
|
|
END;
|
|
|
|
buf[i] := ':';
|
|
|
|
buf[i+1] := ' ';
|
1988-04-29 14:38:36 +00:00
|
|
|
IF Unix.write(2, ADR(buf), i+2) < 0 THEN END;
|
1987-06-26 15:59:52 +00:00
|
|
|
i := 0;
|
|
|
|
WHILE (i <= HIGH(str)) AND (str[i] # 0C) DO
|
|
|
|
INC(i);
|
|
|
|
END;
|
1988-04-29 14:38:36 +00:00
|
|
|
IF Unix.write(2, ADR(str), i) < 0 THEN END;
|
1987-06-26 15:59:52 +00:00
|
|
|
buf[0] := 12C;
|
1988-04-29 14:38:36 +00:00
|
|
|
IF Unix.write(2, ADR(buf), 1) < 0 THEN END;
|
1987-06-26 15:59:52 +00:00
|
|
|
END Message;
|
|
|
|
|
|
|
|
PROCEDURE Trap(n: INTEGER);
|
|
|
|
(* cause trap number "n" to occur *)
|
|
|
|
BEGIN
|
|
|
|
EM.TRP(n);
|
|
|
|
END Trap;
|
|
|
|
|
|
|
|
END Traps.
|