1# stdio_h.m4 serial 52
2dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7AC_DEFUN([gl_STDIO_H],
8[
9  AH_VERBATIM([MINGW_ANSI_STDIO],
10[/* Use GNU style printf and scanf.  */
11#ifndef __USE_MINGW_ANSI_STDIO
12# undef __USE_MINGW_ANSI_STDIO
13#endif
14])
15  AC_DEFINE([__USE_MINGW_ANSI_STDIO])
16  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
17  gl_NEXT_HEADERS([stdio.h])
18
19  dnl Determine whether __USE_MINGW_ANSI_STDIO makes printf and
20  dnl inttypes.h behave like gnu instead of system; we must give our
21  dnl printf wrapper the right attribute to match.
22  AC_CACHE_CHECK([which flavor of printf attribute matches inttypes macros],
23    [gl_cv_func_printf_attribute_flavor],
24    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
25       #define __STDC_FORMAT_MACROS 1
26       #include <stdio.h>
27       #include <inttypes.h>
28       /* For non-mingw systems, compilation will trivially succeed.
29          For mingw, compilation will succeed for older mingw (system
30          printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
31       #if (defined _WIN32 && ! defined __CYGWIN__) && \
32         (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
33       extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
34       #endif
35      ]])], [gl_cv_func_printf_attribute_flavor=system],
36      [gl_cv_func_printf_attribute_flavor=gnu])])
37  if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
38    AC_DEFINE([GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU], [1],
39      [Define to 1 if printf and friends should be labeled with
40       attribute "__gnu_printf__" instead of "__printf__"])
41  fi
42
43  dnl No need to create extra modules for these functions. Everyone who uses
44  dnl <stdio.h> likely needs them.
45  GNULIB_FSCANF=1
46  gl_MODULE_INDICATOR([fscanf])
47  GNULIB_SCANF=1
48  gl_MODULE_INDICATOR([scanf])
49  GNULIB_FGETC=1
50  GNULIB_GETC=1
51  GNULIB_GETCHAR=1
52  GNULIB_FGETS=1
53  GNULIB_FREAD=1
54  dnl This ifdef is necessary to avoid an error "missing file lib/stdio-read.c"
55  dnl "expected source file, required through AC_LIBSOURCES, not found". It is
56  dnl also an optimization, to avoid performing a configure check whose result
57  dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING
58  dnl or GNULIB_NONBLOCKING redundant.
59  m4_ifdef([gl_NONBLOCKING_IO], [
60    gl_NONBLOCKING_IO
61    if test $gl_cv_have_nonblocking != yes; then
62      REPLACE_STDIO_READ_FUNCS=1
63      AC_LIBOBJ([stdio-read])
64    fi
65  ])
66
67  dnl No need to create extra modules for these functions. Everyone who uses
68  dnl <stdio.h> likely needs them.
69  GNULIB_FPRINTF=1
70  GNULIB_PRINTF=1
71  GNULIB_VFPRINTF=1
72  GNULIB_VPRINTF=1
73  GNULIB_FPUTC=1
74  GNULIB_PUTC=1
75  GNULIB_PUTCHAR=1
76  GNULIB_FPUTS=1
77  GNULIB_PUTS=1
78  GNULIB_FWRITE=1
79  dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
80  dnl "expected source file, required through AC_LIBSOURCES, not found". It is
81  dnl also an optimization, to avoid performing a configure check whose result
82  dnl is not used. But it does not make the test of GNULIB_STDIO_H_SIGPIPE or
83  dnl GNULIB_SIGPIPE redundant.
84  m4_ifdef([gl_SIGNAL_SIGPIPE], [
85    gl_SIGNAL_SIGPIPE
86    if test $gl_cv_header_signal_h_SIGPIPE != yes; then
87      REPLACE_STDIO_WRITE_FUNCS=1
88      AC_LIBOBJ([stdio-write])
89    fi
90  ])
91  dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
92  dnl "expected source file, required through AC_LIBSOURCES, not found". It is
93  dnl also an optimization, to avoid performing a configure check whose result
94  dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING
95  dnl or GNULIB_NONBLOCKING redundant.
96  m4_ifdef([gl_NONBLOCKING_IO], [
97    gl_NONBLOCKING_IO
98    if test $gl_cv_have_nonblocking != yes; then
99      REPLACE_STDIO_WRITE_FUNCS=1
100      AC_LIBOBJ([stdio-write])
101    fi
102  ])
103
104  dnl Check for declarations of anything we want to poison if the
105  dnl corresponding gnulib module is not in use, and which is not
106  dnl guaranteed by both C89 and C11.
107  gl_WARN_ON_USE_PREPARE([[#include <stdio.h>
108    ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen
109    renameat snprintf tmpfile vdprintf vsnprintf])
110
111  AC_REQUIRE([AC_C_RESTRICT])
112
113  AC_CHECK_DECLS_ONCE([fcloseall])
114  if test $ac_cv_have_decl_fcloseall = no; then
115    HAVE_DECL_FCLOSEALL=0
116  fi
117])
118
119AC_DEFUN([gl_STDIO_MODULE_INDICATOR],
120[
121  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
122  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
123  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
124  dnl Define it also as a C macro, for the benefit of the unit tests.
125  gl_MODULE_INDICATOR_FOR_TESTS([$1])
126])
127
128AC_DEFUN([gl_STDIO_H_DEFAULTS],
129[
130  GNULIB_DPRINTF=0;              AC_SUBST([GNULIB_DPRINTF])
131  GNULIB_FCLOSE=0;               AC_SUBST([GNULIB_FCLOSE])
132  GNULIB_FDOPEN=0;               AC_SUBST([GNULIB_FDOPEN])
133  GNULIB_FFLUSH=0;               AC_SUBST([GNULIB_FFLUSH])
134  GNULIB_FGETC=0;                AC_SUBST([GNULIB_FGETC])
135  GNULIB_FGETS=0;                AC_SUBST([GNULIB_FGETS])
136  GNULIB_FOPEN=0;                AC_SUBST([GNULIB_FOPEN])
137  GNULIB_FPRINTF=0;              AC_SUBST([GNULIB_FPRINTF])
138  GNULIB_FPRINTF_POSIX=0;        AC_SUBST([GNULIB_FPRINTF_POSIX])
139  GNULIB_FPURGE=0;               AC_SUBST([GNULIB_FPURGE])
140  GNULIB_FPUTC=0;                AC_SUBST([GNULIB_FPUTC])
141  GNULIB_FPUTS=0;                AC_SUBST([GNULIB_FPUTS])
142  GNULIB_FREAD=0;                AC_SUBST([GNULIB_FREAD])
143  GNULIB_FREOPEN=0;              AC_SUBST([GNULIB_FREOPEN])
144  GNULIB_FSCANF=0;               AC_SUBST([GNULIB_FSCANF])
145  GNULIB_FSEEK=0;                AC_SUBST([GNULIB_FSEEK])
146  GNULIB_FSEEKO=0;               AC_SUBST([GNULIB_FSEEKO])
147  GNULIB_FTELL=0;                AC_SUBST([GNULIB_FTELL])
148  GNULIB_FTELLO=0;               AC_SUBST([GNULIB_FTELLO])
149  GNULIB_FWRITE=0;               AC_SUBST([GNULIB_FWRITE])
150  GNULIB_GETC=0;                 AC_SUBST([GNULIB_GETC])
151  GNULIB_GETCHAR=0;              AC_SUBST([GNULIB_GETCHAR])
152  GNULIB_GETDELIM=0;             AC_SUBST([GNULIB_GETDELIM])
153  GNULIB_GETLINE=0;              AC_SUBST([GNULIB_GETLINE])
154  GNULIB_OBSTACK_PRINTF=0;       AC_SUBST([GNULIB_OBSTACK_PRINTF])
155  GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX])
156  GNULIB_PCLOSE=0;               AC_SUBST([GNULIB_PCLOSE])
157  GNULIB_PERROR=0;               AC_SUBST([GNULIB_PERROR])
158  GNULIB_POPEN=0;                AC_SUBST([GNULIB_POPEN])
159  GNULIB_PRINTF=0;               AC_SUBST([GNULIB_PRINTF])
160  GNULIB_PRINTF_POSIX=0;         AC_SUBST([GNULIB_PRINTF_POSIX])
161  GNULIB_PUTC=0;                 AC_SUBST([GNULIB_PUTC])
162  GNULIB_PUTCHAR=0;              AC_SUBST([GNULIB_PUTCHAR])
163  GNULIB_PUTS=0;                 AC_SUBST([GNULIB_PUTS])
164  GNULIB_REMOVE=0;               AC_SUBST([GNULIB_REMOVE])
165  GNULIB_RENAME=0;               AC_SUBST([GNULIB_RENAME])
166  GNULIB_RENAMEAT=0;             AC_SUBST([GNULIB_RENAMEAT])
167  GNULIB_SCANF=0;                AC_SUBST([GNULIB_SCANF])
168  GNULIB_SNPRINTF=0;             AC_SUBST([GNULIB_SNPRINTF])
169  GNULIB_SPRINTF_POSIX=0;        AC_SUBST([GNULIB_SPRINTF_POSIX])
170  GNULIB_STDIO_H_NONBLOCKING=0;  AC_SUBST([GNULIB_STDIO_H_NONBLOCKING])
171  GNULIB_STDIO_H_SIGPIPE=0;      AC_SUBST([GNULIB_STDIO_H_SIGPIPE])
172  GNULIB_TMPFILE=0;              AC_SUBST([GNULIB_TMPFILE])
173  GNULIB_VASPRINTF=0;            AC_SUBST([GNULIB_VASPRINTF])
174  GNULIB_VFSCANF=0;              AC_SUBST([GNULIB_VFSCANF])
175  GNULIB_VSCANF=0;               AC_SUBST([GNULIB_VSCANF])
176  GNULIB_VDPRINTF=0;             AC_SUBST([GNULIB_VDPRINTF])
177  GNULIB_VFPRINTF=0;             AC_SUBST([GNULIB_VFPRINTF])
178  GNULIB_VFPRINTF_POSIX=0;       AC_SUBST([GNULIB_VFPRINTF_POSIX])
179  GNULIB_VPRINTF=0;              AC_SUBST([GNULIB_VPRINTF])
180  GNULIB_VPRINTF_POSIX=0;        AC_SUBST([GNULIB_VPRINTF_POSIX])
181  GNULIB_VSNPRINTF=0;            AC_SUBST([GNULIB_VSNPRINTF])
182  GNULIB_VSPRINTF_POSIX=0;       AC_SUBST([GNULIB_VSPRINTF_POSIX])
183  dnl Support Microsoft deprecated alias function names by default.
184  GNULIB_MDA_FCLOSEALL=1;        AC_SUBST([GNULIB_MDA_FCLOSEALL])
185  GNULIB_MDA_FDOPEN=1;           AC_SUBST([GNULIB_MDA_FDOPEN])
186  GNULIB_MDA_FILENO=1;           AC_SUBST([GNULIB_MDA_FILENO])
187  GNULIB_MDA_GETW=1;             AC_SUBST([GNULIB_MDA_GETW])
188  GNULIB_MDA_PUTW=1;             AC_SUBST([GNULIB_MDA_PUTW])
189  GNULIB_MDA_TEMPNAM=1;          AC_SUBST([GNULIB_MDA_TEMPNAM])
190  dnl Assume proper GNU behavior unless another module says otherwise.
191  HAVE_DECL_FCLOSEALL=1;         AC_SUBST([HAVE_DECL_FCLOSEALL])
192  HAVE_DECL_FPURGE=1;            AC_SUBST([HAVE_DECL_FPURGE])
193  HAVE_DECL_FSEEKO=1;            AC_SUBST([HAVE_DECL_FSEEKO])
194  HAVE_DECL_FTELLO=1;            AC_SUBST([HAVE_DECL_FTELLO])
195  HAVE_DECL_GETDELIM=1;          AC_SUBST([HAVE_DECL_GETDELIM])
196  HAVE_DECL_GETLINE=1;           AC_SUBST([HAVE_DECL_GETLINE])
197  HAVE_DECL_OBSTACK_PRINTF=1;    AC_SUBST([HAVE_DECL_OBSTACK_PRINTF])
198  HAVE_DECL_SNPRINTF=1;          AC_SUBST([HAVE_DECL_SNPRINTF])
199  HAVE_DECL_VSNPRINTF=1;         AC_SUBST([HAVE_DECL_VSNPRINTF])
200  HAVE_DPRINTF=1;                AC_SUBST([HAVE_DPRINTF])
201  HAVE_FSEEKO=1;                 AC_SUBST([HAVE_FSEEKO])
202  HAVE_FTELLO=1;                 AC_SUBST([HAVE_FTELLO])
203  HAVE_PCLOSE=1;                 AC_SUBST([HAVE_PCLOSE])
204  HAVE_POPEN=1;                  AC_SUBST([HAVE_POPEN])
205  HAVE_RENAMEAT=1;               AC_SUBST([HAVE_RENAMEAT])
206  HAVE_VASPRINTF=1;              AC_SUBST([HAVE_VASPRINTF])
207  HAVE_VDPRINTF=1;               AC_SUBST([HAVE_VDPRINTF])
208  REPLACE_DPRINTF=0;             AC_SUBST([REPLACE_DPRINTF])
209  REPLACE_FCLOSE=0;              AC_SUBST([REPLACE_FCLOSE])
210  REPLACE_FDOPEN=0;              AC_SUBST([REPLACE_FDOPEN])
211  REPLACE_FFLUSH=0;              AC_SUBST([REPLACE_FFLUSH])
212  REPLACE_FOPEN=0;               AC_SUBST([REPLACE_FOPEN])
213  REPLACE_FPRINTF=0;             AC_SUBST([REPLACE_FPRINTF])
214  REPLACE_FPURGE=0;              AC_SUBST([REPLACE_FPURGE])
215  REPLACE_FREOPEN=0;             AC_SUBST([REPLACE_FREOPEN])
216  REPLACE_FSEEK=0;               AC_SUBST([REPLACE_FSEEK])
217  REPLACE_FSEEKO=0;              AC_SUBST([REPLACE_FSEEKO])
218  REPLACE_FTELL=0;               AC_SUBST([REPLACE_FTELL])
219  REPLACE_FTELLO=0;              AC_SUBST([REPLACE_FTELLO])
220  REPLACE_GETDELIM=0;            AC_SUBST([REPLACE_GETDELIM])
221  REPLACE_GETLINE=0;             AC_SUBST([REPLACE_GETLINE])
222  REPLACE_OBSTACK_PRINTF=0;      AC_SUBST([REPLACE_OBSTACK_PRINTF])
223  REPLACE_PERROR=0;              AC_SUBST([REPLACE_PERROR])
224  REPLACE_POPEN=0;               AC_SUBST([REPLACE_POPEN])
225  REPLACE_PRINTF=0;              AC_SUBST([REPLACE_PRINTF])
226  REPLACE_REMOVE=0;              AC_SUBST([REPLACE_REMOVE])
227  REPLACE_RENAME=0;              AC_SUBST([REPLACE_RENAME])
228  REPLACE_RENAMEAT=0;            AC_SUBST([REPLACE_RENAMEAT])
229  REPLACE_SNPRINTF=0;            AC_SUBST([REPLACE_SNPRINTF])
230  REPLACE_SPRINTF=0;             AC_SUBST([REPLACE_SPRINTF])
231  REPLACE_STDIO_READ_FUNCS=0;    AC_SUBST([REPLACE_STDIO_READ_FUNCS])
232  REPLACE_STDIO_WRITE_FUNCS=0;   AC_SUBST([REPLACE_STDIO_WRITE_FUNCS])
233  REPLACE_TMPFILE=0;             AC_SUBST([REPLACE_TMPFILE])
234  REPLACE_VASPRINTF=0;           AC_SUBST([REPLACE_VASPRINTF])
235  REPLACE_VDPRINTF=0;            AC_SUBST([REPLACE_VDPRINTF])
236  REPLACE_VFPRINTF=0;            AC_SUBST([REPLACE_VFPRINTF])
237  REPLACE_VPRINTF=0;             AC_SUBST([REPLACE_VPRINTF])
238  REPLACE_VSNPRINTF=0;           AC_SUBST([REPLACE_VSNPRINTF])
239  REPLACE_VSPRINTF=0;            AC_SUBST([REPLACE_VSPRINTF])
240])
241