home *** CD-ROM | disk | FTP | other *** search
/ OpenStep (Enterprise) / OpenStepENTCD.toast / OEDEV / DEV.Z / STDARG.H < prev    next >
C/C++ Source or Header  |  1996-09-08  |  5KB  |  184 lines

  1. #if !defined(__TOPLEVEL_NEXT_COMMON_INCLUDE__)
  2. #define __TOPLEVEL_NEXT_COMMON_INCLUDE__
  3. #define __TOPLEVEL_STDARG_H_
  4. #include <next_common_defines.h>
  5. #endif /* __TOPLEVEL_NEXT_COMMON_INCLUDE__ */
  6.  
  7. /***
  8. *stdarg.h - defines ANSI-style macros for variable argument functions
  9. *
  10. *    Copyright (c) 1985-1995, Microsoft Corporation. All rights reserved.
  11. *
  12. *Purpose:
  13. *    This file defines ANSI-style macros for accessing arguments
  14. *    of functions which take a variable number of arguments.
  15. *    [ANSI]
  16. *
  17. *       [Public]
  18. *
  19. ****/
  20.  
  21. #if _MSC_VER > 1000
  22. #pragma once
  23. #endif
  24.  
  25. #ifndef _INC_STDARG
  26. #define _INC_STDARG
  27.  
  28. #if !defined(_WIN32) && !defined(_MAC)
  29. #error ERROR: Only Mac or Win32 targets supported!
  30. #endif
  31.  
  32.  
  33. #ifdef    _MSC_VER
  34. /*
  35.  * Currently, all MS C compilers for Win32 platforms default to 8 byte
  36.  * alignment.
  37.  */
  38. #pragma pack(push,8)
  39. #endif    /* _MSC_VER */
  40.  
  41. #ifdef __cplusplus
  42. extern "C" {
  43. #endif
  44.  
  45. #ifdef __GNUC__
  46. #ifdef va_start
  47. #undef va_start
  48. #endif va_start
  49. #ifdef va_end
  50. #undef va_end
  51. #endif va_end
  52. #endif __GNUC__
  53.  
  54.  
  55. #ifndef _VA_LIST_DEFINED
  56. #ifdef    _M_ALPHA
  57. typedef struct {
  58.     char *a0;    /* pointer to first homed integer argument */
  59.     int offset;    /* byte offset of next parameter */
  60. } va_list;
  61. #else
  62. typedef char *    va_list;
  63. #endif
  64. #define _VA_LIST_DEFINED
  65. #endif
  66.  
  67. #ifdef    _M_IX86
  68.  
  69.  
  70. #define _INTSIZEOF(n)    ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
  71.  
  72. #define va_start(ap,v)    ( ap = (va_list)&v + _INTSIZEOF(v) )
  73. #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
  74. #define va_end(ap)    ( ap = (va_list)0 )
  75.  
  76. #elif    defined(_M_MRX000)
  77.  
  78.  
  79. /* Use these types and definitions if generating code for MIPS */
  80.  
  81. #define va_start(ap,v) ap  = (va_list)&v + sizeof(v)
  82. #define va_end(list)
  83. #define va_arg(list, mode) ((mode *)(list =\
  84.  (char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) &\
  85.  (__builtin_alignof(mode)<=4?-4:-8))+sizeof(mode))))[-1]
  86.  
  87. /*  +++++++++++++++++++++++++++++++++++++++++++
  88.     Because of parameter passing conventions in C:
  89.     use mode=int for char, and short types
  90.     use mode=double for float types
  91.     use a pointer for array types
  92.     +++++++++++++++++++++++++++++++++++++++++++ */
  93.  
  94.  
  95. #elif    defined(_M_ALPHA)
  96.  
  97.  
  98. /* Use these types and definitions if generating code for ALPHA */
  99.  
  100. /*
  101.  * The Alpha compiler supports two builtin functions that are used to
  102.  * implement stdarg/varargs.  The __builtin_va_start function is used
  103.  * by va_start to initialize the data structure that locates the next
  104.  * argument.  The __builtin_isfloat function is used by va_arg to pick
  105.  * which part of the home area a given register argument is stored in.
  106.  * The home area is where up to six integer and/or six floating point
  107.  * register arguments are stored down (so they can also be referenced
  108.  * by a pointer like any arguments passed on the stack).
  109.  */
  110.  
  111. extern void * __builtin_va_start(va_list, ...);
  112.  
  113. #ifdef    _CFRONT
  114. #define __builtin_isfloat(a) __builtin_alignof(a)
  115. #endif
  116.  
  117. #define va_start(list, v) __builtin_va_start(list, v, 1)
  118. #define va_end(list)
  119. #define va_arg(list, mode) \
  120.     ( *(        ((list).offset += ((int)sizeof(mode) + 7) & -8) , \
  121.         (mode *)((list).a0 + (list).offset - \
  122.                     ((__builtin_isfloat(mode) && (list).offset <= (6 * 8)) ? \
  123.                         (6 * 8) + 8 : ((int)sizeof(mode) + 7) & -8) \
  124.                 ) \
  125.        ) \
  126.     )
  127.  
  128. #elif defined(_M_PPC)
  129.  
  130. /* Microsoft C8 front end (used in Motorola Merged compiler) */
  131. /* bytes that a type occupies in the argument list */
  132. #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
  133. /* return 'ap' adjusted for type 't' in arglist */
  134. #define    _ALIGNIT(ap,t) \
  135.     ((((int)(ap))+(sizeof(t)<8?3:7)) & (sizeof(t)<8?~3:~7))
  136.  
  137. #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
  138. #define va_arg(ap,t)    ( *(t *)((ap = (char *) (_ALIGNIT(ap, t) + _INTSIZEOF(t))) - _INTSIZEOF(t)) )
  139. #define va_end(ap)      ( ap = (va_list)0 )
  140.  
  141. #elif defined(_M_M68K)
  142. #define _INTSIZEOF(n)    ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
  143.  
  144. #define va_start(ap,v)    ( ap = (va_list)&v + (sizeof(v) < sizeof(int) ? sizeof(v) : _INTSIZEOF(v)) )
  145. #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
  146. #define va_end(ap)    ( ap = (va_list)0 )
  147.  
  148. #elif defined(_M_MPPC)
  149. #define _INTSIZEOF(n)    ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
  150.  
  151. #define va_start(ap,v)    ( ap = (va_list)&v + _INTSIZEOF(v) )
  152. #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
  153. #define va_end(ap)    ( ap = (va_list)0 )
  154.  
  155. #else
  156.  
  157. /* A guess at the proper definitions for other platforms */
  158.  
  159. #define _INTSIZEOF(n)    ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
  160.  
  161. #define va_start(ap,v)    ( ap = (va_list)&v + _INTSIZEOF(v) )
  162. #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
  163. #define va_end(ap)    ( ap = (va_list)0 )
  164.  
  165.  
  166. #endif
  167.  
  168.  
  169. #ifdef __cplusplus
  170. }
  171. #endif
  172.  
  173. #ifdef    _MSC_VER
  174. #pragma pack(pop)
  175. #endif    /* _MSC_VER */
  176.  
  177. #endif    /* _INC_STDARG */
  178.  
  179. #if defined(__TOPLEVEL_STDARG_H_)
  180. #undef __TOPLEVEL_NEXT_COMMON_INCLUDE__
  181. #undef __TOPLEVEL_STDARG_H_ 
  182. #include <next_common_undefines.h>
  183. #endif /* __TOPLEVEL_STDARG_H_ */
  184.