1 /***
2 *varargs.h - XENIX style macros for variable argument functions
3 *
4 *           Copyright (c) Microsoft Corporation. All rights reserved.
5 *
6 *Purpose:
7 *           This file defines XENIX style macros for accessing arguments of a
8 *           function which takes a variable number of arguments.
9 *           [System V]
10 *
11 *           [Public]
12 *
13 ****/
14
15 #if        _MSC_VER > 1000
16 #pragma once
17 #endif
18
19 #ifndef _INC_VARARGS
20 #define _INC_VARARGS
21
22 #if        !defined(_WIN32)
23 #error ERROR: Only Win32 target supported!
24 #endif
25
26
27 #include <crtdefs.h>
28
29 #ifdef  _MSC_VER
30 /*
31  * Currently, all MS C compilers for Win32 platforms default to 8 byte
32  * alignment.
33  */
34 #pragma pack(push,_CRT_PACKING)
35 #endif  /* _MSC_VER */
36
37 #ifdef  __cplusplus
38 extern "C" {
39 #endif
40
41 #if        __STDC__
42 #error varargs.h incompatible with ANSI (use stdarg.h)
43 #endif
44
45 #if !defined(_W64)
46 #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
47 #define _W64 __w64
48 #else
49 #define _W64
50 #endif
51 #endif
52
53 #ifndef _UINTPTR_T_DEFINED
54 #ifdef  _WIN64
55 typedef unsigned __int64      uintptr_t;
56 #else
57 typedef _W64 unsigned int     uintptr_t;
58 #endif
59 #define _UINTPTR_T_DEFINED
60 #endif
61
62 #ifndef _VA_LIST_DEFINED
63 #ifdef _M_CEE_PURE
64 typedef System::ArgIterator va_list;
65 #else
66 typedef char *  va_list;
67 #endif
68 #define _VA_LIST_DEFINED
69 #endif
70
71 #ifndef va_arg
72
73 #if        defined(_M_CEE)
74
75 #error varargs.h not supported when targetting _M_CEE (use stdarg.h)
76
77 #elif     defined(_M_IX86)
78
79 /*
80  * define a macro to compute the size of a type, variable or expression,
81  * rounded up to the nearest multiple of sizeof(int). This number is its
82  * size as function argument (Intel architecture). Note that the macro
83  * depends on sizeof(int) being a power of 2!
84  */
85 #define _INTSIZEOF(n)      ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
86
87 #define va_dcl va_list va_alist;
88 #define va_start(ap) ap = (va_list)&va_alist
89 #define va_arg(ap,t)      ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
90 #define va_end(ap) ap = (va_list)0
91
92 #elif defined(_M_IA64)
93
94 #ifndef _VA_LIST
95 #define _VA_LIST char*
96 #endif
97 typedef _VA_LIST va_list;
98
Lines 99 ... 108 are skipped.
109 #define va_dcl __int64  va_alist;
110
111 #define va_start(ap)      ( ap = (va_list)&va_alist )
112
113 #define va_arg(ap,t)      (*(t *)((ap += _SLOTSIZEOF(t)+ _APALIGN(t,ap)) \
114                                                                                         -_SLOTSIZEOF(t)))
115
116 #define va_end(ap)          ( ap = (va_list)0 )
117
118 #elif defined(_M_AMD64)
119
120 extern void __cdecl __va_start(va_list *, ...);
121
122 #define va_dcl                va_list va_alist;
123
124 #define va_start(ap)     ( __va_start(&ap, 0) )
125
126 #define va_arg(ap, t)     \
127       ( ( sizeof(t) > sizeof(__int64) || ( sizeof(t) & (sizeof(t) - 1) ) != 0 ) \
128              ? **(t **)( ( ap += sizeof(__int64) ) - sizeof(__int64) ) \
129              :  *(t  *)( ( ap += sizeof(__int64) ) - sizeof(__int64) ) )
130 #define va_end(ap)          ( ap = (va_list)0 )
131
132 #else
133
134 /* A guess at the proper definitions for other platforms */
135
136 #define _INTSIZEOF(n)      ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
137
138 #define va_dcl va_list va_alist;
139 #define va_start(ap) ap = (va_list)&va_alist
140 #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
141 #define va_end(ap) ap = (va_list)0
142
143
144 #endif
145
146 #endif
147
148
149 #ifdef  __cplusplus
150 }
151 #endif
152
153 #ifdef  _MSC_VER
154 #pragma pack(pop)
155 #endif  /* _MSC_VER */
156
157 #endif  /* _INC_VARARGS */
158