summaryrefslogtreecommitdiff
path: root/include/vadefs.h
blob: a686074f62ebb067d0bf14e7fc55856670e0fd23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * This file has been modified for the cdrkit suite.
 *
 * The behaviour and appearence of the program code below can differ to a major
 * extent from the version distributed by the original author(s).
 *
 * For details, see Changelog file distributed with the cdrkit package. If you
 * received this file from another source then ask the distributing person for
 * a log of modifications.
 *
 */

/* @(#)vadefs.h	1.5 01/07/15 Copyright 1998 J. Schilling */
/*
 *	Generic header for users of var args ...
 *
 *	Includes a default definition for va_copy()
 *	and some magic know how about the SVr4 Power PC var args ABI
 *	to create a __va_arg_list() macro.
 *
 *	Copyright (c) 1998 J. Schilling
 */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; see the file COPYING.  If not, write to the Free Software
 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef	_VADEFS_H
#define	_VADEFS_H

#ifndef	_MCONFIG_H
#include <mconfig.h>
#endif

#ifdef	PROTOTYPES
/*
 * For ANSI C-compilers prefer stdarg.h
 */
#	ifdef	HAVE_STDARG_H
#		ifndef	_INCL_STDARG_H
#		include <stdarg.h>
#		define	_INCL_STDARG_H
#		endif
#	else
#		ifndef	_INCL_VARARGS_H
#		include <varargs.h>
#		define	_INCL_VARARGS_H
#		endif
#	endif
#else
/*
 * For K&R C-compilers prefer varargs.h
 */
#	ifdef	HAVE_VARARGS_H
#		ifndef	_INCL_VARARGS_H
#		include <varargs.h>
#		define	_INCL_VARARGS_H
#		endif
#	else
#		ifndef	_INCL_STDARG_H
#		include <stdarg.h>
#		define	_INCL_STDARG_H
#		endif
#	endif
#endif

#if (defined(__linux__) || defined(__linux) || defined(sun)) && \
		(defined(__ppc) || defined(__PPC) || defined(powerpc) || defined(__powerpc__))

#	ifndef	VA_LIST_IS_ARRAY
#	define	VA_LIST_IS_ARRAY
#	endif
#endif


/*
 * __va_copy() is used by GCC 2.8 or newer until va_copy() becomes
 * a final ISO standard.
 */
#if !defined(va_copy) && !defined(HAVE_VA_COPY)
#	if	defined(__va_copy)
#		define	va_copy(to, from)	__va_copy(to, from)
#	endif
#endif

/*
 * va_copy() is a Solaris extension to provide a portable way to perform a
 * variable argument list "bookmarking" function.
 * If it is not available via stdarg.h, use a simple assignement for backward
 * compatibility.
 */
#if !defined(va_copy) && !defined(HAVE_VA_COPY)
#ifdef	VA_LIST_IS_ARRAY
#	define	va_copy(to, from)	((to)[0] = (from)[0])
#else
#	define	va_copy(to, from)	((to) = (from))
#endif
#endif

/*
 * I don't know any portable way to get an arbitrary
 * C object from a var arg list so I use a
 * system-specific routine __va_arg_list() that knows
 * if 'va_list' is an array. You will not be able to
 * assign the value of __va_arg_list() but it works
 * to be used as an argument of a function.
 * It is a requirement for recursive printf to be able
 * to use this function argument. If your system
 * defines va_list to be an array you need to know this
 * via autoconf or another mechanism.
 * It would be nice to have something like
 * __va_arg_list() in stdarg.h
 */

#ifdef	VA_LIST_IS_ARRAY
#	define	__va_arg_list(list)	va_arg(list, void *)
#else
#	define	__va_arg_list(list)	va_arg(list, va_list)
#endif

#endif	/* _VADEFS_H */