Răsfoiți Sursa

respect iso c namespace in stdio.h and wchar.h regarding va_list

despite declaring functions that take arguments of type va_list, these
headers are not permitted by the c standard to expose the definition
of va_list, so an alias for the type must be used. the name
__isoc_va_list was chosen to convey that the purpose of this alternate
name is for iso c conformance, and to avoid the multitude of names
which gcc mangles with its hideous "fixincludes" monstrosity, leading
to serious header breakage if these "fixes" are run.
Rich Felker 11 ani în urmă
părinte
comite
a3e2f3c2b1

+ 1 - 0
arch/arm/bits/alltypes.h.sh

@@ -21,6 +21,7 @@ TYPEDEF int ssize_t;
 TYPEDEF int ptrdiff_t;
 
 TYPEDEF __builtin_va_list va_list;
+TYPEDEF __builtin_va_list __isoc_va_list;
 
 #ifndef __cplusplus
 TYPEDEF unsigned wchar_t;

+ 2 - 0
arch/i386/bits/alltypes.h.sh

@@ -22,8 +22,10 @@ TYPEDEF int ptrdiff_t;
 
 #if __GNUC__ >= 3
 TYPEDEF __builtin_va_list va_list;
+TYPEDEF __builtin_va_list __isoc_va_list;
 #else
 TYPEDEF struct __va_list * va_list;
+TYPEDEF struct __va_list * __isoc_va_list;
 #endif
 
 #ifndef __cplusplus

+ 1 - 0
arch/microblaze/bits/alltypes.h.sh

@@ -21,6 +21,7 @@ TYPEDEF int ssize_t;
 TYPEDEF int ptrdiff_t;
 
 TYPEDEF __builtin_va_list va_list;
+TYPEDEF __builtin_va_list __isoc_va_list;
 
 #ifndef __cplusplus
 TYPEDEF int wchar_t;

+ 1 - 0
arch/mips/bits/alltypes.h.sh

@@ -21,6 +21,7 @@ TYPEDEF int ssize_t;
 TYPEDEF int ptrdiff_t;
 
 TYPEDEF __builtin_va_list va_list;
+TYPEDEF __builtin_va_list __isoc_va_list;
 
 #ifndef __cplusplus
 TYPEDEF int wchar_t;

+ 1 - 0
arch/powerpc/bits/alltypes.h.sh

@@ -21,6 +21,7 @@ TYPEDEF int ssize_t;
 TYPEDEF int ptrdiff_t;
 
 TYPEDEF __builtin_va_list va_list;
+TYPEDEF __builtin_va_list __isoc_va_list;
 
 #ifndef __cplusplus
 TYPEDEF long wchar_t;

+ 1 - 0
arch/x86_64/bits/alltypes.h.sh

@@ -20,6 +20,7 @@ TYPEDEF unsigned long size_t;
 TYPEDEF long ssize_t;
 TYPEDEF long ptrdiff_t;
 TYPEDEF __builtin_va_list va_list;
+TYPEDEF __builtin_va_list __isoc_va_list;
 
 #ifndef __cplusplus
 TYPEDEF int wchar_t;

+ 11 - 10
include/stdio.h

@@ -8,7 +8,7 @@ extern "C" {
 #include <features.h>
 
 #define __NEED_FILE
-#define __NEED_va_list
+#define __NEED___isoc_va_list
 #define __NEED_size_t
 
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
@@ -16,6 +16,7 @@ extern "C" {
  || defined(_BSD_SOURCE)
 #define __NEED_ssize_t
 #define __NEED_off_t
+#define __NEED_va_list
 #endif
 
 #include <bits/alltypes.h>
@@ -99,17 +100,17 @@ int fprintf(FILE *__restrict, const char *__restrict, ...);
 int sprintf(char *__restrict, const char *__restrict, ...);
 int snprintf(char *__restrict, size_t, const char *__restrict, ...);
 
-int vprintf(const char *__restrict, va_list);
-int vfprintf(FILE *__restrict, const char *__restrict, va_list);
-int vsprintf(char *__restrict, const char *__restrict, va_list);
-int vsnprintf(char *__restrict, size_t, const char *__restrict, va_list);
+int vprintf(const char *__restrict, __isoc_va_list);
+int vfprintf(FILE *__restrict, const char *__restrict, __isoc_va_list);
+int vsprintf(char *__restrict, const char *__restrict, __isoc_va_list);
+int vsnprintf(char *__restrict, size_t, const char *__restrict, __isoc_va_list);
 
 int scanf(const char *__restrict, ...);
 int fscanf(FILE *__restrict, const char *__restrict, ...);
 int sscanf(const char *__restrict, const char *__restrict, ...);
-int vscanf(const char *__restrict, va_list);
-int vfscanf(FILE *__restrict, const char *__restrict, va_list);
-int vsscanf(const char *__restrict, const char *__restrict, va_list);
+int vscanf(const char *__restrict, __isoc_va_list);
+int vfscanf(FILE *__restrict, const char *__restrict, __isoc_va_list);
+int vsscanf(const char *__restrict, const char *__restrict, __isoc_va_list);
 
 void perror(const char *);
 
@@ -131,7 +132,7 @@ int fileno(FILE *);
 int fseeko(FILE *, off_t, int);
 off_t ftello(FILE *);
 int dprintf(int, const char *__restrict, ...);
-int vdprintf(int, const char *__restrict, va_list);
+int vdprintf(int, const char *__restrict, __isoc_va_list);
 void flockfile(FILE *);
 int ftrylockfile(FILE *);
 void funlockfile(FILE *);
@@ -171,7 +172,7 @@ int getw(FILE *);
 int putw(int, FILE *);
 char *fgetln(FILE *, size_t *);
 int asprintf(char **, const char *, ...);
-int vasprintf(char **, const char *, va_list);
+int vasprintf(char **, const char *, __isoc_va_list);
 #endif
 
 #ifdef _GNU_SOURCE

+ 8 - 7
include/wchar.h

@@ -8,7 +8,7 @@ extern "C" {
 #include <features.h>
 
 #define __NEED_FILE
-#define __NEED_va_list
+#define __NEED___isoc_va_list
 #define __NEED_size_t
 #define __NEED_wchar_t
 #define __NEED_wint_t
@@ -16,6 +16,7 @@ extern "C" {
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
  || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE)
 #define __NEED_locale_t
+#define __NEED_va_list
 #endif
 
 #if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE)
@@ -105,17 +106,17 @@ int wprintf (const wchar_t *__restrict, ...);
 int fwprintf (FILE *__restrict, const wchar_t *__restrict, ...);
 int swprintf (wchar_t *__restrict, size_t, const wchar_t *__restrict, ...);
 
-int vwprintf (const wchar_t *__restrict, va_list);
-int vfwprintf (FILE *__restrict, const wchar_t *__restrict, va_list);
-int vswprintf (wchar_t *__restrict, size_t, const wchar_t *__restrict, va_list);
+int vwprintf (const wchar_t *__restrict, __isoc_va_list);
+int vfwprintf (FILE *__restrict, const wchar_t *__restrict, __isoc_va_list);
+int vswprintf (wchar_t *__restrict, size_t, const wchar_t *__restrict, __isoc_va_list);
 
 int wscanf (const wchar_t *__restrict, ...);
 int fwscanf (FILE *__restrict, const wchar_t *__restrict, ...);
 int swscanf (const wchar_t *__restrict, const wchar_t *__restrict, ...);
 
-int vwscanf (const wchar_t *__restrict, va_list);
-int vfwscanf (FILE *__restrict, const wchar_t *__restrict, va_list);
-int vswscanf (const wchar_t *__restrict, const wchar_t *__restrict, va_list);
+int vwscanf (const wchar_t *__restrict, __isoc_va_list);
+int vfwscanf (FILE *__restrict, const wchar_t *__restrict, __isoc_va_list);
+int vswscanf (const wchar_t *__restrict, const wchar_t *__restrict, __isoc_va_list);
 
 wint_t fgetwc (FILE *);
 wint_t getwc (FILE *);