Diff for /gforth/engine/signals.c between versions 1.10 and 1.16

version 1.10, 2000/09/23 15:06:08 version 1.16, 2002/10/26 12:48:25
Line 16 Line 16
   
   You should have received a copy of the GNU General Public License    You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software    along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
   
 */  */
   
Line 60  void install_signal_handler(int sig, voi Line 60  void install_signal_handler(int sig, voi
   
   action.sa_sigaction=handler;    action.sa_sigaction=handler;
   sigemptyset(&action.sa_mask);    sigemptyset(&action.sa_mask);
   action.sa_flags=SA_RESTART|SA_NODEFER|SA_SIGINFO; /* pass siginfo */    action.sa_flags=SA_RESTART|SA_NODEFER|SA_SIGINFO|SA_ONSTACK; /* pass siginfo */
   sigaction(sig, &action, NULL);    sigaction(sig, &action, NULL);
 }  }
 #endif  #endif
Line 73  Sigfunc *bsd_signal(int signo, Sigfunc * Line 73  Sigfunc *bsd_signal(int signo, Sigfunc *
   
   act.sa_handler=func;    act.sa_handler=func;
   sigemptyset(&act.sa_mask);    sigemptyset(&act.sa_mask);
   act.sa_flags=SA_NODEFER;    act.sa_flags=SA_NODEFER|SA_ONSTACK;
   if (sigaction(signo,&act,&oact) < 0)    if (sigaction(signo,&act,&oact) < 0)
     return SIG_ERR;      return SIG_ERR;
   else    else
Line 114  static void fpe_handler(int sig, siginfo Line 114  static void fpe_handler(int sig, siginfo
   int code;    int code;
   
   switch(info->si_code) {    switch(info->si_code) {
   #ifdef FPE_INTDIV
   case FPE_INTDIV: code=-10; break; /* integer divide by zero */    case FPE_INTDIV: code=-10; break; /* integer divide by zero */
   #endif
   #ifdef FPE_INTOVF
   case FPE_INTOVF: code=-11; break; /* integer overflow */    case FPE_INTOVF: code=-11; break; /* integer overflow */
   #endif
   case FPE_FLTDIV: code=-42; break; /* floating point divide by zero */    case FPE_FLTDIV: code=-42; break; /* floating point divide by zero */
   case FPE_FLTOVF: code=-43; break; /* floating point overflow  */    case FPE_FLTOVF: code=-43; break; /* floating point overflow  */
   case FPE_FLTUND: code=-54; break; /* floating point underflow  */    case FPE_FLTUND: code=-54; break; /* floating point underflow  */
   case FPE_FLTRES: code=-41; break; /* floating point inexact result  */    case FPE_FLTRES: code=-41; break; /* floating point inexact result  */
   #if 0 /* defined by Unix95, but unnecessary */
   case FPE_FLTINV: /* invalid floating point operation  */    case FPE_FLTINV: /* invalid floating point operation  */
   case FPE_FLTSUB: /* subscript out of range  */    case FPE_FLTSUB: /* subscript out of range  */
   #endif
   default: code=-55; break;    default: code=-55; break;
   }    }
   longjmp(throw_jmp_buf,code);    longjmp(throw_jmp_buf,code);
Line 174  void get_winsize() Line 180  void get_winsize()
 {  {
 #ifdef TIOCGWINSZ  #ifdef TIOCGWINSZ
   struct winsize size;    struct winsize size;
     size.ws_row = size.ws_col = 0;
       
   if (ioctl (1, TIOCGWINSZ, (char *) &size) >= 0) {    if (ioctl (1, TIOCGWINSZ, (char *) &size) >= 0) {
     rows = size.ws_row;      rows = size.ws_row;
Line 183  void get_winsize() Line 190  void get_winsize()
   char *s;    char *s;
   if ((s=getenv("LINES"))) {    if ((s=getenv("LINES"))) {
     rows=atoi(s);      rows=atoi(s);
     if (rows==0)  
       rows=DEFAULTROWS;  
   }    }
   if ((s=getenv("COLUMNS"))) {    if ((s=getenv("COLUMNS"))) {
     rows=atoi(s);      rows=atoi(s);
     if (rows==0)  
       cols=DEFAULTCOLS;  
   }    }
 #endif  #endif
     if (rows==0)
       rows=DEFAULTROWS;
     if (rows==0)
       cols=DEFAULTCOLS;
 }  }
   
 #ifdef SIGWINCH  #ifdef SIGWINCH
Line 355  void install_signal_handlers(void) Line 362  void install_signal_handlers(void)
   };    };
   int i;    int i;
   void (*throw_handler)() = die_on_signal ? graceful_exit : signal_throw;    void (*throw_handler)() = die_on_signal ? graceful_exit : signal_throw;
     stack_t sigstack;
     int sas_retval=-1;
   
     sigstack.ss_size=SIGSTKSZ;
     if ((sigstack.ss_sp = my_alloc(sigstack.ss_size)) != NULL) {
       sigstack.ss_flags=0;
       sas_retval=sigaltstack(&sigstack,(stack_t *)0);
     }
     if (debug)
       fprintf(stderr,"sigaltstack: %s\n",strerror(sas_retval));
   
 #define DIM(X)          (sizeof (X) / sizeof *(X))  #define DIM(X)          (sizeof (X) / sizeof *(X))
 /*  /*
Line 366  void install_signal_handlers(void) Line 383  void install_signal_handlers(void)
   for (i = 0; i < DIM (sigs_to_quit); i++)    for (i = 0; i < DIM (sigs_to_quit); i++)
     bsd_signal(sigs_to_quit [i], graceful_exit);      bsd_signal(sigs_to_quit [i], graceful_exit);
 #ifdef SA_SIGINFO  #ifdef SA_SIGINFO
   install_signal_handler(SIGFPE, fpe_handler);    if (!die_on_signal) {
   install_signal_handler(SIGSEGV, segv_handler);      install_signal_handler(SIGFPE, fpe_handler);
       install_signal_handler(SIGSEGV, segv_handler);
     }
 #endif  #endif
 #ifdef SIGCONT  #ifdef SIGCONT
     bsd_signal(SIGCONT, termprep);      bsd_signal(SIGCONT, termprep);

Removed from v.1.10  
changed lines
  Added in v.1.16


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>