Add va_copy() implementation (thanks to Chris Torek's comp.lang.c post).
authorJeroen Ruigrok/asmodai <asmodai@dragonflybsd.org>
Mon, 7 Mar 2005 06:26:47 +0000 (06:26 +0000)
committerJeroen Ruigrok/asmodai <asmodai@dragonflybsd.org>
Mon, 7 Mar 2005 06:26:47 +0000 (06:26 +0000)
Properly wrap all other definitions so that it catches all GCC 2.95.x and
upwards compilers.

Provide complete free-standing implementation for compilers that do not
implement the GCC built-ins.

include/stdarg.h
sys/amd64/include/stdarg.h
sys/cpu/i386/include/stdarg.h
sys/i386/include/stdarg.h

index 9ab0dd4..d06a364 100644 (file)
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/include/stdarg.h,v 1.1 2003/11/09 02:22:28 dillon Exp $
+ * $DragonFly: src/include/stdarg.h,v 1.2 2005/03/07 06:26:47 asmodai Exp $
  */
 
 #ifndef _STDARG_H_
@@ -37,6 +37,9 @@ typedef       __va_list       va_list;
 
 #define va_start(ap, last)     __va_start(ap, last)
 #define va_arg(ap, type)       __va_arg(ap, type)
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+#define va_copy(dest, src)     __va_copy(dest, src)
+#endif
 #define va_end(ap)             __va_end(ap)
 
 #endif
index f47b270..7a364c0 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)stdarg.h    8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/i386/include/stdarg.h,v 1.10 1999/08/28 00:44:26 peter Exp $
- * $DragonFly: src/sys/amd64/include/Attic/stdarg.h,v 1.1 2004/02/02 08:05:52 dillon Exp $
+ * $DragonFly: src/sys/amd64/include/Attic/stdarg.h,v 1.2 2005/03/07 06:26:47 asmodai Exp $
  */
 
 #ifndef _MACHINE_STDARG_H_
@@ -58,30 +58,49 @@ typedef __va_list           __gnuc_va_list; /* compatibility w/GNU headers*/
        (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
 
 #ifdef __GNUC__
+
+#if __GNUC__ == 2
+#define __va_start(ap, last) \
+       ((ap) = (__va_list)__builtin_next_arg(last))
+#define __va_arg(ap, type) \
+       (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+#define __va_copy(dest, src) \
+       ((void)((dest) = (src)))
+#endif
+#define __va_end(ap)
+#elif __GNUC__ >= 3
+#if __GNUC_MINOR__ >= 0 && __GNUC_MINOR__ <= 2
 #define __va_start(ap, last) \
        __builtin_stdarg_start((ap), (last))
-
+#elif __GNUC__ == 3 && __GNUC_MINOR__ >= 3
+#define __va_start(ap, last) \
+       __builtin_va_start(ap, last)
+#endif
 #define __va_arg(ap, type) \
        __builtin_va_arg((ap), type)
-
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
 #define __va_copy(dest, src) \
        __builtin_va_copy((dest), (src))
-
+#endif
 #define __va_end(ap) \
        __builtin_va_end(ap)
+#endif
 
-#elif defined(lint)
+#else /* !__GNUC__ */
 
-/* Provide a fake implementation for lint's benefit */
-#define __va_size(type) \
-       (((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long))
+/* Provide a free-standing implementation */
 #define __va_start(ap, last) \
        ((ap) = (__va_list)&(last) + __va_size(last))
 #define __va_arg(ap, type) \
        (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
-#define __va_end(ap)
-
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+/* This assumes a typical stack machine */
+#define __va_copy(dest, src) \
+       ((void)((dest) = (src)))
 #endif
+#define __va_end(ap)
 
-#endif
+#endif /* __GNUC__ */
 
+#endif /* !_MACHINE_STDARG_H_ */
index abd9968..88ffcb5 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)stdarg.h    8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/i386/include/stdarg.h,v 1.10 1999/08/28 00:44:26 peter Exp $
- * $DragonFly: src/sys/cpu/i386/include/stdarg.h,v 1.4 2003/11/09 02:22:35 dillon Exp $
+ * $DragonFly: src/sys/cpu/i386/include/stdarg.h,v 1.5 2005/03/07 06:26:47 asmodai Exp $
  */
 
 #ifndef _MACHINE_STDARG_H_
@@ -58,17 +58,49 @@ typedef __va_list           __gnuc_va_list; /* compatibility w/GNU headers*/
        (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
 
 #ifdef __GNUC__
+
+#if __GNUC__ == 2
 #define __va_start(ap, last) \
        ((ap) = (__va_list)__builtin_next_arg(last))
-#else
-#define        __va_start(ap, last) \
-       ((ap) = (__va_list)&(last) + __va_size(last))
-#endif
-
-#define        __va_arg(ap, type) \
+#define __va_arg(ap, type) \
        (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+#define __va_copy(dest, src) \
+       ((void)((dest) = (src)))
+#endif
+#define __va_end(ap)
+#elif __GNUC__ >= 3
+#if __GNUC_MINOR__ >= 0 && __GNUC_MINOR__ <= 2
+#define __va_start(ap, last) \
+       __builtin_stdarg_start((ap), (last))
+#elif __GNUC__ == 3 && __GNUC_MINOR__ >= 3
+#define __va_start(ap, last) \
+       __builtin_va_start(ap, last)
+#endif
+#define __va_arg(ap, type) \
+       __builtin_va_arg((ap), type)
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+#define __va_copy(dest, src) \
+       __builtin_va_copy((dest), (src))
+#endif
+#define __va_end(ap) \
+       __builtin_va_end(ap)
+#endif
 
-#define        __va_end(ap)
+#else /* !__GNUC__ */
 
+/* Provide a free-standing implementation */
+#define __va_start(ap, last) \
+       ((ap) = (__va_list)&(last) + __va_size(last))
+#define __va_arg(ap, type) \
+       (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+/* This assumes a typical stack machine */
+#define __va_copy(dest, src) \
+       ((void)((dest) = (src)))
 #endif
+#define __va_end(ap)
+
+#endif /* __GNUC__ */
 
+#endif /* !_MACHINE_STDARG_H_ */
index 02c88eb..ea61d26 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)stdarg.h    8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/i386/include/stdarg.h,v 1.10 1999/08/28 00:44:26 peter Exp $
- * $DragonFly: src/sys/i386/include/Attic/stdarg.h,v 1.4 2003/11/09 02:22:35 dillon Exp $
+ * $DragonFly: src/sys/i386/include/Attic/stdarg.h,v 1.5 2005/03/07 06:26:47 asmodai Exp $
  */
 
 #ifndef _MACHINE_STDARG_H_
@@ -58,17 +58,49 @@ typedef __va_list           __gnuc_va_list; /* compatibility w/GNU headers*/
        (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
 
 #ifdef __GNUC__
+
+#if __GNUC__ == 2
 #define __va_start(ap, last) \
        ((ap) = (__va_list)__builtin_next_arg(last))
-#else
-#define        __va_start(ap, last) \
-       ((ap) = (__va_list)&(last) + __va_size(last))
-#endif
-
-#define        __va_arg(ap, type) \
+#define __va_arg(ap, type) \
        (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+#define __va_copy(dest, src) \
+       ((void)((dest) = (src)))
+#endif
+#define __va_end(ap)
+#elif __GNUC__ >= 3
+#if __GNUC_MINOR__ >= 0 && __GNUC_MINOR__ <= 2
+#define __va_start(ap, last) \
+       __builtin_stdarg_start((ap), (last))
+#elif __GNUC__ == 3 && __GNUC_MINOR__ >= 3
+#define __va_start(ap, last) \
+       __builtin_va_start(ap, last)
+#endif
+#define __va_arg(ap, type) \
+       __builtin_va_arg((ap), type)
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+#define __va_copy(dest, src) \
+       __builtin_va_copy((dest), (src))
+#endif
+#define __va_end(ap) \
+       __builtin_va_end(ap)
+#endif
 
-#define        __va_end(ap)
+#else /* !__GNUC__ */
 
+/* Provide a free-standing implementation */
+#define __va_start(ap, last) \
+       ((ap) = (__va_list)&(last) + __va_size(last))
+#define __va_arg(ap, type) \
+       (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
+#if _POSIX_VERSION >= 200112L || __STDC_VERSION__ >= 199900L
+/* This assumes a typical stack machine */
+#define __va_copy(dest, src) \
+       ((void)((dest) = (src)))
 #endif
+#define __va_end(ap)
+
+#endif /* __GNUC__ */
 
+#endif /* !_MACHINE_STDARG_H_ */