home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / smail-3.1.28 / src / jump.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-20  |  1.3 KB  |  58 lines

  1. /* @(#)src/jump.h    1.2 9/20/92 18:45:12 -  */
  2.  
  3. /*
  4.  *    Copyright (C) 1992  Chip Salzenberg
  5.  *
  6.  * Support common to the use of setjmp/longjmp and signals.
  7.  */
  8.  
  9. #ifndef JUMP_H
  10. #define JUMP_H
  11.  
  12. #include <setjmp.h>
  13. #include <signal.h>
  14.  
  15. #if defined(POSIX_OS) && !defined(NO_SIGSETJMP)
  16.  
  17. typedef struct {
  18.   struct sigaction act;
  19. } JUMPSIG;
  20.  
  21. #define JUMP_SETSIG(SIG,FUNC,JS)    \
  22.    {                    \
  23.      struct sigaction act, oldact;    \
  24.      act.sa_handler = FUNC;        \
  25.      sigemptyset(&act.sa_mask);        \
  26.      sigaddset(&act.sa_mask,SIG);    \
  27.      act.sa_flags = 0;            \
  28.      sigaction(SIG,&act,&oldact);    \
  29.      (JS)->act = oldact;        \
  30.    }
  31. #define JUMP_CLEARSIG(SIG,JS)        \
  32.    {                    \
  33.      struct sigaction oldact;        \
  34.      oldact = (JS)->act;        \
  35.      sigaction(SIG,&oldact,(struct sigaction *)NULL); \
  36.    }
  37.  
  38. #define JUMP_SETJMP(BUF)        sigsetjmp(BUF, 1)
  39. #define JUMP_LONGJMP(BUF,VAL)        siglongjmp(BUF, VAL)
  40. #define JUMP_ENVBUF            sigjmp_buf
  41.  
  42. #else /* !POSIX_OS || NO_SIGSETJMP */
  43.  
  44. typedef struct {
  45.     void (*func)();
  46. } JUMPSIG;
  47.  
  48. #define JUMP_SETSIG(SIG,FUNC,JS)    { (JS)->func = signal(SIG,FUNC); }
  49. #define JUMP_CLEARSIG(SIG,JS)        { signal(SIG,(JS)->func); }
  50.  
  51. #define JUMP_SETJMP(BUF)        setjmp(BUF)
  52. #define JUMP_LONGJMP(BUF,VAL)        longjmp(BUF, VAL)
  53. #define JUMP_ENVBUF            jmp_buf
  54.  
  55. #endif /* POSIX_OS && !NO_SIGSETJMP */
  56.  
  57. #endif /* !JUMP_H */
  58.