5 /* $Id: trap.c,v 2.4 1994/06/24 10:49:29 ceriel Exp $ */
21 extern jmp_buf trapbuf; /* from main.c */
23 int must_test; /* TEST-bit on in EM header word 2 */
26 PRIVATE int nonreturnable();
28 PRIVATE char *trap_msg[] = {
29 #include "trap_msg" /* generated from $(EM)/etc/traps */
33 char *trap2text(nr) /* transient */
36 if ( /* trap number in predefined range */
37 nr < sizeof (trap_msg) / sizeof (trap_msg[0])
38 && /* trap message not the empty string */
46 sprintf(buf, "TRAP %d", nr);
58 1. The trap has not been masked.
59 2. This routine does not return; it either ends in a call of
60 fatal() or in a longjmp().
62 static int rec_nr; /* Recursive trap number */
63 static int rec_trap = 0; /* To detect traps inside do_trap() */
65 register long tpi; /* Trap Procedure Identifier */
67 LOG(("@t1 trap(%d) [%s: %d]", nr, F, L));
72 fatal("trap \"%s\" before program started", trap2text(nr));
76 fatal("trap \"%s\" not caught at %s",
77 trap2text(nr), position());
81 /* execute the trap */
83 fatal("recursive trap; first trap number was \"%s\"",
89 /* save the Function Return Area */
94 /* set up the trap number as the only parameter */
97 tpi = TrapPI; /* allowed since OnTrap == TR_TRAP */
100 call(tpi, (nonreturnable(nr) ? RSB_NRT : RSB_RTT));
107 PRIVATE int nonreturnable(nr)