Fixed va_arg() to work for small args (as in stdarg.h).
This commit is contained in:
parent
8a77722ad7
commit
c8f8a520f6
@ -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)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user