Traps.mod 2.0 KB

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