home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / include / setjmp.h < prev    next >
C/C++ Source or Header  |  1998-06-16  |  8KB  |  348 lines

  1. /***
  2. *setjmp.h - definitions/declarations for setjmp/longjmp routines
  3. *
  4. *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
  5. *
  6. *Purpose:
  7. *       This file defines the machine-dependent buffer used by
  8. *       setjmp/longjmp to save and restore the program state, and
  9. *       declarations for those routines.
  10. *       [ANSI/System V]
  11. *
  12. *       [Public]
  13. *
  14. ****/
  15.  
  16. #if     _MSC_VER > 1000
  17. #pragma once
  18. #endif
  19.  
  20. #ifndef _INC_SETJMP
  21. #define _INC_SETJMP
  22.  
  23. #if     !defined(_WIN32) && !defined(_MAC)
  24. #error ERROR: Only Mac or Win32 targets supported!
  25. #endif
  26.  
  27.  
  28. #ifdef  _MSC_VER
  29. /*
  30.  * Currently, all MS C compilers for Win32 platforms default to 8 byte
  31.  * alignment.
  32.  */
  33. #pragma pack(push,8)
  34. #endif  /* _MSC_VER */
  35.  
  36. #ifdef  __cplusplus
  37. extern "C" {
  38. #endif
  39.  
  40.  
  41.  
  42. /* Define _CRTIMP */
  43.  
  44. #ifndef _CRTIMP
  45. #ifdef  _DLL
  46. #define _CRTIMP __declspec(dllimport)
  47. #else   /* ndef _DLL */
  48. #define _CRTIMP
  49. #endif  /* _DLL */
  50. #endif  /* _CRTIMP */
  51.  
  52. /* Define __cdecl for non-Microsoft compilers */
  53.  
  54. #if     ( !defined(_MSC_VER) && !defined(__cdecl) )
  55. #define __cdecl
  56. #endif
  57.  
  58. /* Define _CRTAPI1 (for compatibility with the NT SDK) */
  59.  
  60. #ifndef _CRTAPI1
  61. #if    _MSC_VER >= 800 && _M_IX86 >= 300
  62. #define _CRTAPI1 __cdecl
  63. #else
  64. #define _CRTAPI1
  65. #endif
  66. #endif
  67.  
  68.  
  69. /*
  70.  * Definitions specific to particular setjmp implementations.
  71.  */
  72.  
  73. #if     defined(_M_IX86)
  74.  
  75. /*
  76.  * MS compiler for x86
  77.  */
  78.  
  79. #ifndef _INC_SETJMPEX
  80. #define setjmp  _setjmp
  81. #endif
  82.  
  83. #define _JBLEN  16
  84. #define _JBTYPE int
  85.  
  86. /*
  87.  * Define jump buffer layout for x86 setjmp/longjmp.
  88.  */
  89. typedef struct __JUMP_BUFFER {
  90.     unsigned long Ebp;
  91.     unsigned long Ebx;
  92.     unsigned long Edi;
  93.     unsigned long Esi;
  94.     unsigned long Esp;
  95.     unsigned long Eip;
  96.     unsigned long Registration;
  97.     unsigned long TryLevel;
  98.     unsigned long Cookie;
  99.     unsigned long UnwindFunc;
  100.     unsigned long UnwindData[6];
  101. } _JUMP_BUFFER;
  102.  
  103.  
  104.  
  105. #elif   defined(_M_MRX000)
  106.  
  107. #ifndef _INC_SETJMPEX
  108. #if     _MSC_VER >= 1100
  109. #define _setjmp  _setjmpVfp
  110. #endif
  111. #define setjmp  _setjmp
  112. #endif
  113.  
  114. /*
  115.  * All MIPS implementations need _JBLEN of 16
  116.  */
  117.  
  118. #define _JBLEN  16
  119. #define _JBTYPE double
  120.  
  121. /*
  122.  * Define jump buffer layout for MIPS setjmp/longjmp.
  123.  */
  124. typedef struct __JUMP_BUFFER {
  125.     unsigned long FltF20;
  126.     unsigned long FltF21;
  127.     unsigned long FltF22;
  128.     unsigned long FltF23;
  129.     unsigned long FltF24;
  130.     unsigned long FltF25;
  131.     unsigned long FltF26;
  132.     unsigned long FltF27;
  133.     unsigned long FltF28;
  134.     unsigned long FltF29;
  135.     unsigned long FltF30;
  136.     unsigned long FltF31;
  137.     unsigned long IntS0;
  138.     unsigned long IntS1;
  139.     unsigned long IntS2;
  140.     unsigned long IntS3;
  141.     unsigned long IntS4;
  142.     unsigned long IntS5;
  143.     unsigned long IntS6;
  144.     unsigned long IntS7;
  145.     unsigned long IntS8;
  146.     unsigned long IntSp;
  147.     unsigned long Type;
  148.     unsigned long Fir;
  149. } _JUMP_BUFFER;
  150.  
  151.  
  152. #elif   defined(_M_ALPHA)
  153.  
  154. /*
  155.  * The Alpha C8/GEM C compiler uses an intrinsic _setjmp.
  156.  * The Alpha acc compiler implements setjmp as a function.
  157.  */
  158. #ifdef  _MSC_VER
  159. #ifndef _INC_SETJMPEX
  160. #define setjmp  _setjmp
  161. #endif
  162. #endif
  163.  
  164. /*
  165.  * Alpha implementations use a _JBLEN of 24 quadwords.
  166.  * A double is used only to obtain quadword size and alignment.
  167.  */
  168. #define _JBLEN  24
  169. #define _JBTYPE double
  170.  
  171. /*
  172.  * Define jump buffer layout for Alpha setjmp/longjmp.
  173.  * A double is used only to obtain quadword size and alignment.
  174.  */
  175. typedef struct __JUMP_BUFFER {
  176.     unsigned long Fp;
  177.     unsigned long Pc;
  178.     unsigned long Seb;
  179.     unsigned long Type;
  180.     double FltF2;
  181.     double FltF3;
  182.     double FltF4;
  183.     double FltF5;
  184.     double FltF6;
  185.     double FltF7;
  186.     double FltF8;
  187.     double FltF9;
  188.     double IntS0;
  189.     double IntS1;
  190.     double IntS2;
  191.     double IntS3;
  192.     double IntS4;
  193.     double IntS5;
  194.     double IntS6;
  195.     double IntSp;
  196.     double Fir;
  197.     double Fill[5];
  198. } _JUMP_BUFFER;
  199.  
  200. #elif   defined(_M_PPC)
  201. /*
  202.  * The Microsoft VC++ V4.0 compiler uses an intrinsic _setjmp.
  203.  * The Motorola C8.5 compiler implements setjmp as a function.
  204.  */
  205.  
  206. #if     _MSC_VER > 850
  207. #ifndef _INC_SETJMPEX
  208. #undef _setjmp
  209. #define setjmp  _setjmp
  210. #endif
  211. #endif
  212.  
  213. /*
  214.  * Min length is 240 bytes; round to 256 bytes.
  215.  * Since this is allocated as an array of "double", the
  216.  * number of entries required is 32.
  217.  *
  218.  * All PPC implementations need _JBLEN of 32
  219.  */
  220.  
  221. #define _JBLEN  32
  222. #define _JBTYPE double
  223.  
  224. /*
  225.  * Define jump buffer layout for PowerPC setjmp/longjmp.
  226.  */
  227.  
  228. typedef struct __JUMP_BUFFER {
  229.     double Fpr14;
  230.     double Fpr15;
  231.     double Fpr16;
  232.     double Fpr17;
  233.     double Fpr18;
  234.     double Fpr19;
  235.     double Fpr20;
  236.     double Fpr21;
  237.     double Fpr22;
  238.     double Fpr23;
  239.     double Fpr24;
  240.     double Fpr25;
  241.     double Fpr26;
  242.     double Fpr27;
  243.     double Fpr28;
  244.     double Fpr29;
  245.     double Fpr30;
  246.     double Fpr31;
  247.     unsigned long Gpr1;
  248.     unsigned long Gpr2;
  249.     unsigned long Gpr13;
  250.     unsigned long Gpr14;
  251.     unsigned long Gpr15;
  252.     unsigned long Gpr16;
  253.     unsigned long Gpr17;
  254.     unsigned long Gpr18;
  255.     unsigned long Gpr19;
  256.     unsigned long Gpr20;
  257.     unsigned long Gpr21;
  258.     unsigned long Gpr22;
  259.     unsigned long Gpr23;
  260.     unsigned long Gpr24;
  261.     unsigned long Gpr25;
  262.     unsigned long Gpr26;
  263.     unsigned long Gpr27;
  264.     unsigned long Gpr28;
  265.     unsigned long Gpr29;
  266.     unsigned long Gpr30;
  267.     unsigned long Gpr31;
  268.     unsigned long Cr;
  269.     unsigned long Iar;
  270.     unsigned long Type;
  271. } _JUMP_BUFFER;
  272.  
  273. #elif   defined(_M_M68K)
  274.  
  275. #ifndef _INC_SETJMPEX
  276. #define setjmp  _setjmp
  277. #endif
  278.  
  279. /* internal only for version checking for compatibility */
  280. #define _SETJMP_VER 1.0
  281.  
  282. /* internal only, jump buffer layout definition */
  283. typedef struct __JUMP_BUFFER {
  284.         unsigned long d1;       /* 0x00, saved */
  285.         unsigned long d2;       /* 0x04, saved */
  286.         unsigned long d3;       /* 0x08, saved */
  287.         unsigned long d4;       /* 0x0c, saved */
  288.         unsigned long d5;       /* 0x10, saved */
  289.         unsigned long d6;       /* 0x14, saved */
  290.         unsigned long d7;       /* 0x18, saved */
  291.         unsigned long a1;       /* 0x1c, non-swappable version: return address,
  292.                                          swappable version: swapper lib routine pointer for building return address */
  293.         unsigned long a2;       /* 0x20, saved */
  294.         unsigned long a3;       /* 0x24, saved */
  295.         unsigned long a4;       /* 0x28, saved */
  296.         unsigned long a6;       /* 0x2c, saved */
  297.         unsigned long a7;       /* 0x30, saved */
  298.         unsigned long SwapChain; /* 0x34, without swapper: unused. with swapper: link swappable frames */
  299.         unsigned short reserved; /* 0x38, unused */
  300.         unsigned short SN;      /* 0x3a, swappable version: segment number */
  301.         unsigned long BPC;      /* 0x3c, swappable version: offset within segment */
  302. } _JUMP_BUFFER;
  303.  
  304. #define _JBTYPE int
  305. #define _JBLEN  (sizeof(_JUMP_BUFFER)/sizeof(_JBTYPE))
  306.  
  307. #elif   defined(_M_MPPC)
  308.  
  309. #ifndef _INC_SETJMPEX
  310. #define setjmp  _setjmp
  311. #endif
  312.  
  313. #define _JBTYPE int
  314.  
  315. /* define the buffer type for building the state information */
  316.  
  317. #define _JBLEN 64   /* return address, R1, R2, R13-R31, FPR14-FPR31, CR 2-5 */
  318. #endif
  319.  
  320.  
  321. /* Define the buffer type for holding the state information */
  322.  
  323. #ifndef _JMP_BUF_DEFINED
  324. typedef _JBTYPE jmp_buf[_JBLEN];
  325. #define _JMP_BUF_DEFINED
  326. #endif
  327.  
  328.  
  329. /* Function prototypes */
  330.  
  331. int __cdecl setjmp(jmp_buf);
  332.  
  333. #if     _MSC_VER >= 1200
  334. _CRTIMP __declspec(noreturn) void __cdecl longjmp(jmp_buf, int);
  335. #else
  336. _CRTIMP void __cdecl longjmp(jmp_buf, int);
  337. #endif
  338.  
  339. #ifdef  __cplusplus
  340. }
  341. #endif
  342.  
  343. #ifdef  _MSC_VER
  344. #pragma pack(pop)
  345. #endif  /* _MSC_VER */
  346.  
  347. #endif  /* _INC_SETJMP */
  348.