home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lifeos2.zip / LIFE-1.02 / SOURCE / INTERRUP.C < prev    next >
C/C++ Source or Header  |  1996-06-14  |  3KB  |  151 lines

  1. /* Copyright 1991 Digital Equipment Corporation.
  2. ** All Rights Reserved.
  3. *****************************************************************/
  4. /*     $Id: interrupt.c,v 1.2 1994/12/08 23:25:19 duchier Exp $     */
  5.  
  6. #ifndef lint
  7. static char vcid[] = "$Id: interrupt.c,v 1.2 1994/12/08 23:25:19 duchier Exp $";
  8. #endif /* lint */
  9.  
  10. #include "extern.h"
  11. #include <signal.h>
  12. #include "token.h"
  13. #include "login.h"
  14. #ifndef OS2_PORT
  15. #include "built_ins.h"
  16. #else
  17. #include "built_in.h"
  18. #endif
  19.  
  20. #include "error.h"
  21.  
  22. long interrupted=FALSE;
  23.  
  24.  
  25.  
  26. /******** INTERRUPT()
  27.   This routine is called whenever the user types CONTROL C which generates an
  28.   interrupt. The interrupt is dealt with later, when convenient, or ignored.
  29. */
  30. void interrupt()
  31. {
  32.   void (*f)(); /*  RM: Apr  7 1993   Weird problem in GCC and C89 */
  33.   
  34.   interrupted=TRUE;
  35.   f=interrupt;
  36.   signal(SIGINT,f);/*  RM: Feb 15 1993  */
  37. }
  38.  
  39.  
  40.  
  41. /******** INIT_INTERRUPT
  42.   This initialises interrupts by trapping the interrupt signal and sending it
  43.   to INTERRUPT.
  44. */
  45. void init_interrupt()
  46. {
  47.   void (*f)(); /*  RM: Apr  7 1993   Weird problem in GCC and C89 */
  48.   f=interrupt;
  49.   if (signal(SIGINT,SIG_IGN)!=SIG_IGN)
  50.     signal(SIGINT,f);
  51. }
  52.  
  53.  
  54.  
  55. /******** HANDLE_INTERRUPT()
  56.   This deals with an eventual interrupt.
  57.   Return TRUE if execution continues normally, otherwise abort query, toggle
  58.   trace on or off, or quit Wild_Life (suicide).
  59. */
  60. void handle_interrupt()
  61. {
  62.   ptr_psi_term old_state;
  63.   char *old_prompt;
  64.   int old_quiet; /* 21.1 */
  65.   long c,d; /* 21.12 (prev. char) */
  66.   long count;
  67.  
  68.   if (interrupted) printf("\n");
  69.   interrupted=FALSE;
  70.   old_prompt=prompt;
  71.   old_quiet=quietflag; /* 21.1 */
  72.   steptrace=FALSE;
  73.  
  74.   /* new_state(&old_state); */
  75.   old_state=input_state;
  76.   open_input_file("stdin");
  77.   stdin_cleareof();
  78.  
  79.   StartAgain:
  80.   do {
  81.     printf("*** Command ");
  82.     prompt="(q,c,a,s,t,h)?";
  83.     quietflag=FALSE; /* 21.1 */
  84.     
  85.     do {
  86.       c=read_char();
  87.     } while (c!=EOLN && c>0 && c<=32);
  88.   
  89.     d=c;
  90.     count=0;
  91.     while (DIGIT(d)) { count=count*10+(d-'0'); d=read_char(); }
  92.  
  93.     while (d!=EOLN && d!=EOF) d=read_char();
  94.  
  95.     if (c=='h' || c=='?') {
  96.       printf("*** [Quit (q), Continue (c), Abort (a), Step (s,RETURN), Trace (t), Help (h,?)]\n");
  97.     }
  98.  
  99.   } while (c=='h' || c=='?');
  100.   
  101.   prompt=old_prompt;
  102.   quietflag=old_quiet; /* 21.1 */
  103.   
  104.   switch (c) {
  105.   case 'v':
  106.   case 'V':
  107.     verbose=TRUE;
  108.     break;
  109.   case 'q':
  110.   case 'Q':
  111.   case EOF:
  112.     if (c==EOF) printf("\n");
  113.     exit_life(FALSE);
  114.     break;
  115.   case 'a':
  116.   case 'A':
  117.     abort_life(FALSE);
  118.     show_count();
  119.     break;
  120.   case 'c':
  121.   case 'C':
  122.     trace=FALSE;
  123.     stepflag=FALSE;
  124.     break;
  125.   case 't':
  126.   case 'T':
  127.     trace=TRUE;
  128.     stepflag=FALSE;
  129.     break;
  130.   case 's':
  131.   case 'S':
  132.   case EOLN:
  133.     trace=TRUE;
  134.     stepflag=TRUE;
  135.     break;
  136.   case '0': case '1': case '2': case '3': case '4':
  137.   case '5': case '6': case '7': case '8': case '9':
  138.     trace=TRUE;
  139.     stepflag=TRUE;
  140.     if (count>0) {
  141.       stepcount=count;
  142.       stepflag=FALSE;
  143.     }
  144.     break;
  145.   default:
  146.     goto StartAgain;
  147.   }
  148.   input_state=old_state;
  149.   restore_state(input_state);
  150. }
  151.