Imported Upstream version 3.8
[platform/upstream/diffutils.git] / m4 / stdio_h.m4
1 # stdio_h.m4 serial 56
2 dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 AC_DEFUN_ONCE([gl_STDIO_H],
8 [
9   AC_REQUIRE([gl_STDIO_H_DEFAULTS])
10   AH_VERBATIM([MINGW_ANSI_STDIO],
11 [/* Use GNU style printf and scanf.  */
12 #ifndef __USE_MINGW_ANSI_STDIO
13 # undef __USE_MINGW_ANSI_STDIO
14 #endif
15 ])
16   AC_DEFINE([__USE_MINGW_ANSI_STDIO])
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 This ifdef is necessary to avoid an error "missing file lib/stdio-read.c"
44   dnl "expected source file, required through AC_LIBSOURCES, not found". It is
45   dnl also an optimization, to avoid performing a configure check whose result
46   dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING
47   dnl or GNULIB_NONBLOCKING redundant.
48   m4_ifdef([gl_NONBLOCKING_IO], [
49     gl_NONBLOCKING_IO
50     if test $gl_cv_have_nonblocking != yes; then
51       REPLACE_STDIO_READ_FUNCS=1
52       AC_LIBOBJ([stdio-read])
53     fi
54   ])
55
56   dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
57   dnl "expected source file, required through AC_LIBSOURCES, not found". It is
58   dnl also an optimization, to avoid performing a configure check whose result
59   dnl is not used. But it does not make the test of GNULIB_STDIO_H_SIGPIPE or
60   dnl GNULIB_SIGPIPE redundant.
61   m4_ifdef([gl_SIGNAL_SIGPIPE], [
62     gl_SIGNAL_SIGPIPE
63     if test $gl_cv_header_signal_h_SIGPIPE != yes; then
64       REPLACE_STDIO_WRITE_FUNCS=1
65       AC_LIBOBJ([stdio-write])
66     fi
67   ])
68   dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
69   dnl "expected source file, required through AC_LIBSOURCES, not found". It is
70   dnl also an optimization, to avoid performing a configure check whose result
71   dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING
72   dnl or GNULIB_NONBLOCKING redundant.
73   m4_ifdef([gl_NONBLOCKING_IO], [
74     gl_NONBLOCKING_IO
75     if test $gl_cv_have_nonblocking != yes; then
76       REPLACE_STDIO_WRITE_FUNCS=1
77       AC_LIBOBJ([stdio-write])
78     fi
79   ])
80
81   dnl Check for declarations of anything we want to poison if the
82   dnl corresponding gnulib module is not in use, and which is not
83   dnl guaranteed by both C89 and C11.
84   gl_WARN_ON_USE_PREPARE([[#include <stdio.h>
85     ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen
86     renameat snprintf tmpfile vdprintf vsnprintf])
87
88   AC_REQUIRE([AC_C_RESTRICT])
89
90   AC_CHECK_DECLS_ONCE([fcloseall])
91   if test $ac_cv_have_decl_fcloseall = no; then
92     HAVE_DECL_FCLOSEALL=0
93   fi
94 ])
95
96 # gl_STDIO_MODULE_INDICATOR([modulename])
97 # sets the shell variable that indicates the presence of the given module
98 # to a C preprocessor expression that will evaluate to 1.
99 # This macro invocation must not occur in macros that are AC_REQUIREd.
100 AC_DEFUN([gl_STDIO_MODULE_INDICATOR],
101 [
102   dnl Ensure to expand the default settings once only.
103   gl_STDIO_H_REQUIRE_DEFAULTS
104   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
105   dnl Define it also as a C macro, for the benefit of the unit tests.
106   gl_MODULE_INDICATOR_FOR_TESTS([$1])
107 ])
108
109 # Initializes the default values for AC_SUBSTed shell variables.
110 # This macro must not be AC_REQUIREd.  It must only be invoked, and only
111 # outside of macros or in macros that are not AC_REQUIREd.
112 AC_DEFUN([gl_STDIO_H_REQUIRE_DEFAULTS],
113 [
114   m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDIO_H_MODULE_INDICATOR_DEFAULTS], [
115     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DPRINTF])
116     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCLOSE])
117     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDOPEN])
118     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFLUSH])
119     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FGETC])
120     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FGETS])
121     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FOPEN])
122     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPRINTF])
123     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPRINTF_POSIX])
124     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPURGE])
125     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPUTC])
126     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPUTS])
127     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREAD])
128     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREOPEN])
129     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSCANF])
130     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSEEK])
131     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSEEKO])
132     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTELL])
133     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTELLO])
134     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FWRITE])
135     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETC])
136     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETCHAR])
137     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDELIM])
138     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLINE])
139     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OBSTACK_PRINTF])
140     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OBSTACK_PRINTF_POSIX])
141     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PCLOSE])
142     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PERROR])
143     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POPEN])
144     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PRINTF])
145     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PRINTF_POSIX])
146     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTC])
147     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTCHAR])
148     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTS])
149     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMOVE])
150     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RENAME])
151     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RENAMEAT])
152     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SCANF])
153     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SNPRINTF])
154     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SPRINTF_POSIX])
155     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STDIO_H_NONBLOCKING])
156     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STDIO_H_SIGPIPE])
157     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TMPFILE])
158     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VASPRINTF])
159     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFSCANF])
160     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSCANF])
161     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VDPRINTF])
162     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFPRINTF])
163     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFPRINTF_POSIX])
164     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VPRINTF])
165     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VPRINTF_POSIX])
166     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSNPRINTF])
167     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSPRINTF_POSIX])
168     dnl Support Microsoft deprecated alias function names by default.
169     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FCLOSEALL], [1])
170     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FDOPEN], [1])
171     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FILENO], [1])
172     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETW], [1])
173     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_PUTW], [1])
174     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_TEMPNAM], [1])
175   ])
176   m4_require(GL_MODULE_INDICATOR_PREFIX[_STDIO_H_MODULE_INDICATOR_DEFAULTS])
177   AC_REQUIRE([gl_STDIO_H_DEFAULTS])
178 ])
179
180 AC_DEFUN([gl_STDIO_H_DEFAULTS],
181 [
182   dnl Assume proper GNU behavior unless another module says otherwise.
183   HAVE_DECL_FCLOSEALL=1;         AC_SUBST([HAVE_DECL_FCLOSEALL])
184   HAVE_DECL_FPURGE=1;            AC_SUBST([HAVE_DECL_FPURGE])
185   HAVE_DECL_FSEEKO=1;            AC_SUBST([HAVE_DECL_FSEEKO])
186   HAVE_DECL_FTELLO=1;            AC_SUBST([HAVE_DECL_FTELLO])
187   HAVE_DECL_GETDELIM=1;          AC_SUBST([HAVE_DECL_GETDELIM])
188   HAVE_DECL_GETLINE=1;           AC_SUBST([HAVE_DECL_GETLINE])
189   HAVE_DECL_OBSTACK_PRINTF=1;    AC_SUBST([HAVE_DECL_OBSTACK_PRINTF])
190   HAVE_DECL_SNPRINTF=1;          AC_SUBST([HAVE_DECL_SNPRINTF])
191   HAVE_DECL_VSNPRINTF=1;         AC_SUBST([HAVE_DECL_VSNPRINTF])
192   HAVE_DPRINTF=1;                AC_SUBST([HAVE_DPRINTF])
193   HAVE_FSEEKO=1;                 AC_SUBST([HAVE_FSEEKO])
194   HAVE_FTELLO=1;                 AC_SUBST([HAVE_FTELLO])
195   HAVE_PCLOSE=1;                 AC_SUBST([HAVE_PCLOSE])
196   HAVE_POPEN=1;                  AC_SUBST([HAVE_POPEN])
197   HAVE_RENAMEAT=1;               AC_SUBST([HAVE_RENAMEAT])
198   HAVE_VASPRINTF=1;              AC_SUBST([HAVE_VASPRINTF])
199   HAVE_VDPRINTF=1;               AC_SUBST([HAVE_VDPRINTF])
200   REPLACE_DPRINTF=0;             AC_SUBST([REPLACE_DPRINTF])
201   REPLACE_FCLOSE=0;              AC_SUBST([REPLACE_FCLOSE])
202   REPLACE_FDOPEN=0;              AC_SUBST([REPLACE_FDOPEN])
203   REPLACE_FFLUSH=0;              AC_SUBST([REPLACE_FFLUSH])
204   REPLACE_FOPEN=0;               AC_SUBST([REPLACE_FOPEN])
205   REPLACE_FPRINTF=0;             AC_SUBST([REPLACE_FPRINTF])
206   REPLACE_FPURGE=0;              AC_SUBST([REPLACE_FPURGE])
207   REPLACE_FREOPEN=0;             AC_SUBST([REPLACE_FREOPEN])
208   REPLACE_FSEEK=0;               AC_SUBST([REPLACE_FSEEK])
209   REPLACE_FSEEKO=0;              AC_SUBST([REPLACE_FSEEKO])
210   REPLACE_FTELL=0;               AC_SUBST([REPLACE_FTELL])
211   REPLACE_FTELLO=0;              AC_SUBST([REPLACE_FTELLO])
212   REPLACE_GETDELIM=0;            AC_SUBST([REPLACE_GETDELIM])
213   REPLACE_GETLINE=0;             AC_SUBST([REPLACE_GETLINE])
214   REPLACE_OBSTACK_PRINTF=0;      AC_SUBST([REPLACE_OBSTACK_PRINTF])
215   REPLACE_PERROR=0;              AC_SUBST([REPLACE_PERROR])
216   REPLACE_POPEN=0;               AC_SUBST([REPLACE_POPEN])
217   REPLACE_PRINTF=0;              AC_SUBST([REPLACE_PRINTF])
218   REPLACE_REMOVE=0;              AC_SUBST([REPLACE_REMOVE])
219   REPLACE_RENAME=0;              AC_SUBST([REPLACE_RENAME])
220   REPLACE_RENAMEAT=0;            AC_SUBST([REPLACE_RENAMEAT])
221   REPLACE_SNPRINTF=0;            AC_SUBST([REPLACE_SNPRINTF])
222   REPLACE_SPRINTF=0;             AC_SUBST([REPLACE_SPRINTF])
223   REPLACE_STDIO_READ_FUNCS=0;    AC_SUBST([REPLACE_STDIO_READ_FUNCS])
224   REPLACE_STDIO_WRITE_FUNCS=0;   AC_SUBST([REPLACE_STDIO_WRITE_FUNCS])
225   REPLACE_TMPFILE=0;             AC_SUBST([REPLACE_TMPFILE])
226   REPLACE_VASPRINTF=0;           AC_SUBST([REPLACE_VASPRINTF])
227   REPLACE_VDPRINTF=0;            AC_SUBST([REPLACE_VDPRINTF])
228   REPLACE_VFPRINTF=0;            AC_SUBST([REPLACE_VFPRINTF])
229   REPLACE_VPRINTF=0;             AC_SUBST([REPLACE_VPRINTF])
230   REPLACE_VSNPRINTF=0;           AC_SUBST([REPLACE_VSNPRINTF])
231   REPLACE_VSPRINTF=0;            AC_SUBST([REPLACE_VSPRINTF])
232 ])