Initial revision
[kopensolaris-gnu/glibc.git] / sysdeps / generic / varargs.h
1 /* Copyright (C) 1991 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 1, or (at your option)
7 any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with the GNU C Library; see the file COPYING.  If not, write to
16 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
17
18 #ifndef _VARARGS_H
19
20 #define _VARARGS_H      1
21 #include <features.h>
22
23 #ifdef  __GNUC__
24
25 #define va_alist  __builtin_va_alist
26 #define va_dcl    int __builtin_va_alist;
27 #define va_list   char *
28
29 #ifdef __sparc__
30 #define va_start(AP)                                            \
31  (__builtin_saveregs (),                                        \
32   AP = ((void *) &__builtin_va_alist))
33 #else
34 #define va_start(AP)  AP=(char *) &__builtin_va_alist
35 #endif
36 #define va_end(AP)
37
38 #define __va_rounded_size(TYPE)  \
39   (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
40
41 #define va_arg(AP, TYPE)                                        \
42  (*((TYPE *) (AP += __va_rounded_size (TYPE),                   \
43               AP - __va_rounded_size (TYPE))))
44
45 #else   /* Not GCC.  */
46
47 /* Implement varargs on top of our stdarg implementation.  */
48
49 #include <stdarg.h>
50
51 #define va_alist        __va_fakearg
52 #define va_dcl          int __va_fakearg;
53
54 #undef  va_start
55 #define va_start(ap)    (__va_start((ap), __va_fakearg), \
56                          (ap) -= sizeof(__va_fakearg))
57
58 #endif  /* GCC.  */
59
60 #endif  /* varargs.h  */