1da2e3ebdSchiniff	AST_COMMON
2da2e3ebdSchinhdr	pthread,stdarg,stddef,stdint,inttypes,types,unistd
3da2e3ebdSchinsys	types
4da2e3ebdSchintyp	long.double,size_t,ssize_t
5*b30d1939SAndy Fiddamantyp	__va_list stdio.h
6da2e3ebdSchin
7da2e3ebdSchinmac	SF_APPEND,SF_CLOSE	sys/stat.h sys/socket.h
8da2e3ebdSchin
9da2e3ebdSchindll	import note{ Microsoft import/export nonsense }end execute{
10da2e3ebdSchin	__declspec(dllimport) int foo;
11da2e3ebdSchin	int main() { return foo == 5 ? 0 : 1; }
12da2e3ebdSchin	int	bar = 5;
13da2e3ebdSchin	int*	_imp__foo = &bar;
14da2e3ebdSchin}end
15da2e3ebdSchin
16da2e3ebdSchinstd	proto note{ standard C prototypes ok }end compile{
17da2e3ebdSchin	extern int foo(int, int);
18da2e3ebdSchin	bar() { foo(1, 1); }
19da2e3ebdSchin}end
20da2e3ebdSchin
21da2e3ebdSchintst	ptr_void note{ standard C void* ok }end compile{
22da2e3ebdSchin	extern void* foo();
23da2e3ebdSchin	void* bar() { return foo(); }
24da2e3ebdSchin}end
25da2e3ebdSchin
26da2e3ebdSchincat{
27da2e3ebdSchin	/* disable non-standard linux/gnu inlines */
28da2e3ebdSchin	#ifdef __GNUC__
29da2e3ebdSchin	#	undef	__OPTIMIZE_SIZE__
30da2e3ebdSchin	#	define	__OPTIMIZE_SIZE__	1
31da2e3ebdSchin	#endif
32da2e3ebdSchin
33da2e3ebdSchin	/* __STD_C indicates that the language is ANSI-C or C++ */
34da2e3ebdSchin	#if !defined(__STD_C) && __STDC__
35da2e3ebdSchin	#	define	__STD_C		1
36da2e3ebdSchin	#endif
37da2e3ebdSchin	#if !defined(__STD_C) && (__cplusplus || c_plusplus)
38da2e3ebdSchin	#	define __STD_C		1
39da2e3ebdSchin	#endif
40da2e3ebdSchin	#if !defined(__STD_C) && _std_proto
41da2e3ebdSchin	#	define __STD_C		1
42da2e3ebdSchin	#endif
43da2e3ebdSchin	#if !defined(__STD_C)
44da2e3ebdSchin	#	define __STD_C		0
45da2e3ebdSchin	#endif
46da2e3ebdSchin
47da2e3ebdSchin	/* extern symbols must be protected against C++ name mangling */
48da2e3ebdSchin	#ifndef _BEGIN_EXTERNS_
49da2e3ebdSchin	#	if __cplusplus || c_plusplus
50da2e3ebdSchin	#		define _BEGIN_EXTERNS_	extern "C" {
51da2e3ebdSchin	#		define _END_EXTERNS_	}
52da2e3ebdSchin	#	else
53da2e3ebdSchin	#		define _BEGIN_EXTERNS_
54da2e3ebdSchin	#		define _END_EXTERNS_
55da2e3ebdSchin	#	endif
56da2e3ebdSchin	#endif
57da2e3ebdSchin
58da2e3ebdSchin	/* _ARG_ simplifies function prototyping among flavors of C */
59da2e3ebdSchin	#ifndef _ARG_
60da2e3ebdSchin	#	if __STD_C
61da2e3ebdSchin	#		define _ARG_(x)	x
62da2e3ebdSchin	#	else
63da2e3ebdSchin	#		define _ARG_(x)	()
64da2e3ebdSchin	#	endif
65da2e3ebdSchin	#endif
66da2e3ebdSchin
67da2e3ebdSchin	/* _NIL_ simplifies defining nil pointers to a given type */
68da2e3ebdSchin	#ifndef _NIL_
69da2e3ebdSchin	#	define _NIL_(x)	((x)0)
70da2e3ebdSchin	#endif
71da2e3ebdSchin
72*b30d1939SAndy Fiddaman	/* __INLINE__, if defined, is the inline keyword */
73da2e3ebdSchin	#if !defined(__INLINE__) && defined(__cplusplus)
74da2e3ebdSchin	#	define __INLINE__	inline
75da2e3ebdSchin	#endif
76da2e3ebdSchin	#if !defined(__INLINE__) && defined(_WIN32) && !defined(__GNUC__)
77da2e3ebdSchin	#	define __INLINE__	__inline
78da2e3ebdSchin	#endif
79da2e3ebdSchin
80da2e3ebdSchin	/* Void_t is defined so that Void_t* can address any type */
81da2e3ebdSchin	#ifndef Void_t
82da2e3ebdSchin	#	if __STD_C
83da2e3ebdSchin	#		define Void_t		void
84da2e3ebdSchin	#	else
85da2e3ebdSchin	#		define Void_t		char
86da2e3ebdSchin	#	endif
87da2e3ebdSchin	#endif
88da2e3ebdSchin
89da2e3ebdSchin	/* windows variants and veneers */
90da2e3ebdSchin	#if !defined(_WINIX) && (_UWIN || __CYGWIN__ || __EMX__)
91da2e3ebdSchin	#	define _WINIX		1
92da2e3ebdSchin	#endif
93da2e3ebdSchin
94da2e3ebdSchin	/* dynamic linked library external scope handling */
95da2e3ebdSchin	#ifdef __DYNAMIC__
96da2e3ebdSchin	#	undef	__DYNAMIC__
97da2e3ebdSchin	#	ifndef _DLL
98da2e3ebdSchin	#		define _DLL		1
99da2e3ebdSchin	#	endif
100da2e3ebdSchin	#endif
101da2e3ebdSchin	#if _dll_import
102da2e3ebdSchin	#	if _BLD_STATIC && !_BLD_DLL
103da2e3ebdSchin	#		undef	_DLL
104da2e3ebdSchin	#	else
105da2e3ebdSchin	#		if !_UWIN && !defined(_DLL)
106da2e3ebdSchin	#			define _DLL		1
107da2e3ebdSchin	#		endif
108da2e3ebdSchin	#	endif
109da2e3ebdSchin	#	if !defined(__EXPORT__) && _BLD_DLL
110da2e3ebdSchin	#		define __EXPORT__	__declspec(dllexport)
111da2e3ebdSchin	#	endif
112da2e3ebdSchin	#	if !defined(__IMPORT__) && ( _BLD_DLL || defined(_DLL) )
113da2e3ebdSchin	#		define __IMPORT__	__declspec(dllimport)
114da2e3ebdSchin	#	endif
115da2e3ebdSchin	#	if _BLD_DLL && _UWIN
116da2e3ebdSchin	#	define __DYNAMIC__(v)		(_ast_getdll()->_ast_ ## v)
117da2e3ebdSchin	#	endif
118da2e3ebdSchin	#endif
119da2e3ebdSchin	#if !defined(_astimport)
120da2e3ebdSchin	#	if defined(__IMPORT__) && defined(_DLL)
121da2e3ebdSchin	#		define _astimport	__IMPORT__
122da2e3ebdSchin	#	else
123da2e3ebdSchin	#		define _astimport	extern
124da2e3ebdSchin	#	endif
125da2e3ebdSchin	#endif
126da2e3ebdSchin	#if _dll_import && ( !_BLD_DLL || _WINIX && !_UWIN )
127da2e3ebdSchin	#	ifdef __STDC__
128da2e3ebdSchin	#	define __EXTERN__(T,obj)	extern T obj; T* _imp__ ## obj = &obj
129da2e3ebdSchin	#	define __DEFINE__(T,obj,val)	T obj = val; T* _imp__ ## obj = &obj
130da2e3ebdSchin	#	else
131da2e3ebdSchin	#	define __EXTERN__(T,obj)	extern T obj; T* _imp__/**/obj = &obj
132da2e3ebdSchin	#	define __DEFINE__(T,obj,val)	T obj = val; T* _imp__/**/obj = &obj
133da2e3ebdSchin	#	endif
134da2e3ebdSchin	#else
135da2e3ebdSchin	#	define __EXTERN__(T,obj)	extern T obj
136da2e3ebdSchin	#	define __DEFINE__(T,obj,val)	T obj = val
137da2e3ebdSchin	#endif
138da2e3ebdSchin}end
139da2e3ebdSchin
140*b30d1939SAndy Fiddamanif	tst - note{ <stdarg.h>+<wchar.h> works }end compile{
141*b30d1939SAndy Fiddaman		/*<NOSTDIO>*/
142*b30d1939SAndy Fiddaman		#include <stdarg.h>
143*b30d1939SAndy Fiddaman		#include <wchar.h>
144*b30d1939SAndy Fiddaman	}end
145*b30d1939SAndy Fiddamanelif	tst - note{ explicit <sys/va_list.h> before <stdarg.h>+<wchar.h> }end compile{
146*b30d1939SAndy Fiddaman		/*<NOSTDIO>*/
147*b30d1939SAndy Fiddaman		#include <sys/va_list.h>
148*b30d1939SAndy Fiddaman		#include <stdarg.h>
149*b30d1939SAndy Fiddaman		#include <wchar.h>
150*b30d1939SAndy Fiddaman	}end {
151*b30d1939SAndy Fiddaman		#include <sys/va_list.h>
152*b30d1939SAndy Fiddaman	}
153*b30d1939SAndy Fiddamanendif
154*b30d1939SAndy Fiddaman
155da2e3ebdSchintst	ast_LL note{ LL numeric suffix supported }end compile{
156da2e3ebdSchin	int i = 1LL;
157da2e3ebdSchin	unsigned int u = 1ULL; /* NOTE: some compilers choke on 1LLU */
158da2e3ebdSchin}end
159da2e3ebdSchin
160da2e3ebdSchintst	- -DN=1 - -DN=2 - -DN=3 - -DN=4 - -DN=5 - -DN=6 - -DN=7 - -DN=8 - -DN=0 output{
161da2e3ebdSchin	#define _BYTESEX_H
162da2e3ebdSchin
163da2e3ebdSchin	#include <string.h>
164da2e3ebdSchin	#include <sys/types.h>
165da2e3ebdSchin
166da2e3ebdSchin	#if _STD_
167da2e3ebdSchin	#if N == 1
168da2e3ebdSchin	#define _ast_int8_t	long
169da2e3ebdSchin	#define _ast_int8_str	"long"
170da2e3ebdSchin	#endif
171da2e3ebdSchin	#if N == 2
172da2e3ebdSchin	#define _ast_int8_t	long long
173da2e3ebdSchin	#define _ast_int8_str	"long long"
174da2e3ebdSchin	#endif
175da2e3ebdSchin	#if N == 3
176da2e3ebdSchin	#define _ast_int8_t	__int64
177da2e3ebdSchin	#define _ast_int8_str	"__int64"
178da2e3ebdSchin	#endif
179da2e3ebdSchin	#if N == 4
180da2e3ebdSchin	#define _ast_int8_t	__int64_t
181da2e3ebdSchin	#define _ast_int8_str	"__int64_t"
182da2e3ebdSchin	#endif
183da2e3ebdSchin	#if N == 5
184da2e3ebdSchin	#define _ast_int8_t	_int64_t
185da2e3ebdSchin	#define _ast_int8_str	"_int64_t"
186da2e3ebdSchin	#endif
187da2e3ebdSchin	#if N == 6
188da2e3ebdSchin	#define _ast_int8_t	int64_t
189da2e3ebdSchin	#define _ast_int8_str	"int64_t"
190da2e3ebdSchin	#endif
191da2e3ebdSchin	#if N == 7
192da2e3ebdSchin	#define _ast_int8_t	_int64
193da2e3ebdSchin	#define _ast_int8_str	"_int64"
194da2e3ebdSchin	#endif
195da2e3ebdSchin	#if N == 8
196da2e3ebdSchin	#define _ast_int8_t	int64
197da2e3ebdSchin	#define _ast_int8_str	"int64"
198da2e3ebdSchin	#endif
199da2e3ebdSchin	#endif
200da2e3ebdSchin
201da2e3ebdSchin	#define elementsof(x)	(sizeof(x)/sizeof(x[0]))
202da2e3ebdSchin
203da2e3ebdSchin	static char			i_char = 1;
204da2e3ebdSchin	static short			i_short = 1;
205da2e3ebdSchin	static int			i_int = 1;
206da2e3ebdSchin	static long			i_long = 1L;
207da2e3ebdSchin	#ifdef _ast_int8_t
208da2e3ebdSchin	#if _ast_LL
209da2e3ebdSchin	static _ast_int8_t		i_long_long = 1LL;
210da2e3ebdSchin	static unsigned _ast_int8_t	u_long_long = 18446744073709551615ULL;
211da2e3ebdSchin	#else
212da2e3ebdSchin	static _ast_int8_t		i_long_long = 1;
213da2e3ebdSchin	static unsigned _ast_int8_t	u_long_long = 18446744073709551615;
214da2e3ebdSchin	#endif
215da2e3ebdSchin	#endif
216da2e3ebdSchin
217da2e3ebdSchin	static struct
218da2e3ebdSchin	{
219da2e3ebdSchin		char*	name;
220da2e3ebdSchin		int	size;
221da2e3ebdSchin		char*	swap;
222da2e3ebdSchin	} int_type[] =
223da2e3ebdSchin	{
224da2e3ebdSchin		"char",		sizeof(char),		(char*)&i_char,
225da2e3ebdSchin		"short",	sizeof(short),		(char*)&i_short,
226da2e3ebdSchin		"int",		sizeof(int),		(char*)&i_int,
227da2e3ebdSchin		"long",		sizeof(long),		(char*)&i_long,
228da2e3ebdSchin	#ifdef _ast_int8_t
229da2e3ebdSchin		_ast_int8_str,	sizeof(_ast_int8_t),	(char*)&i_long_long,
230da2e3ebdSchin	#endif
231da2e3ebdSchin	};
232da2e3ebdSchin
233da2e3ebdSchin	static int	int_size[] = { 1, 2, 4, 8 };
234da2e3ebdSchin
235da2e3ebdSchin	int
236da2e3ebdSchin	main()
237da2e3ebdSchin	{
238da2e3ebdSchin		register int	t;
239da2e3ebdSchin		register int	s;
240da2e3ebdSchin		register int	m = 1;
241da2e3ebdSchin		register int	b = 1;
242da2e3ebdSchin		register int	w = 0;
243da2e3ebdSchin
244da2e3ebdSchin	#ifdef _ast_int8_t
245da2e3ebdSchin		unsigned _ast_int8_t	p;
246da2e3ebdSchin		char			buf[64];
247da2e3ebdSchin
248da2e3ebdSchin		if (int_type[elementsof(int_type)-1].size <= 4)
249da2e3ebdSchin			return 1;
250da2e3ebdSchin		p = 0x12345678;
251da2e3ebdSchin		p <<= 32;
252da2e3ebdSchin		p |= 0x9abcdef0;
253da2e3ebdSchin		sprintf(buf, "0x%016llx", p);
254da2e3ebdSchin		if (strcmp(buf, "0x123456789abcdef0"))
255da2e3ebdSchin			return 1;
256da2e3ebdSchin	#endif
257da2e3ebdSchin		for (s = 0; s < elementsof(int_size); s++)
258da2e3ebdSchin		{
259da2e3ebdSchin			for (t = 0; t < elementsof(int_type) && int_type[t].size < int_size[s]; t++);
260da2e3ebdSchin			if (t < elementsof(int_type))
261da2e3ebdSchin			{
262da2e3ebdSchin				m = int_size[s];
263da2e3ebdSchin	#if __INTERIX
264da2e3ebdSchin				if (m == 8)
265da2e3ebdSchin				{
266da2e3ebdSchin					printf("#ifdef _MSC_VER\n");
267da2e3ebdSchin					printf("#define _ast_int8_t	__int64\n");
268da2e3ebdSchin					printf("#else\n");
269da2e3ebdSchin					printf("#define _ast_int8_t	long long\n");
270da2e3ebdSchin					printf("#endif\n");
271da2e3ebdSchin				}
272da2e3ebdSchin				else
273da2e3ebdSchin	#endif
274da2e3ebdSchin				printf("#define _ast_int%d_t		%s\n", m, int_type[t].name);
275da2e3ebdSchin				if (m > 1)
276da2e3ebdSchin				{
277da2e3ebdSchin					if (*int_type[t].swap)
278da2e3ebdSchin						w |= b;
279da2e3ebdSchin					b <<= 1;
280da2e3ebdSchin				}
281da2e3ebdSchin			}
282da2e3ebdSchin		}
283da2e3ebdSchin		printf("#define _ast_intmax_t		_ast_int%d_t\n", m);
284da2e3ebdSchin		if (m == sizeof(long))
285da2e3ebdSchin			printf("#define _ast_intmax_long		1\n");
286da2e3ebdSchin		printf("#define _ast_intswap		%d\n", w);
287da2e3ebdSchin		printf("\n");
288da2e3ebdSchin		return 0;
289da2e3ebdSchin	}
290da2e3ebdSchin}end
291da2e3ebdSchin
292*b30d1939SAndy Fiddamantst	- output{
293*b30d1939SAndy Fiddaman	#include <string.h>
294*b30d1939SAndy Fiddaman	#include <sys/types.h>
295*b30d1939SAndy Fiddaman
296*b30d1939SAndy Fiddaman	#if _X86_ || _X64_
297*b30d1939SAndy Fiddaman	#define COND		1
298*b30d1939SAndy Fiddaman	#define CONDNAME	"_X64_"
299*b30d1939SAndy Fiddaman	#else
300*b30d1939SAndy Fiddaman	#define COND		0
301*b30d1939SAndy Fiddaman	#endif
302*b30d1939SAndy Fiddaman
303*b30d1939SAndy Fiddaman	#define elementsof(x)	(sizeof(x)/sizeof(x[0]))
304*b30d1939SAndy Fiddaman
305*b30d1939SAndy Fiddaman	static struct
306*b30d1939SAndy Fiddaman	{
307*b30d1939SAndy Fiddaman		char*	name;
308*b30d1939SAndy Fiddaman		int	size;
309*b30d1939SAndy Fiddaman		int	cond;
310*b30d1939SAndy Fiddaman	} types[] =
311*b30d1939SAndy Fiddaman	{
312*b30d1939SAndy Fiddaman		"short",	sizeof(short),		0,
313*b30d1939SAndy Fiddaman		"int",		sizeof(int),		0,
314*b30d1939SAndy Fiddaman		"long",		sizeof(long),		0,
315*b30d1939SAndy Fiddaman		"size_t",	sizeof(size_t),		0,
316*b30d1939SAndy Fiddaman		"pointer",	sizeof(void*),		COND * 4,
317*b30d1939SAndy Fiddaman		"float",	sizeof(float),		0,
318*b30d1939SAndy Fiddaman		"double",	sizeof(double),		0,
319*b30d1939SAndy Fiddaman	#ifdef _typ_long_double
320*b30d1939SAndy Fiddaman		"long_double",	sizeof(long double),	0,
321*b30d1939SAndy Fiddaman	#endif
322*b30d1939SAndy Fiddaman	};
323*b30d1939SAndy Fiddaman
324*b30d1939SAndy Fiddaman	int
325*b30d1939SAndy Fiddaman	main()
326*b30d1939SAndy Fiddaman	{
327*b30d1939SAndy Fiddaman		register int	t;
328*b30d1939SAndy Fiddaman
329*b30d1939SAndy Fiddaman		for (t = 0; t < elementsof(types); t++)
330*b30d1939SAndy Fiddaman	#if COND
331*b30d1939SAndy Fiddaman			if (types[t].cond)
332*b30d1939SAndy Fiddaman			{
333*b30d1939SAndy Fiddaman				printf("#if %s\n", CONDNAME);
334*b30d1939SAndy Fiddaman				printf("#define _ast_sizeof_%s%s	%d	/* sizeof(%s) */\n", types[t].name, strlen(types[t].name) < 4 ? "\t" : "", types[t].cond * 2, types[t].name);
335*b30d1939SAndy Fiddaman				printf("#else\n");
336*b30d1939SAndy Fiddaman				printf("#define _ast_sizeof_%s%s	%d	/* sizeof(%s) */\n", types[t].name, strlen(types[t].name) < 4 ? "\t" : "", types[t].cond, types[t].name);
337*b30d1939SAndy Fiddaman				printf("#endif\n");
338*b30d1939SAndy Fiddaman			}
339*b30d1939SAndy Fiddaman			else
340*b30d1939SAndy Fiddaman	#endif
341*b30d1939SAndy Fiddaman				printf("#define _ast_sizeof_%s%s	%d	/* sizeof(%s) */\n", types[t].name, strlen(types[t].name) < 4 ? "\t" : "", types[t].size, types[t].name);
342*b30d1939SAndy Fiddaman		printf("\n");
343*b30d1939SAndy Fiddaman		return 0;
344*b30d1939SAndy Fiddaman	}
345*b30d1939SAndy Fiddaman}end
346*b30d1939SAndy Fiddaman
347da2e3ebdSchintst	- -DN=1 - -DN=0 output{
348da2e3ebdSchin	#define _BYTESEX_H
349da2e3ebdSchin
350da2e3ebdSchin	#include <string.h>
351da2e3ebdSchin	#include <sys/types.h>
352da2e3ebdSchin
353da2e3ebdSchin	#if !N || !_STD_
354da2e3ebdSchin	#undef	_typ_long_double
355da2e3ebdSchin	#endif
356da2e3ebdSchin
357da2e3ebdSchin	#define elementsof(x)	(sizeof(x)/sizeof(x[0]))
358da2e3ebdSchin
359da2e3ebdSchin	static struct
360da2e3ebdSchin	{
361da2e3ebdSchin		char*	name;
362da2e3ebdSchin		int	size;
363da2e3ebdSchin	} flt_type[] =
364da2e3ebdSchin	{
365da2e3ebdSchin		"float",	sizeof(float),
366da2e3ebdSchin		"double",	sizeof(double),
367da2e3ebdSchin	#ifdef _typ_long_double
368da2e3ebdSchin		"long double",	sizeof(long double),
369da2e3ebdSchin	#endif
370da2e3ebdSchin	};
371da2e3ebdSchin
372da2e3ebdSchin	int
373da2e3ebdSchin	main()
374da2e3ebdSchin	{
375da2e3ebdSchin		register int	t;
376da2e3ebdSchin		register int	m = 1;
377da2e3ebdSchin
378da2e3ebdSchin	#ifdef _typ_long_double
379da2e3ebdSchin		long double	p;
380da2e3ebdSchin		char		buf[64];
381da2e3ebdSchin
382da2e3ebdSchin		if (flt_type[elementsof(flt_type)-1].size <= sizeof(double))
383da2e3ebdSchin			return 1;
384da2e3ebdSchin		p = 1.12345E-55;
385da2e3ebdSchin		sprintf(buf, "%1.5LE", p);
386da2e3ebdSchin		if (strcmp(buf, "1.12345E-55"))
387da2e3ebdSchin			return 1;
388da2e3ebdSchin	#endif
389da2e3ebdSchin		for (t = 0; t < elementsof(flt_type); t++)
390da2e3ebdSchin		{
391da2e3ebdSchin			while (t < (elementsof(flt_type) - 1) && flt_type[t].size == flt_type[t + 1].size)
392da2e3ebdSchin				t++;
393da2e3ebdSchin			m = flt_type[t].size;
394da2e3ebdSchin			printf("#define _ast_flt%d_t		%s\n", flt_type[t].size, flt_type[t].name);
395da2e3ebdSchin		}
396da2e3ebdSchin		printf("#define _ast_fltmax_t		_ast_flt%d_t\n", m);
397da2e3ebdSchin		if (m == sizeof(double))
398da2e3ebdSchin			printf("#define _ast_fltmax_double		1\n");
399da2e3ebdSchin		return 0;
400da2e3ebdSchin	}
401da2e3ebdSchin}end
402da2e3ebdSchin
403da2e3ebdSchintyp int8_t stdint.h inttypes.h no{
404da2e3ebdSchin	#undef	_typ_int8_t
405da2e3ebdSchin	#define	_typ_int8_t	1
406da2e3ebdSchin	typedef _ast_int1_t int8_t;
407da2e3ebdSchin}end
408da2e3ebdSchintyp uint8_t stdint.h inttypes.h no{
409da2e3ebdSchin	#undef	_typ_uint8_t
410da2e3ebdSchin	#define	_typ_uint8_t	1
411da2e3ebdSchin	typedef unsigned _ast_int1_t uint8_t;
412da2e3ebdSchin}end
413da2e3ebdSchintyp int16_t stdint.h inttypes.h no{
414da2e3ebdSchin	#undef	_typ_int16_t
415da2e3ebdSchin	#define	_typ_int16_t	1
416da2e3ebdSchin	typedef _ast_int2_t int16_t;
417da2e3ebdSchin}end
418da2e3ebdSchintyp uint16_t stdint.h inttypes.h no{
419da2e3ebdSchin	#undef	_typ_uint16_t
420da2e3ebdSchin	#define	_typ_uint16_t	1
421da2e3ebdSchin	typedef unsigned _ast_int2_t uint16_t;
422da2e3ebdSchin}end
423da2e3ebdSchintyp int32_t stdint.h inttypes.h no{
424da2e3ebdSchin	#undef	_typ_int32_t
425da2e3ebdSchin	#define	_typ_int32_t	1
426da2e3ebdSchin	typedef _ast_int4_t int32_t;
427da2e3ebdSchin}end
428da2e3ebdSchintyp uint32_t stdint.h inttypes.h no{
429da2e3ebdSchin	#undef	_typ_uint32_t
430da2e3ebdSchin	#define	_typ_uint32_t	1
431da2e3ebdSchin	typedef unsigned _ast_int4_t uint32_t;
432da2e3ebdSchin}end
433da2e3ebdSchintyp int64_t stdint.h inttypes.h no{
434da2e3ebdSchin	#ifdef _ast_int8_t
435da2e3ebdSchin	#undef	_typ_int64_t
436da2e3ebdSchin	#define	_typ_int64_t	1
437da2e3ebdSchin	typedef _ast_int8_t int64_t;
438da2e3ebdSchin	#endif
439da2e3ebdSchin}end
440da2e3ebdSchintyp uint64_t stdint.h inttypes.h no{
441da2e3ebdSchin	#ifdef _ast_int8_t
442da2e3ebdSchin	#undef	_typ_uint64_t
443da2e3ebdSchin	#define	_typ_uint64_t	1
444da2e3ebdSchin	typedef unsigned _ast_int8_t uint64_t;
445da2e3ebdSchin	#endif
446da2e3ebdSchin}end
447da2e3ebdSchintyp intmax_t stdint.h inttypes.h no{
448*b30d1939SAndy Fiddaman	#undef	_typ_intmax_t
449*b30d1939SAndy Fiddaman	#define	_typ_intmax_t	1
450da2e3ebdSchin	typedef _ast_intmax_t intmax_t;
451da2e3ebdSchin}end
452da2e3ebdSchintyp uintmax_t stdint.h inttypes.h no{
453*b30d1939SAndy Fiddaman	#undef	_typ_uintmax_t
454*b30d1939SAndy Fiddaman	#define	_typ_uintmax_t	1
455da2e3ebdSchin	typedef unsigned _ast_intmax_t uintmax_t;
456da2e3ebdSchin}end
457*b30d1939SAndy Fiddamantyp uintptr_t stdint.h inttypes.h no{
458*b30d1939SAndy Fiddaman	#undef	_typ_uintptr_t
459*b30d1939SAndy Fiddaman	#define	_typ_uintptr_t	1
460*b30d1939SAndy Fiddaman	#if _ast_sizeof_pointer == 8 && defined(_ast_int8_t)
461*b30d1939SAndy Fiddaman	typedef unsigned _ast_int8_t uintptr_t;
462*b30d1939SAndy Fiddaman	#else
463*b30d1939SAndy Fiddaman	typedef unsigned _ast_int4_t uintptr_t;
464*b30d1939SAndy Fiddaman	#endif
465*b30d1939SAndy Fiddaman}end
466da2e3ebdSchin
467da2e3ebdSchintst	- -DTRY=1 - -DTRY=1 -Dvoid=char - -DTRY=2 - -DTRY=3 - -DTRY=4 output{
468da2e3ebdSchin	#if _STD_ && _hdr_stdarg
469da2e3ebdSchin	#include <stdarg.h>
470da2e3ebdSchin	static void
471da2e3ebdSchin	varyfunny(int* p, ...)
472da2e3ebdSchin	{
473da2e3ebdSchin		va_list	ap;
474da2e3ebdSchin		va_start(ap, p);
475da2e3ebdSchin	#if TRY == 1
476da2e3ebdSchin		*p = *ap++ != 0;
477da2e3ebdSchin	#endif /*TRY == 1*/
478da2e3ebdSchin	#if TRY == 2
479da2e3ebdSchin		*p = *ap != 0;
480da2e3ebdSchin	#endif /*TRY == 2*/
481da2e3ebdSchin	#if TRY == 3
482da2e3ebdSchin		*p = ap++ != 0;
483da2e3ebdSchin	#endif /*TRY == 3*/
484da2e3ebdSchin		va_end(ap);
485da2e3ebdSchin	}
486da2e3ebdSchin	#else
487da2e3ebdSchin	#include <varargs.h>
488da2e3ebdSchin	static void
489da2e3ebdSchin	varyfunny(va_alist)
490da2e3ebdSchin	va_dcl
491da2e3ebdSchin	{
492da2e3ebdSchin		va_list	ap;
493da2e3ebdSchin		int*	p;
494da2e3ebdSchin		va_start(ap);
495da2e3ebdSchin		p = va_arg(ap, int*);
496da2e3ebdSchin	#if TRY == 1
497da2e3ebdSchin		*p = *ap++ != 0;
498da2e3ebdSchin	#endif /*TRY == 1*/
499da2e3ebdSchin	#if TRY == 2
500da2e3ebdSchin		*p = *ap != 0;
501da2e3ebdSchin	#endif /*TRY == 2*/
502da2e3ebdSchin	#if TRY == 3
503da2e3ebdSchin		*p = ap++ != 0;
504da2e3ebdSchin	#endif /*TRY == 3*/
505da2e3ebdSchin		va_end(ap);
506da2e3ebdSchin	}
507da2e3ebdSchin	#endif
508da2e3ebdSchin	int
509da2e3ebdSchin	main()
510da2e3ebdSchin	{
511da2e3ebdSchin		int	r;
51234f9b3eeSRoland Mainz
513da2e3ebdSchin		printf("\n#ifndef va_listref\n");
51434f9b3eeSRoland Mainz		printf("#ifndef	va_start\n");
51534f9b3eeSRoland Mainz		printf("#if __STD_C\n");
51634f9b3eeSRoland Mainz		printf("#include <stdarg.h>\n");
51734f9b3eeSRoland Mainz		printf("#else\n");
51834f9b3eeSRoland Mainz		printf("#include <varargs.h>\n");
51934f9b3eeSRoland Mainz		printf("#endif\n");
52034f9b3eeSRoland Mainz		printf("#endif\n");
521da2e3ebdSchin	#if TRY == 4
522da2e3ebdSchin		printf("#define va_listref(p) (&(p))\t");
523da2e3ebdSchin			printf("/* pass va_list to varargs function */\n");
524da2e3ebdSchin		printf("#define va_listval(p) (*(p))\t");
525da2e3ebdSchin			printf("/* retrieve va_list from va_arg(ap,va_listarg) */\n");
526da2e3ebdSchin		printf("#define va_listarg va_list*\t");
527da2e3ebdSchin			printf("/* va_arg() va_list type */\n");
528da2e3ebdSchin	#else
529da2e3ebdSchin		varyfunny(&r);
530da2e3ebdSchin		printf("#define va_listref(p) (p)\t");
531da2e3ebdSchin			printf("/* pass va_list to varargs function */\n");
532da2e3ebdSchin		if (sizeof(va_list) > sizeof(void*))
533da2e3ebdSchin			printf("#define va_listval(p) (*(p))\t");
534da2e3ebdSchin		else
535da2e3ebdSchin			printf("#define va_listval(p) (p)\t");
536da2e3ebdSchin			printf("/* retrieve va_list from va_arg(ap,va_listarg) */\n");
537da2e3ebdSchin	#if TRY == 2
538da2e3ebdSchin		printf("#define va_listarg va_list*\t");
539da2e3ebdSchin	#else
540da2e3ebdSchin		printf("#define va_listarg va_list\t");
541da2e3ebdSchin	#endif /*TRY == 2*/
542da2e3ebdSchin			printf("/* va_arg() va_list type */\n");
543da2e3ebdSchin	#endif /*TRY == 4*/
544da2e3ebdSchin
545da2e3ebdSchin	#if _UWIN
546da2e3ebdSchin		printf("#ifndef va_copy\n");
547da2e3ebdSchin		printf("#define va_copy(to,fr) ((to)=(fr))\t");
548da2e3ebdSchin			printf("/* copy va_list fr -> to */\n");
549da2e3ebdSchin		printf("#endif\n");
550da2e3ebdSchin	#else
551da2e3ebdSchin	#if !defined(va_copy)
552da2e3ebdSchin	#if defined(__va_copy)
553da2e3ebdSchin		printf("#ifndef va_copy\n");
554da2e3ebdSchin		printf("#define va_copy(to,fr) __va_copy(to,fr)\t");
555da2e3ebdSchin			printf("/* copy va_list fr -> to */\n");
556da2e3ebdSchin		printf("#endif\n");
557da2e3ebdSchin	#else
558da2e3ebdSchin	#if TRY == 2
559da2e3ebdSchin		printf("#ifndef va_copy\n");
560da2e3ebdSchin		printf("#define va_copy(to,fr) memcpy(to,fr,sizeof(va_list))\t");
561da2e3ebdSchin			printf("/* copy va_list fr -> to */\n");
562da2e3ebdSchin		printf("#endif\n");
563da2e3ebdSchin	#else
564da2e3ebdSchin		printf("#ifndef va_copy\n");
565da2e3ebdSchin		printf("#define va_copy(to,fr) ((to)=(fr))\t");
566da2e3ebdSchin			printf("/* copy va_list fr -> to */\n");
567da2e3ebdSchin		printf("#endif\n");
568da2e3ebdSchin	#endif
569da2e3ebdSchin	#endif
570da2e3ebdSchin	#endif
571da2e3ebdSchin	#endif
572da2e3ebdSchin
573da2e3ebdSchin		printf("#endif\n");
574da2e3ebdSchin		return 0;
575da2e3ebdSchin	}
576da2e3ebdSchin}end
577da2e3ebdSchin
578da2e3ebdSchincat{
579da2e3ebdSchin	#ifndef _AST_STD_H
580da2e3ebdSchin	#	if __STD_C && _hdr_stddef
581da2e3ebdSchin	#	include	<stddef.h>
582da2e3ebdSchin	#	endif
583da2e3ebdSchin	#	if _sys_types
584da2e3ebdSchin	#	include	<sys/types.h>
585da2e3ebdSchin	#	endif
586da2e3ebdSchin	#	if _hdr_stdint
587da2e3ebdSchin	#	include	<stdint.h>
588da2e3ebdSchin	#	else
589da2e3ebdSchin	#		if _hdr_inttypes
590da2e3ebdSchin	#		include	<inttypes.h>
591da2e3ebdSchin	#		endif
592da2e3ebdSchin	#	endif
593da2e3ebdSchin	#endif
594da2e3ebdSchin	#if !_typ_size_t
595da2e3ebdSchin	#	define _typ_size_t	1
596da2e3ebdSchin		typedef int size_t;
597da2e3ebdSchin	#endif
598da2e3ebdSchin	#if !_typ_ssize_t
599da2e3ebdSchin	#	define _typ_ssize_t	1
600da2e3ebdSchin		typedef int ssize_t;
601da2e3ebdSchin	#endif
602da2e3ebdSchin	#ifndef _AST_STD_H
603da2e3ebdSchin	#	define _def_map_ast	1
604da2e3ebdSchin	#	if !_def_map_ast
605da2e3ebdSchin	#		include <ast_map.h>
606da2e3ebdSchin	#	endif
607da2e3ebdSchin	#endif
608da2e3ebdSchin}end
609da2e3ebdSchin
610da2e3ebdSchinrun{
611da2e3ebdSchin	grep __NO_INCLUDE_WARN__ /usr/include/stat.h >/dev/null 2>&1 &&
612da2e3ebdSchin	grep '<name.h>' /usr/include/sys/stat.h >/dev/null 2>&1 &&
613da2e3ebdSchin	grep __name_h /usr/include/name.h >/dev/null 2>&1 &&
614da2e3ebdSchin	cat <<!
615da2e3ebdSchin	/* disable ${HOSTTYPE} <sys/foo.h> vs. <foo.h> clash warnings */
616da2e3ebdSchin	#ifndef __NO_INCLUDE_WARN__
617da2e3ebdSchin	#define __NO_INCLUDE_WARN__	1
618da2e3ebdSchin	#endif
619da2e3ebdSchin	/* disable ${HOSTTYPE} <sys/stat.h> <name.h> hijack */
620da2e3ebdSchin	#ifndef __name_h
621da2e3ebdSchin	#define __name_h		1
622da2e3ebdSchin	#endif
623da2e3ebdSchin	!
624da2e3ebdSchin}end
625