Fixed va_arg() to work for small args (as in stdarg.h).

This commit is contained in:
Bruce Evans 1997-06-21 16:20:55 +00:00
parent 8a77722ad7
commit c8f8a520f6
2 changed files with 12 additions and 18 deletions

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)varargs.h 8.2 (Berkeley) 3/22/94 * @(#)varargs.h 8.2 (Berkeley) 3/22/94
* $Id: varargs.h,v 1.5 1997/02/22 09:35:22 peter Exp $ * $Id: varargs.h,v 1.6 1997/02/28 07:12:34 bde Exp $
*/ */
#ifndef _VARARGS_H_ #ifndef _VARARGS_H_
@ -44,6 +44,9 @@
typedef char *va_list; typedef char *va_list;
#define __va_size(type) \
(((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
#ifdef __GNUC__ #ifdef __GNUC__
#define va_alist __builtin_va_alist #define va_alist __builtin_va_alist
#endif #endif
@ -54,16 +57,10 @@ typedef char *va_list;
#endif #endif
#define va_start(ap) \ #define va_start(ap) \
ap = (char *)&va_alist ((ap) = (va_list)&va_alist)
#ifdef KERNEL
#define va_arg(ap, type) \ #define va_arg(ap, type) \
((type *)(ap += sizeof(type)))[-1] (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
#else
#define va_arg(ap, type) \
((type *)(ap += sizeof(type) < sizeof(int) ? \
(abort(), 0) : sizeof(type)))[-1]
#endif
#define va_end(ap) #define va_end(ap)

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)varargs.h 8.2 (Berkeley) 3/22/94 * @(#)varargs.h 8.2 (Berkeley) 3/22/94
* $Id: varargs.h,v 1.5 1997/02/22 09:35:22 peter Exp $ * $Id: varargs.h,v 1.6 1997/02/28 07:12:34 bde Exp $
*/ */
#ifndef _VARARGS_H_ #ifndef _VARARGS_H_
@ -44,6 +44,9 @@
typedef char *va_list; typedef char *va_list;
#define __va_size(type) \
(((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
#ifdef __GNUC__ #ifdef __GNUC__
#define va_alist __builtin_va_alist #define va_alist __builtin_va_alist
#endif #endif
@ -54,16 +57,10 @@ typedef char *va_list;
#endif #endif
#define va_start(ap) \ #define va_start(ap) \
ap = (char *)&va_alist ((ap) = (va_list)&va_alist)
#ifdef KERNEL
#define va_arg(ap, type) \ #define va_arg(ap, type) \
((type *)(ap += sizeof(type)))[-1] (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
#else
#define va_arg(ap, type) \
((type *)(ap += sizeof(type) < sizeof(int) ? \
(abort(), 0) : sizeof(type)))[-1]
#endif
#define va_end(ap) #define va_end(ap)