1 /* A GNU-like <stdio.h>.
3 Copyright (C) 2004, 2007 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software Foundation,
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
19 #if defined __need_FILE || defined __need___FILE
20 /* Special invocation convention inside glibc header files. */
22 #include @ABSOLUTE_STDIO_H@
25 /* Normal invocation convention. */
28 # include_next <stdio.h>
35 # include @ABSOLUTE_STDIO_H@
42 /* This feature is available in gcc versions 2.5 and later. */
43 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
44 # define __attribute__(Spec) /* empty */
46 /* The __-protected variants of `format' and `printf' attributes
47 are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
48 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
49 # define __format__ format
50 # define __printf__ printf
55 /* The definition of GL_LINK_WARNING is copied here. */
63 #if @GNULIB_FPRINTF_POSIX@
64 # if @REPLACE_FPRINTF@
65 # define fprintf rpl_fprintf
66 extern int fprintf (FILE *fp, const char *format, ...)
67 __attribute__ ((__format__ (__printf__, 2, 3)));
69 #elif defined GNULIB_POSIXCHECK
72 (GL_LINK_WARNING ("fprintf is not always POSIX compliant - " \
73 "use gnulib module fprintf-posix for portable " \
74 "POSIX compliance"), \
78 #if @GNULIB_VFPRINTF_POSIX@
79 # if @REPLACE_VFPRINTF@
80 # define vfprintf rpl_vfprintf
81 extern int vfprintf (FILE *fp, const char *format, va_list args)
82 __attribute__ ((__format__ (__printf__, 2, 0)));
84 #elif defined GNULIB_POSIXCHECK
86 # define vfprintf(s,f,a) \
87 (GL_LINK_WARNING ("vfprintf is not always POSIX compliant - " \
88 "use gnulib module vfprintf-posix for portable " \
89 "POSIX compliance"), \
93 #if @GNULIB_PRINTF_POSIX@
95 /* Don't break __attribute__((format(printf,M,N))). */
96 # define printf __printf__
97 extern int printf (const char *format, ...)
98 __attribute__ ((__format__ (__printf__, 1, 2)));
100 #elif defined GNULIB_POSIXCHECK
103 (GL_LINK_WARNING ("printf is not always POSIX compliant - " \
104 "use gnulib module printf-posix for portable " \
105 "POSIX compliance"), \
107 /* Don't break __attribute__((format(printf,M,N))). */
108 # define format(kind,m,n) format (__##kind##__, m, n)
109 # define __format__(kind,m,n) __format__ (__##kind##__, m, n)
110 # define ____printf____ __printf__
111 # define ____scanf____ __scanf__
112 # define ____strftime____ __strftime__
113 # define ____strfmon____ __strfmon__
116 #if @GNULIB_VPRINTF_POSIX@
117 # if @REPLACE_VPRINTF@
118 # define vprintf rpl_vprintf
119 extern int vprintf (const char *format, va_list args)
120 __attribute__ ((__format__ (__printf__, 1, 0)));
122 #elif defined GNULIB_POSIXCHECK
124 # define vprintf(f,a) \
125 (GL_LINK_WARNING ("vprintf is not always POSIX compliant - " \
126 "use gnulib module vprintf-posix for portable " \
127 "POSIX compliance"), \
131 #if @GNULIB_SNPRINTF@
132 # if @REPLACE_SNPRINTF@
133 # define snprintf rpl_snprintf
135 # if @REPLACE_SNPRINTF@ || !@HAVE_DECL_SNPRINTF@
136 extern int snprintf (char *str, size_t size, const char *format, ...)
137 __attribute__ ((__format__ (__printf__, 3, 4)));
139 #elif defined GNULIB_POSIXCHECK
142 (GL_LINK_WARNING ("snprintf is unportable - " \
143 "use gnulib module snprintf for portability"), \
147 #if @GNULIB_VSNPRINTF@
148 # if @REPLACE_VSNPRINTF@
149 # define vsnprintf rpl_vsnprintf
151 # if @REPLACE_VSNPRINTF@ || !@HAVE_DECL_VSNPRINTF@
152 extern int vsnprintf (char *str, size_t size, const char *format, va_list args)
153 __attribute__ ((__format__ (__printf__, 3, 0)));
155 #elif defined GNULIB_POSIXCHECK
157 # define vsnprintf(b,s,f,a) \
158 (GL_LINK_WARNING ("vsnprintf is unportable - " \
159 "use gnulib module vsnprintf for portability"), \
160 vsnprintf (b, s, f, a))
163 #if @GNULIB_SPRINTF_POSIX@
164 # if @REPLACE_SPRINTF@
165 # define sprintf rpl_sprintf
166 extern int sprintf (char *str, const char *format, ...)
167 __attribute__ ((__format__ (__printf__, 2, 3)));
169 #elif defined GNULIB_POSIXCHECK
172 (GL_LINK_WARNING ("sprintf is not always POSIX compliant - " \
173 "use gnulib module sprintf-posix for portable " \
174 "POSIX compliance"), \
178 #if @GNULIB_VSPRINTF_POSIX@
179 # if @REPLACE_VSPRINTF@
180 # define vsprintf rpl_vsprintf
181 extern int vsprintf (char *str, const char *format, va_list args)
182 __attribute__ ((__format__ (__printf__, 2, 0)));
184 #elif defined GNULIB_POSIXCHECK
186 # define vsprintf(b,f,a) \
187 (GL_LINK_WARNING ("vsprintf is not always POSIX compliant - " \
188 "use gnulib module vsprintf-posix for portable " \
189 "POSIX compliance"), \
193 #if @GNULIB_VASPRINTF@
194 # if @REPLACE_VASPRINTF@
195 # define asprintf rpl_asprintf
196 # define vasprintf rpl_vasprintf
198 # if @REPLACE_VASPRINTF@ || !@HAVE_VASPRINTF@
199 /* Write formatted output to a string dynamically allocated with malloc().
200 If the memory allocation succeeds, store the address of the string in
201 *RESULT and return the number of resulting bytes, excluding the trailing
202 NUL. Upon memory allocation error, or some other error, return -1. */
203 extern int asprintf (char **result, const char *format, ...)
204 __attribute__ ((__format__ (__printf__, 2, 3)));
205 extern int vasprintf (char **result, const char *format, va_list args)
206 __attribute__ ((__format__ (__printf__, 2, 0)));
212 /* Assume 'off_t' is the same type as 'long'. */
213 # define fseeko fseek
217 # define fseeko(f,o,w) \
218 (GL_LINK_WARNING ("fseeko is unportable - " \
219 "use gnulib module fseeko for portability"), \
224 # if @REPLACE_FFLUSH@
225 # define fflush rpl_fflush
226 /* Flush all pending data on STREAM according to POSIX rules. Both
227 output and seekable input streams are supported. */
228 extern int fflush (FILE *gl_stream);
230 #elif defined GNULIB_POSIXCHECK
233 (GL_LINK_WARNING ("fflush is not always POSIX compliant - " \
234 "use gnulib module fflush for portable " \
235 "POSIX compliance"), \
243 #endif /* _GL_STDIO_H */