trap.c 782 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <signal.h>
  2. #include <setjmp.h>
  3. #ifndef NSIG
  4. #define NSIG _NSIG
  5. #endif
  6. /* $Id$ */
  7. /* Trap handling */
  8. int _trpline; /* BASIC return label */
  9. jmp_buf trpbuf;
  10. _trpset(nr)
  11. int nr;
  12. {
  13. /*debug printf("trap set to %d\n",nr);*/
  14. _trpline=nr;
  15. }
  16. void
  17. _trpfatal(i)
  18. int i;
  19. {
  20. extern int _errsym,_erlsym;
  21. _errsym= i;
  22. _setline();
  23. if( _trpline == 0)
  24. printf("LINE %d: FATAL ERROR: trap %d\n",_erlsym,i);
  25. #ifdef DEBUG
  26. printf("trap occurred %d return %d\n",i,_trpline);
  27. #endif
  28. _trap();
  29. }
  30. _ini_trp()
  31. {
  32. /* initialize trap routines */
  33. int i;
  34. for(i=0;i<NSIG;i++)
  35. signal(i,_trpfatal);
  36. }
  37. _settrap(nr)
  38. int nr;
  39. {
  40. _trpline=nr;
  41. }
  42. _trap()
  43. {
  44. int line;
  45. if( _trpline==0) exit(-1);
  46. line=_trpline;
  47. _trpline=0; /* should be reset by user */
  48. _ini_trp();
  49. longjmp(trpbuf,line);
  50. }