xref: /Universal-ctags/m4/gnulib-common.m4 (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
1*820c1a8dSHiroo HAYASHI# gnulib-common.m4 serial 66
2*820c1a8dSHiroo HAYASHIdnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
3*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation
4*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it,
5*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved.
6*820c1a8dSHiroo HAYASHI
7*820c1a8dSHiroo HAYASHIAC_PREREQ([2.62])
8*820c1a8dSHiroo HAYASHI
9*820c1a8dSHiroo HAYASHI# gl_COMMON
10*820c1a8dSHiroo HAYASHI# is expanded unconditionally through gnulib-tool magic.
11*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_COMMON], [
12*820c1a8dSHiroo HAYASHI  dnl Use AC_REQUIRE here, so that the code is expanded once only.
13*820c1a8dSHiroo HAYASHI  AC_REQUIRE([gl_00GNULIB])
14*820c1a8dSHiroo HAYASHI  AC_REQUIRE([gl_COMMON_BODY])
15*820c1a8dSHiroo HAYASHI  AC_REQUIRE([gl_ZZGNULIB])
16*820c1a8dSHiroo HAYASHI])
17*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_COMMON_BODY], [
18*820c1a8dSHiroo HAYASHI  AH_VERBATIM([_GL_GNUC_PREREQ],
19*820c1a8dSHiroo HAYASHI[/* True if the compiler says it groks GNU C version MAJOR.MINOR.  */
20*820c1a8dSHiroo HAYASHI#if defined __GNUC__ && defined __GNUC_MINOR__
21*820c1a8dSHiroo HAYASHI# define _GL_GNUC_PREREQ(major, minor) \
22*820c1a8dSHiroo HAYASHI    ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
23*820c1a8dSHiroo HAYASHI#else
24*820c1a8dSHiroo HAYASHI# define _GL_GNUC_PREREQ(major, minor) 0
25*820c1a8dSHiroo HAYASHI#endif
26*820c1a8dSHiroo HAYASHI])
27*820c1a8dSHiroo HAYASHI  AH_VERBATIM([_Noreturn],
28*820c1a8dSHiroo HAYASHI[/* The _Noreturn keyword of C11.  */
29*820c1a8dSHiroo HAYASHI#ifndef _Noreturn
30*820c1a8dSHiroo HAYASHI# if (defined __cplusplus \
31*820c1a8dSHiroo HAYASHI      && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
32*820c1a8dSHiroo HAYASHI          || (defined _MSC_VER && 1900 <= _MSC_VER)) \
33*820c1a8dSHiroo HAYASHI      && 0)
34*820c1a8dSHiroo HAYASHI    /* [[noreturn]] is not practically usable, because with it the syntax
35*820c1a8dSHiroo HAYASHI         extern _Noreturn void func (...);
36*820c1a8dSHiroo HAYASHI       would not be valid; such a declaration would only be valid with 'extern'
37*820c1a8dSHiroo HAYASHI       and '_Noreturn' swapped, or without the 'extern' keyword.  However, some
38*820c1a8dSHiroo HAYASHI       AIX system header files and several gnulib header files use precisely
39*820c1a8dSHiroo HAYASHI       this syntax with 'extern'.  */
40*820c1a8dSHiroo HAYASHI#  define _Noreturn [[noreturn]]
41*820c1a8dSHiroo HAYASHI# elif ((!defined __cplusplus || defined __clang__) \
42*820c1a8dSHiroo HAYASHI        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
43*820c1a8dSHiroo HAYASHI            || (!defined __STRICT_ANSI__ \
44*820c1a8dSHiroo HAYASHI                && (_GL_GNUC_PREREQ (4, 7) \
45*820c1a8dSHiroo HAYASHI                    || (defined __apple_build_version__ \
46*820c1a8dSHiroo HAYASHI                        ? 6000000 <= __apple_build_version__ \
47*820c1a8dSHiroo HAYASHI                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
48*820c1a8dSHiroo HAYASHI   /* _Noreturn works as-is.  */
49*820c1a8dSHiroo HAYASHI# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
50*820c1a8dSHiroo HAYASHI#  define _Noreturn __attribute__ ((__noreturn__))
51*820c1a8dSHiroo HAYASHI# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
52*820c1a8dSHiroo HAYASHI#  define _Noreturn __declspec (noreturn)
53*820c1a8dSHiroo HAYASHI# else
54*820c1a8dSHiroo HAYASHI#  define _Noreturn
55*820c1a8dSHiroo HAYASHI# endif
56*820c1a8dSHiroo HAYASHI#endif
57*820c1a8dSHiroo HAYASHI])
58*820c1a8dSHiroo HAYASHI  AH_VERBATIM([isoc99_inline],
59*820c1a8dSHiroo HAYASHI[/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
60*820c1a8dSHiroo HAYASHI   the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
61*820c1a8dSHiroo HAYASHI   earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
62*820c1a8dSHiroo HAYASHI   __APPLE__ && __MACH__ test for Mac OS X.
63*820c1a8dSHiroo HAYASHI   __APPLE_CC__ tests for the Apple compiler and its version.
64*820c1a8dSHiroo HAYASHI   __STDC_VERSION__ tests for the C99 mode.  */
65*820c1a8dSHiroo HAYASHI#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
66*820c1a8dSHiroo HAYASHI# define __GNUC_STDC_INLINE__ 1
67*820c1a8dSHiroo HAYASHI#endif])
68*820c1a8dSHiroo HAYASHI  AH_VERBATIM([attribute],
69*820c1a8dSHiroo HAYASHI[/* Attributes.  */
70*820c1a8dSHiroo HAYASHI#if (defined __has_attribute \
71*820c1a8dSHiroo HAYASHI     && (!defined __clang_minor__ \
72*820c1a8dSHiroo HAYASHI         || 3 < __clang_major__ + (5 <= __clang_minor__)))
73*820c1a8dSHiroo HAYASHI# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
74*820c1a8dSHiroo HAYASHI#else
75*820c1a8dSHiroo HAYASHI# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
76*820c1a8dSHiroo HAYASHI# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
77*820c1a8dSHiroo HAYASHI# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
78*820c1a8dSHiroo HAYASHI# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
79*820c1a8dSHiroo HAYASHI# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
80*820c1a8dSHiroo HAYASHI# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
81*820c1a8dSHiroo HAYASHI# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
82*820c1a8dSHiroo HAYASHI# define _GL_ATTR_diagnose_if 0
83*820c1a8dSHiroo HAYASHI# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
84*820c1a8dSHiroo HAYASHI# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
85*820c1a8dSHiroo HAYASHI# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
86*820c1a8dSHiroo HAYASHI# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
87*820c1a8dSHiroo HAYASHI# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
88*820c1a8dSHiroo HAYASHI# ifdef _ICC
89*820c1a8dSHiroo HAYASHI#  define _GL_ATTR_may_alias 0
90*820c1a8dSHiroo HAYASHI# else
91*820c1a8dSHiroo HAYASHI#  define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
92*820c1a8dSHiroo HAYASHI# endif
93*820c1a8dSHiroo HAYASHI# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
94*820c1a8dSHiroo HAYASHI# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
95*820c1a8dSHiroo HAYASHI# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
96*820c1a8dSHiroo HAYASHI# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
97*820c1a8dSHiroo HAYASHI# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
98*820c1a8dSHiroo HAYASHI# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
99*820c1a8dSHiroo HAYASHI# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
100*820c1a8dSHiroo HAYASHI# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
101*820c1a8dSHiroo HAYASHI# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
102*820c1a8dSHiroo HAYASHI# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
103*820c1a8dSHiroo HAYASHI# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
104*820c1a8dSHiroo HAYASHI#endif
105*820c1a8dSHiroo HAYASHI
106*820c1a8dSHiroo HAYASHI]dnl There is no _GL_ATTRIBUTE_ALIGNED; use stdalign's _Alignas instead.
107*820c1a8dSHiroo HAYASHI[
108*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (alloc_size)
109*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
110*820c1a8dSHiroo HAYASHI#else
111*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
112*820c1a8dSHiroo HAYASHI#endif
113*820c1a8dSHiroo HAYASHI
114*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (always_inline)
115*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
116*820c1a8dSHiroo HAYASHI#else
117*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ALWAYS_INLINE
118*820c1a8dSHiroo HAYASHI#endif
119*820c1a8dSHiroo HAYASHI
120*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (artificial)
121*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
122*820c1a8dSHiroo HAYASHI#else
123*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ARTIFICIAL
124*820c1a8dSHiroo HAYASHI#endif
125*820c1a8dSHiroo HAYASHI
126*820c1a8dSHiroo HAYASHI/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
127*820c1a8dSHiroo HAYASHI   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
128*820c1a8dSHiroo HAYASHI   Also, Oracle Studio 12.6 requires 'cold' not '__cold__'.  */
129*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
130*820c1a8dSHiroo HAYASHI# ifndef __SUNPRO_C
131*820c1a8dSHiroo HAYASHI#  define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
132*820c1a8dSHiroo HAYASHI# else
133*820c1a8dSHiroo HAYASHI#  define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
134*820c1a8dSHiroo HAYASHI# endif
135*820c1a8dSHiroo HAYASHI#else
136*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_COLD
137*820c1a8dSHiroo HAYASHI#endif
138*820c1a8dSHiroo HAYASHI
139*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (const)
140*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
141*820c1a8dSHiroo HAYASHI#else
142*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_CONST
143*820c1a8dSHiroo HAYASHI#endif
144*820c1a8dSHiroo HAYASHI
145*820c1a8dSHiroo HAYASHI#if 201710L < __STDC_VERSION__
146*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
147*820c1a8dSHiroo HAYASHI#elif _GL_HAS_ATTRIBUTE (deprecated)
148*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
149*820c1a8dSHiroo HAYASHI#else
150*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_DEPRECATED
151*820c1a8dSHiroo HAYASHI#endif
152*820c1a8dSHiroo HAYASHI
153*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (error)
154*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
155*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
156*820c1a8dSHiroo HAYASHI#elif _GL_HAS_ATTRIBUTE (diagnose_if)
157*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
158*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
159*820c1a8dSHiroo HAYASHI#else
160*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_ERROR(msg)
161*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_WARNING(msg)
162*820c1a8dSHiroo HAYASHI#endif
163*820c1a8dSHiroo HAYASHI
164*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (externally_visible)
165*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
166*820c1a8dSHiroo HAYASHI#else
167*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
168*820c1a8dSHiroo HAYASHI#endif
169*820c1a8dSHiroo HAYASHI
170*820c1a8dSHiroo HAYASHI/* FALLTHROUGH is special, because it always expands to something.  */
171*820c1a8dSHiroo HAYASHI#if 201710L < __STDC_VERSION__
172*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
173*820c1a8dSHiroo HAYASHI#elif _GL_HAS_ATTRIBUTE (fallthrough)
174*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
175*820c1a8dSHiroo HAYASHI#else
176*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
177*820c1a8dSHiroo HAYASHI#endif
178*820c1a8dSHiroo HAYASHI
179*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (format)
180*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
181*820c1a8dSHiroo HAYASHI#else
182*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_FORMAT(spec)
183*820c1a8dSHiroo HAYASHI#endif
184*820c1a8dSHiroo HAYASHI
185*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (leaf)
186*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
187*820c1a8dSHiroo HAYASHI#else
188*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_LEAF
189*820c1a8dSHiroo HAYASHI#endif
190*820c1a8dSHiroo HAYASHI
191*820c1a8dSHiroo HAYASHI/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK.  */
192*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
193*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
194*820c1a8dSHiroo HAYASHI#else
195*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_MAY_ALIAS
196*820c1a8dSHiroo HAYASHI#endif
197*820c1a8dSHiroo HAYASHI
198*820c1a8dSHiroo HAYASHI#if 201710L < __STDC_VERSION__
199*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
200*820c1a8dSHiroo HAYASHI#elif _GL_HAS_ATTRIBUTE (unused)
201*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_MAYBE_UNUSED __attribute__ ((__unused__))
202*820c1a8dSHiroo HAYASHI#else
203*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_MAYBE_UNUSED
204*820c1a8dSHiroo HAYASHI#endif
205*820c1a8dSHiroo HAYASHI/* Earlier spellings of this macro.  */
206*820c1a8dSHiroo HAYASHI#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
207*820c1a8dSHiroo HAYASHI#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
208*820c1a8dSHiroo HAYASHI
209*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (malloc)
210*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
211*820c1a8dSHiroo HAYASHI#else
212*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_MALLOC
213*820c1a8dSHiroo HAYASHI#endif
214*820c1a8dSHiroo HAYASHI
215*820c1a8dSHiroo HAYASHI#if 201710L < __STDC_VERSION__
216*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
217*820c1a8dSHiroo HAYASHI#elif _GL_HAS_ATTRIBUTE (warn_unused_result)
218*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
219*820c1a8dSHiroo HAYASHI#else
220*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NODISCARD
221*820c1a8dSHiroo HAYASHI#endif
222*820c1a8dSHiroo HAYASHI
223*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (noinline)
224*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
225*820c1a8dSHiroo HAYASHI#else
226*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NOINLINE
227*820c1a8dSHiroo HAYASHI#endif
228*820c1a8dSHiroo HAYASHI
229*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (nonnull)
230*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
231*820c1a8dSHiroo HAYASHI#else
232*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NONNULL(args)
233*820c1a8dSHiroo HAYASHI#endif
234*820c1a8dSHiroo HAYASHI
235*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (nonstring)
236*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
237*820c1a8dSHiroo HAYASHI#else
238*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NONSTRING
239*820c1a8dSHiroo HAYASHI#endif
240*820c1a8dSHiroo HAYASHI
241*820c1a8dSHiroo HAYASHI/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead.  */
242*820c1a8dSHiroo HAYASHI
243*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
244*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
245*820c1a8dSHiroo HAYASHI#else
246*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_NOTHROW
247*820c1a8dSHiroo HAYASHI#endif
248*820c1a8dSHiroo HAYASHI
249*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (packed)
250*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
251*820c1a8dSHiroo HAYASHI#else
252*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_PACKED
253*820c1a8dSHiroo HAYASHI#endif
254*820c1a8dSHiroo HAYASHI
255*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (pure)
256*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
257*820c1a8dSHiroo HAYASHI#else
258*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_PURE
259*820c1a8dSHiroo HAYASHI#endif
260*820c1a8dSHiroo HAYASHI
261*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (returns_nonnull)
262*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
263*820c1a8dSHiroo HAYASHI#else
264*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_RETURNS_NONNULL
265*820c1a8dSHiroo HAYASHI#endif
266*820c1a8dSHiroo HAYASHI
267*820c1a8dSHiroo HAYASHI#if _GL_HAS_ATTRIBUTE (sentinel)
268*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
269*820c1a8dSHiroo HAYASHI#else
270*820c1a8dSHiroo HAYASHI# define _GL_ATTRIBUTE_SENTINEL(pos)
271*820c1a8dSHiroo HAYASHI#endif
272*820c1a8dSHiroo HAYASHI
273*820c1a8dSHiroo HAYASHI]dnl There is no _GL_ATTRIBUTE_VISIBILITY; see m4/visibility.m4 instead.
274*820c1a8dSHiroo HAYASHI[
275*820c1a8dSHiroo HAYASHI/* To support C++ as well as C, use _GL_UNUSED_LABEL with trailing ';'.  */
276*820c1a8dSHiroo HAYASHI#if !defined __cplusplus || _GL_GNUC_PREREQ (4, 5)
277*820c1a8dSHiroo HAYASHI# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_MAYBE_UNUSED
278*820c1a8dSHiroo HAYASHI#else
279*820c1a8dSHiroo HAYASHI# define _GL_UNUSED_LABEL
280*820c1a8dSHiroo HAYASHI#endif
281*820c1a8dSHiroo HAYASHI])
282*820c1a8dSHiroo HAYASHI  AH_VERBATIM([async_safe],
283*820c1a8dSHiroo HAYASHI[/* The _GL_ASYNC_SAFE marker should be attached to functions that are
284*820c1a8dSHiroo HAYASHI   signal handlers (for signals other than SIGABRT, SIGPIPE) or can be
285*820c1a8dSHiroo HAYASHI   invoked from such signal handlers.  Such functions have some restrictions:
286*820c1a8dSHiroo HAYASHI     * All functions that it calls should be marked _GL_ASYNC_SAFE as well,
287*820c1a8dSHiroo HAYASHI       or should be listed as async-signal-safe in POSIX
288*820c1a8dSHiroo HAYASHI       <https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04>
289*820c1a8dSHiroo HAYASHI       section 2.4.3.  Note that malloc(), sprintf(), and fwrite(), in
290*820c1a8dSHiroo HAYASHI       particular, are NOT async-signal-safe.
291*820c1a8dSHiroo HAYASHI     * All memory locations (variables and struct fields) that these functions
292*820c1a8dSHiroo HAYASHI       access must be marked 'volatile'.  This holds for both read and write
293*820c1a8dSHiroo HAYASHI       accesses.  Otherwise the compiler might optimize away stores to and
294*820c1a8dSHiroo HAYASHI       reads from such locations that occur in the program, depending on its
295*820c1a8dSHiroo HAYASHI       data flow analysis.  For example, when the program contains a loop
296*820c1a8dSHiroo HAYASHI       that is intended to inspect a variable set from within a signal handler
297*820c1a8dSHiroo HAYASHI           while (!signal_occurred)
298*820c1a8dSHiroo HAYASHI             ;
299*820c1a8dSHiroo HAYASHI       the compiler is allowed to transform this into an endless loop if the
300*820c1a8dSHiroo HAYASHI       variable 'signal_occurred' is not declared 'volatile'.
301*820c1a8dSHiroo HAYASHI   Additionally, recall that:
302*820c1a8dSHiroo HAYASHI     * A signal handler should not modify errno (except if it is a handler
303*820c1a8dSHiroo HAYASHI       for a fatal signal and ends by raising the same signal again, thus
304*820c1a8dSHiroo HAYASHI       provoking the termination of the process).  If it invokes a function
305*820c1a8dSHiroo HAYASHI       that may clobber errno, it needs to save and restore the value of
306*820c1a8dSHiroo HAYASHI       errno.  */
307*820c1a8dSHiroo HAYASHI#define _GL_ASYNC_SAFE
308*820c1a8dSHiroo HAYASHI])
309*820c1a8dSHiroo HAYASHI  AH_VERBATIM([micro_optimizations],
310*820c1a8dSHiroo HAYASHI[/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
311*820c1a8dSHiroo HAYASHI   n1 and n2 are expressions without side effects, that evaluate to real
312*820c1a8dSHiroo HAYASHI   numbers (excluding NaN).
313*820c1a8dSHiroo HAYASHI   It returns
314*820c1a8dSHiroo HAYASHI     1  if n1 > n2
315*820c1a8dSHiroo HAYASHI     0  if n1 == n2
316*820c1a8dSHiroo HAYASHI     -1 if n1 < n2
317*820c1a8dSHiroo HAYASHI   The naïve code   (n1 > n2 ? 1 : n1 < n2 ? -1 : 0)  produces a conditional
318*820c1a8dSHiroo HAYASHI   jump with nearly all GCC versions up to GCC 10.
319*820c1a8dSHiroo HAYASHI   This variant     (n1 < n2 ? -1 : n1 > n2)  produces a conditional with many
320*820c1a8dSHiroo HAYASHI   GCC versions up to GCC 9.
321*820c1a8dSHiroo HAYASHI   The better code  (n1 > n2) - (n1 < n2)  from Hacker's Delight § 2-9
322*820c1a8dSHiroo HAYASHI   avoids conditional jumps in all GCC versions >= 3.4.  */
323*820c1a8dSHiroo HAYASHI#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
324*820c1a8dSHiroo HAYASHI])
325*820c1a8dSHiroo HAYASHI  dnl Hint which direction to take regarding cross-compilation guesses:
326*820c1a8dSHiroo HAYASHI  dnl When a user installs a program on a platform they are not intimately
327*820c1a8dSHiroo HAYASHI  dnl familiar with, --enable-cross-guesses=conservative is the appropriate
328*820c1a8dSHiroo HAYASHI  dnl choice.  It implements the "If we don't know, assume the worst" principle.
329*820c1a8dSHiroo HAYASHI  dnl However, when an operating system developer (on a platform which is not
330*820c1a8dSHiroo HAYASHI  dnl yet known to gnulib) builds packages for their platform, they want to
331*820c1a8dSHiroo HAYASHI  dnl expose, not hide, possible platform bugs; in this case,
332*820c1a8dSHiroo HAYASHI  dnl --enable-cross-guesses=risky is the appropriate choice.
333*820c1a8dSHiroo HAYASHI  dnl Sets the variables
334*820c1a8dSHiroo HAYASHI  dnl gl_cross_guess_normal    (to be used when 'yes' is good and 'no' is bad),
335*820c1a8dSHiroo HAYASHI  dnl gl_cross_guess_inverted  (to be used when 'no' is good and 'yes' is bad).
336*820c1a8dSHiroo HAYASHI  AC_ARG_ENABLE([cross-guesses],
337*820c1a8dSHiroo HAYASHI    [AS_HELP_STRING([--enable-cross-guesses={conservative|risky}],
338*820c1a8dSHiroo HAYASHI       [specify policy for cross-compilation guesses])],
339*820c1a8dSHiroo HAYASHI    [if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
340*820c1a8dSHiroo HAYASHI       AC_MSG_WARN([invalid argument supplied to --enable-cross-guesses])
341*820c1a8dSHiroo HAYASHI       enableval=conservative
342*820c1a8dSHiroo HAYASHI     fi
343*820c1a8dSHiroo HAYASHI     gl_cross_guesses="$enableval"],
344*820c1a8dSHiroo HAYASHI    [gl_cross_guesses=conservative])
345*820c1a8dSHiroo HAYASHI  if test $gl_cross_guesses = risky; then
346*820c1a8dSHiroo HAYASHI    gl_cross_guess_normal="guessing yes"
347*820c1a8dSHiroo HAYASHI    gl_cross_guess_inverted="guessing no"
348*820c1a8dSHiroo HAYASHI  else
349*820c1a8dSHiroo HAYASHI    gl_cross_guess_normal="guessing no"
350*820c1a8dSHiroo HAYASHI    gl_cross_guess_inverted="guessing yes"
351*820c1a8dSHiroo HAYASHI  fi
352*820c1a8dSHiroo HAYASHI  dnl Preparation for running test programs:
353*820c1a8dSHiroo HAYASHI  dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not
354*820c1a8dSHiroo HAYASHI  dnl to /dev/tty, so they can be redirected to log files.  Such diagnostics
355*820c1a8dSHiroo HAYASHI  dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N.
356*820c1a8dSHiroo HAYASHI  LIBC_FATAL_STDERR_=1
357*820c1a8dSHiroo HAYASHI  export LIBC_FATAL_STDERR_
358*820c1a8dSHiroo HAYASHI])
359*820c1a8dSHiroo HAYASHI
360*820c1a8dSHiroo HAYASHI# gl_MODULE_INDICATOR_INIT_VARIABLE([variablename])
361*820c1a8dSHiroo HAYASHI# gl_MODULE_INDICATOR_INIT_VARIABLE([variablename], [initialvalue])
362*820c1a8dSHiroo HAYASHI# initializes the shell variable that indicates the presence of the given module
363*820c1a8dSHiroo HAYASHI# as a C preprocessor expression.
364*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MODULE_INDICATOR_INIT_VARIABLE],
365*820c1a8dSHiroo HAYASHI[
366*820c1a8dSHiroo HAYASHI  GL_MODULE_INDICATOR_PREFIX[]_[$1]=m4_if([$2], , [0], [$2])
367*820c1a8dSHiroo HAYASHI  AC_SUBST(GL_MODULE_INDICATOR_PREFIX[]_[$1])
368*820c1a8dSHiroo HAYASHI])
369*820c1a8dSHiroo HAYASHI
370*820c1a8dSHiroo HAYASHI# gl_MODULE_INDICATOR_CONDITION
371*820c1a8dSHiroo HAYASHI# expands to a C preprocessor expression that evaluates to 1 or 0, depending
372*820c1a8dSHiroo HAYASHI# whether a gnulib module that has been requested shall be considered present
373*820c1a8dSHiroo HAYASHI# or not.
374*820c1a8dSHiroo HAYASHIm4_define([gl_MODULE_INDICATOR_CONDITION], [1])
375*820c1a8dSHiroo HAYASHI
376*820c1a8dSHiroo HAYASHI# gl_MODULE_INDICATOR_SET_VARIABLE([modulename])
377*820c1a8dSHiroo HAYASHI# sets the shell variable that indicates the presence of the given module to
378*820c1a8dSHiroo HAYASHI# a C preprocessor expression that will evaluate to 1.
379*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE],
380*820c1a8dSHiroo HAYASHI[
381*820c1a8dSHiroo HAYASHI  gl_MODULE_INDICATOR_SET_VARIABLE_AUX(
382*820c1a8dSHiroo HAYASHI    [GL_MODULE_INDICATOR_PREFIX[]_GNULIB_[]m4_translit([[$1]],
383*820c1a8dSHiroo HAYASHI                                                       [abcdefghijklmnopqrstuvwxyz./-],
384*820c1a8dSHiroo HAYASHI                                                       [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
385*820c1a8dSHiroo HAYASHI    [gl_MODULE_INDICATOR_CONDITION])
386*820c1a8dSHiroo HAYASHI])
387*820c1a8dSHiroo HAYASHI
388*820c1a8dSHiroo HAYASHI# gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable])
389*820c1a8dSHiroo HAYASHI# modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION.
390*820c1a8dSHiroo HAYASHI# The shell variable's value is a C preprocessor expression that evaluates
391*820c1a8dSHiroo HAYASHI# to 0 or 1.
392*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX],
393*820c1a8dSHiroo HAYASHI[
394*820c1a8dSHiroo HAYASHI  m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1],
395*820c1a8dSHiroo HAYASHI    [
396*820c1a8dSHiroo HAYASHI     dnl Simplify the expression VALUE || 1 to 1.
397*820c1a8dSHiroo HAYASHI     $1=1
398*820c1a8dSHiroo HAYASHI    ],
399*820c1a8dSHiroo HAYASHI    [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1],
400*820c1a8dSHiroo HAYASHI                                             [gl_MODULE_INDICATOR_CONDITION])])
401*820c1a8dSHiroo HAYASHI])
402*820c1a8dSHiroo HAYASHI
403*820c1a8dSHiroo HAYASHI# gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition])
404*820c1a8dSHiroo HAYASHI# modifies the shell variable to include the given condition.  The shell
405*820c1a8dSHiroo HAYASHI# variable's value is a C preprocessor expression that evaluates to 0 or 1.
406*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR],
407*820c1a8dSHiroo HAYASHI[
408*820c1a8dSHiroo HAYASHI  dnl Simplify the expression 1 || CONDITION to 1.
409*820c1a8dSHiroo HAYASHI  if test "$[]$1" != 1; then
410*820c1a8dSHiroo HAYASHI    dnl Simplify the expression 0 || CONDITION to CONDITION.
411*820c1a8dSHiroo HAYASHI    if test "$[]$1" = 0; then
412*820c1a8dSHiroo HAYASHI      $1=$2
413*820c1a8dSHiroo HAYASHI    else
414*820c1a8dSHiroo HAYASHI      $1="($[]$1 || $2)"
415*820c1a8dSHiroo HAYASHI    fi
416*820c1a8dSHiroo HAYASHI  fi
417*820c1a8dSHiroo HAYASHI])
418*820c1a8dSHiroo HAYASHI
419*820c1a8dSHiroo HAYASHI# gl_MODULE_INDICATOR([modulename])
420*820c1a8dSHiroo HAYASHI# defines a C macro indicating the presence of the given module
421*820c1a8dSHiroo HAYASHI# in a location where it can be used.
422*820c1a8dSHiroo HAYASHI#                                             |  Value  |   Value   |
423*820c1a8dSHiroo HAYASHI#                                             | in lib/ | in tests/ |
424*820c1a8dSHiroo HAYASHI# --------------------------------------------+---------+-----------+
425*820c1a8dSHiroo HAYASHI# Module present among main modules:          |    1    |     1     |
426*820c1a8dSHiroo HAYASHI# --------------------------------------------+---------+-----------+
427*820c1a8dSHiroo HAYASHI# Module present among tests-related modules: |    0    |     1     |
428*820c1a8dSHiroo HAYASHI# --------------------------------------------+---------+-----------+
429*820c1a8dSHiroo HAYASHI# Module not present at all:                  |    0    |     0     |
430*820c1a8dSHiroo HAYASHI# --------------------------------------------+---------+-----------+
431*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MODULE_INDICATOR],
432*820c1a8dSHiroo HAYASHI[
433*820c1a8dSHiroo HAYASHI  AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]],
434*820c1a8dSHiroo HAYASHI      [abcdefghijklmnopqrstuvwxyz./-],
435*820c1a8dSHiroo HAYASHI      [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]),
436*820c1a8dSHiroo HAYASHI    [gl_MODULE_INDICATOR_CONDITION],
437*820c1a8dSHiroo HAYASHI    [Define to a C preprocessor expression that evaluates to 1 or 0,
438*820c1a8dSHiroo HAYASHI     depending whether the gnulib module $1 shall be considered present.])
439*820c1a8dSHiroo HAYASHI])
440*820c1a8dSHiroo HAYASHI
441*820c1a8dSHiroo HAYASHI# gl_MODULE_INDICATOR_FOR_TESTS([modulename])
442*820c1a8dSHiroo HAYASHI# defines a C macro indicating the presence of the given module
443*820c1a8dSHiroo HAYASHI# in lib or tests. This is useful to determine whether the module
444*820c1a8dSHiroo HAYASHI# should be tested.
445*820c1a8dSHiroo HAYASHI#                                             |  Value  |   Value   |
446*820c1a8dSHiroo HAYASHI#                                             | in lib/ | in tests/ |
447*820c1a8dSHiroo HAYASHI# --------------------------------------------+---------+-----------+
448*820c1a8dSHiroo HAYASHI# Module present among main modules:          |    1    |     1     |
449*820c1a8dSHiroo HAYASHI# --------------------------------------------+---------+-----------+
450*820c1a8dSHiroo HAYASHI# Module present among tests-related modules: |    1    |     1     |
451*820c1a8dSHiroo HAYASHI# --------------------------------------------+---------+-----------+
452*820c1a8dSHiroo HAYASHI# Module not present at all:                  |    0    |     0     |
453*820c1a8dSHiroo HAYASHI# --------------------------------------------+---------+-----------+
454*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS],
455*820c1a8dSHiroo HAYASHI[
456*820c1a8dSHiroo HAYASHI  AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]],
457*820c1a8dSHiroo HAYASHI      [abcdefghijklmnopqrstuvwxyz./-],
458*820c1a8dSHiroo HAYASHI      [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
459*820c1a8dSHiroo HAYASHI    [Define to 1 when the gnulib module $1 should be tested.])
460*820c1a8dSHiroo HAYASHI])
461*820c1a8dSHiroo HAYASHI
462*820c1a8dSHiroo HAYASHI# gl_ASSERT_NO_GNULIB_POSIXCHECK
463*820c1a8dSHiroo HAYASHI# asserts that there will never be a need to #define GNULIB_POSIXCHECK.
464*820c1a8dSHiroo HAYASHI# and thereby enables an optimization of configure and config.h.
465*820c1a8dSHiroo HAYASHI# Used by Emacs.
466*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK],
467*820c1a8dSHiroo HAYASHI[
468*820c1a8dSHiroo HAYASHI  dnl Override gl_WARN_ON_USE_PREPARE.
469*820c1a8dSHiroo HAYASHI  dnl But hide this definition from 'aclocal'.
470*820c1a8dSHiroo HAYASHI  AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], [])
471*820c1a8dSHiroo HAYASHI])
472*820c1a8dSHiroo HAYASHI
473*820c1a8dSHiroo HAYASHI# gl_ASSERT_NO_GNULIB_TESTS
474*820c1a8dSHiroo HAYASHI# asserts that there will be no gnulib tests in the scope of the configure.ac
475*820c1a8dSHiroo HAYASHI# and thereby enables an optimization of config.h.
476*820c1a8dSHiroo HAYASHI# Used by Emacs.
477*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS],
478*820c1a8dSHiroo HAYASHI[
479*820c1a8dSHiroo HAYASHI  dnl Override gl_MODULE_INDICATOR_FOR_TESTS.
480*820c1a8dSHiroo HAYASHI  AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [])
481*820c1a8dSHiroo HAYASHI])
482*820c1a8dSHiroo HAYASHI
483*820c1a8dSHiroo HAYASHI# Test whether <features.h> exists.
484*820c1a8dSHiroo HAYASHI# Set HAVE_FEATURES_H.
485*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_FEATURES_H],
486*820c1a8dSHiroo HAYASHI[
487*820c1a8dSHiroo HAYASHI  AC_CHECK_HEADERS_ONCE([features.h])
488*820c1a8dSHiroo HAYASHI  if test $ac_cv_header_features_h = yes; then
489*820c1a8dSHiroo HAYASHI    HAVE_FEATURES_H=1
490*820c1a8dSHiroo HAYASHI  else
491*820c1a8dSHiroo HAYASHI    HAVE_FEATURES_H=0
492*820c1a8dSHiroo HAYASHI  fi
493*820c1a8dSHiroo HAYASHI  AC_SUBST([HAVE_FEATURES_H])
494*820c1a8dSHiroo HAYASHI])
495*820c1a8dSHiroo HAYASHI
496*820c1a8dSHiroo HAYASHI# gl_PROG_CC_C99
497*820c1a8dSHiroo HAYASHI# Modifies the value of the shell variable CC in an attempt to make $CC
498*820c1a8dSHiroo HAYASHI# understand ISO C99 source code.
499*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_PROG_CC_C99],
500*820c1a8dSHiroo HAYASHI[
501*820c1a8dSHiroo HAYASHI  dnl Just use AC_PROG_CC_C99.
502*820c1a8dSHiroo HAYASHI  dnl When AC_PROG_CC_C99 and AC_PROG_CC_STDC are used together, the substituted
503*820c1a8dSHiroo HAYASHI  dnl value of CC will contain the C99 enabling options twice. But this is only
504*820c1a8dSHiroo HAYASHI  dnl a cosmetic problem.
505*820c1a8dSHiroo HAYASHI  dnl With Autoconf >= 2.70, use AC_PROG_CC since it implies AC_PROG_CC_C99;
506*820c1a8dSHiroo HAYASHI  dnl this avoids a "warning: The macro `AC_PROG_CC_C99' is obsolete."
507*820c1a8dSHiroo HAYASHI  m4_version_prereq([2.70],
508*820c1a8dSHiroo HAYASHI    [AC_REQUIRE([AC_PROG_CC])],
509*820c1a8dSHiroo HAYASHI    [AC_REQUIRE([AC_PROG_CC_C99])])
510*820c1a8dSHiroo HAYASHI])
511*820c1a8dSHiroo HAYASHI
512*820c1a8dSHiroo HAYASHI# gl_PROG_AR_RANLIB
513*820c1a8dSHiroo HAYASHI# Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler.
514*820c1a8dSHiroo HAYASHI# The user can set the variables AR, ARFLAGS, RANLIB if he wants to override
515*820c1a8dSHiroo HAYASHI# the values.
516*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_PROG_AR_RANLIB],
517*820c1a8dSHiroo HAYASHI[
518*820c1a8dSHiroo HAYASHI  dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler
519*820c1a8dSHiroo HAYASHI  dnl as "cc", and GCC as "gcc". They have different object file formats and
520*820c1a8dSHiroo HAYASHI  dnl library formats. In particular, the GNU binutils programs ar and ranlib
521*820c1a8dSHiroo HAYASHI  dnl produce libraries that work only with gcc, not with cc.
522*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_PROG_CC])
523*820c1a8dSHiroo HAYASHI  dnl The '][' hides this use from 'aclocal'.
524*820c1a8dSHiroo HAYASHI  AC_BEFORE([$0], [A][M_PROG_AR])
525*820c1a8dSHiroo HAYASHI  AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler],
526*820c1a8dSHiroo HAYASHI    [
527*820c1a8dSHiroo HAYASHI      AC_EGREP_CPP([Amsterdam],
528*820c1a8dSHiroo HAYASHI        [
529*820c1a8dSHiroo HAYASHI#ifdef __ACK__
530*820c1a8dSHiroo HAYASHIAmsterdam
531*820c1a8dSHiroo HAYASHI#endif
532*820c1a8dSHiroo HAYASHI        ],
533*820c1a8dSHiroo HAYASHI        [gl_cv_c_amsterdam_compiler=yes],
534*820c1a8dSHiroo HAYASHI        [gl_cv_c_amsterdam_compiler=no])
535*820c1a8dSHiroo HAYASHI    ])
536*820c1a8dSHiroo HAYASHI
537*820c1a8dSHiroo HAYASHI  dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not
538*820c1a8dSHiroo HAYASHI  dnl building with __ACK__.
539*820c1a8dSHiroo HAYASHI  if test $gl_cv_c_amsterdam_compiler = yes; then
540*820c1a8dSHiroo HAYASHI    if test -z "$AR"; then
541*820c1a8dSHiroo HAYASHI      AR='cc -c.a'
542*820c1a8dSHiroo HAYASHI    fi
543*820c1a8dSHiroo HAYASHI    if test -z "$ARFLAGS"; then
544*820c1a8dSHiroo HAYASHI      ARFLAGS='-o'
545*820c1a8dSHiroo HAYASHI    fi
546*820c1a8dSHiroo HAYASHI  else
547*820c1a8dSHiroo HAYASHI    dnl AM_PROG_AR was added in automake v1.11.2.  AM_PROG_AR does not AC_SUBST
548*820c1a8dSHiroo HAYASHI    dnl ARFLAGS variable (it is filed into Makefile.in directly by automake
549*820c1a8dSHiroo HAYASHI    dnl script on-demand, if not specified by ./configure of course).
550*820c1a8dSHiroo HAYASHI    dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above
551*820c1a8dSHiroo HAYASHI    dnl will be ignored.  Also, pay attention to call AM_PROG_AR in else block
552*820c1a8dSHiroo HAYASHI    dnl because AM_PROG_AR is written so it could re-set AR variable even for
553*820c1a8dSHiroo HAYASHI    dnl __ACK__.  It may seem like its easier to avoid calling the macro here,
554*820c1a8dSHiroo HAYASHI    dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good
555*820c1a8dSHiroo HAYASHI    dnl default value and automake should usually know them).
556*820c1a8dSHiroo HAYASHI    dnl
557*820c1a8dSHiroo HAYASHI    dnl The '][' hides this use from 'aclocal'.
558*820c1a8dSHiroo HAYASHI    m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:])
559*820c1a8dSHiroo HAYASHI  fi
560*820c1a8dSHiroo HAYASHI
561*820c1a8dSHiroo HAYASHI  dnl In case the code above has not helped with setting AR/ARFLAGS, use
562*820c1a8dSHiroo HAYASHI  dnl Automake-documented default values for AR and ARFLAGS, but prefer
563*820c1a8dSHiroo HAYASHI  dnl ${host}-ar over ar (useful for cross-compiling).
564*820c1a8dSHiroo HAYASHI  AC_CHECK_TOOL([AR], [ar], [ar])
565*820c1a8dSHiroo HAYASHI  if test -z "$ARFLAGS"; then
566*820c1a8dSHiroo HAYASHI    ARFLAGS='cr'
567*820c1a8dSHiroo HAYASHI  fi
568*820c1a8dSHiroo HAYASHI
569*820c1a8dSHiroo HAYASHI  AC_SUBST([AR])
570*820c1a8dSHiroo HAYASHI  AC_SUBST([ARFLAGS])
571*820c1a8dSHiroo HAYASHI  if test -z "$RANLIB"; then
572*820c1a8dSHiroo HAYASHI    if test $gl_cv_c_amsterdam_compiler = yes; then
573*820c1a8dSHiroo HAYASHI      RANLIB=':'
574*820c1a8dSHiroo HAYASHI    else
575*820c1a8dSHiroo HAYASHI      dnl Use the ranlib program if it is available.
576*820c1a8dSHiroo HAYASHI      AC_PROG_RANLIB
577*820c1a8dSHiroo HAYASHI    fi
578*820c1a8dSHiroo HAYASHI  fi
579*820c1a8dSHiroo HAYASHI  AC_SUBST([RANLIB])
580*820c1a8dSHiroo HAYASHI])
581*820c1a8dSHiroo HAYASHI
582*820c1a8dSHiroo HAYASHI# AC_C_RESTRICT
583*820c1a8dSHiroo HAYASHI# This definition is copied from post-2.70 Autoconf and overrides the
584*820c1a8dSHiroo HAYASHI# AC_C_RESTRICT macro from autoconf 2.60..2.70.
585*820c1a8dSHiroo HAYASHIm4_version_prereq([2.70.1], [], [
586*820c1a8dSHiroo HAYASHIAC_DEFUN([AC_C_RESTRICT],
587*820c1a8dSHiroo HAYASHI[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
588*820c1a8dSHiroo HAYASHI  [ac_cv_c_restrict=no
589*820c1a8dSHiroo HAYASHI   # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
590*820c1a8dSHiroo HAYASHI   # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
591*820c1a8dSHiroo HAYASHI   # Put 'restrict' last, because C++ lacks it.
592*820c1a8dSHiroo HAYASHI   for ac_kw in __restrict__ __restrict _Restrict restrict; do
593*820c1a8dSHiroo HAYASHI     AC_COMPILE_IFELSE(
594*820c1a8dSHiroo HAYASHI      [AC_LANG_PROGRAM(
595*820c1a8dSHiroo HAYASHI         [[typedef int *int_ptr;
596*820c1a8dSHiroo HAYASHI           int foo (int_ptr $ac_kw ip) { return ip[0]; }
597*820c1a8dSHiroo HAYASHI           int bar (int [$ac_kw]); /* Catch GCC bug 14050.  */
598*820c1a8dSHiroo HAYASHI           int bar (int ip[$ac_kw]) { return ip[0]; }
599*820c1a8dSHiroo HAYASHI         ]],
600*820c1a8dSHiroo HAYASHI         [[int s[1];
601*820c1a8dSHiroo HAYASHI           int *$ac_kw t = s;
602*820c1a8dSHiroo HAYASHI           t[0] = 0;
603*820c1a8dSHiroo HAYASHI           return foo (t) + bar (t);
604*820c1a8dSHiroo HAYASHI         ]])],
605*820c1a8dSHiroo HAYASHI      [ac_cv_c_restrict=$ac_kw])
606*820c1a8dSHiroo HAYASHI     test "$ac_cv_c_restrict" != no && break
607*820c1a8dSHiroo HAYASHI   done
608*820c1a8dSHiroo HAYASHI  ])
609*820c1a8dSHiroo HAYASHI AH_VERBATIM([restrict],
610*820c1a8dSHiroo HAYASHI[/* Define to the equivalent of the C99 'restrict' keyword, or to
611*820c1a8dSHiroo HAYASHI   nothing if this is not supported.  Do not define if restrict is
612*820c1a8dSHiroo HAYASHI   supported only directly.  */
613*820c1a8dSHiroo HAYASHI#undef restrict
614*820c1a8dSHiroo HAYASHI/* Work around a bug in older versions of Sun C++, which did not
615*820c1a8dSHiroo HAYASHI   #define __restrict__ or support _Restrict or __restrict__
616*820c1a8dSHiroo HAYASHI   even though the corresponding Sun C compiler ended up with
617*820c1a8dSHiroo HAYASHI   "#define restrict _Restrict" or "#define restrict __restrict__"
618*820c1a8dSHiroo HAYASHI   in the previous line.  This workaround can be removed once
619*820c1a8dSHiroo HAYASHI   we assume Oracle Developer Studio 12.5 (2016) or later.  */
620*820c1a8dSHiroo HAYASHI#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
621*820c1a8dSHiroo HAYASHI# define _Restrict
622*820c1a8dSHiroo HAYASHI# define __restrict__
623*820c1a8dSHiroo HAYASHI#endif])
624*820c1a8dSHiroo HAYASHI case $ac_cv_c_restrict in
625*820c1a8dSHiroo HAYASHI   restrict) ;;
626*820c1a8dSHiroo HAYASHI   no) AC_DEFINE([restrict], []) ;;
627*820c1a8dSHiroo HAYASHI   *)  AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
628*820c1a8dSHiroo HAYASHI esac
629*820c1a8dSHiroo HAYASHI])# AC_C_RESTRICT
630*820c1a8dSHiroo HAYASHI])
631*820c1a8dSHiroo HAYASHI
632*820c1a8dSHiroo HAYASHI# gl_BIGENDIAN
633*820c1a8dSHiroo HAYASHI# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
634*820c1a8dSHiroo HAYASHI# Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some
635*820c1a8dSHiroo HAYASHI# macros invoke AC_C_BIGENDIAN with arguments.
636*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_BIGENDIAN],
637*820c1a8dSHiroo HAYASHI[
638*820c1a8dSHiroo HAYASHI  AC_C_BIGENDIAN
639*820c1a8dSHiroo HAYASHI])
640*820c1a8dSHiroo HAYASHI
641*820c1a8dSHiroo HAYASHI# A temporary file descriptor.
642*820c1a8dSHiroo HAYASHI# Must be less than 10, because dash 0.5.8 does not support redirections
643*820c1a8dSHiroo HAYASHI# with multi-digit file descriptors.
644*820c1a8dSHiroo HAYASHIm4_define([GL_TMP_FD], 9)
645*820c1a8dSHiroo HAYASHI
646*820c1a8dSHiroo HAYASHI# gl_SILENT(command)
647*820c1a8dSHiroo HAYASHI# executes command, but without the normal configure output.
648*820c1a8dSHiroo HAYASHI# This is useful when you want to invoke AC_CACHE_CHECK (or AC_CHECK_FUNC etc.)
649*820c1a8dSHiroo HAYASHI# inside another AC_CACHE_CHECK.
650*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_SILENT],
651*820c1a8dSHiroo HAYASHI[
652*820c1a8dSHiroo HAYASHI  exec GL_TMP_FD>&AS_MESSAGE_FD AS_MESSAGE_FD>/dev/null
653*820c1a8dSHiroo HAYASHI  $1
654*820c1a8dSHiroo HAYASHI  exec AS_MESSAGE_FD>&GL_TMP_FD GL_TMP_FD>&-
655*820c1a8dSHiroo HAYASHI])
656*820c1a8dSHiroo HAYASHI
657*820c1a8dSHiroo HAYASHI# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
658*820c1a8dSHiroo HAYASHI# is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
659*820c1a8dSHiroo HAYASHI# output a spurious "(cached)" mark in the midst of other configure output.
660*820c1a8dSHiroo HAYASHI# This macro should be used instead of AC_CACHE_VAL when it is not surrounded
661*820c1a8dSHiroo HAYASHI# by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
662*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_CACHE_VAL_SILENT],
663*820c1a8dSHiroo HAYASHI[
664*820c1a8dSHiroo HAYASHI  gl_SILENT([
665*820c1a8dSHiroo HAYASHI    AC_CACHE_VAL([$1], [$2])
666*820c1a8dSHiroo HAYASHI  ])
667*820c1a8dSHiroo HAYASHI])
668*820c1a8dSHiroo HAYASHI
669*820c1a8dSHiroo HAYASHI# gl_CC_ALLOW_WARNINGS
670*820c1a8dSHiroo HAYASHI# sets and substitutes a variable GL_CFLAG_ALLOW_WARNINGS, to a $(CC) option
671*820c1a8dSHiroo HAYASHI# that reverts a preceding '-Werror' option, if available.
672*820c1a8dSHiroo HAYASHI# This is expected to be '-Wno-error' on gcc, clang (except clang/MSVC), xlclang
673*820c1a8dSHiroo HAYASHI# and empty otherwise.
674*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_CC_ALLOW_WARNINGS],
675*820c1a8dSHiroo HAYASHI[
676*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_PROG_CC])
677*820c1a8dSHiroo HAYASHI  AC_CACHE_CHECK([for C compiler option to allow warnings],
678*820c1a8dSHiroo HAYASHI    [gl_cv_cc_wallow],
679*820c1a8dSHiroo HAYASHI    [rm -f conftest*
680*820c1a8dSHiroo HAYASHI     echo 'int dummy;' > conftest.c
681*820c1a8dSHiroo HAYASHI     AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err]) >/dev/null
682*820c1a8dSHiroo HAYASHI     AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err]) >/dev/null
683*820c1a8dSHiroo HAYASHI     dnl Test the number of error output lines, because AIX xlc accepts the
684*820c1a8dSHiroo HAYASHI     dnl option '-Wno-error', just to produce a warning
685*820c1a8dSHiroo HAYASHI     dnl "Option -Wno-error was incorrectly specified. The option will be ignored."
686*820c1a8dSHiroo HAYASHI     dnl afterwards.
687*820c1a8dSHiroo HAYASHI     if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
688*820c1a8dSHiroo HAYASHI       gl_cv_cc_wallow='-Wno-error'
689*820c1a8dSHiroo HAYASHI     else
690*820c1a8dSHiroo HAYASHI       gl_cv_cc_wallow=none
691*820c1a8dSHiroo HAYASHI     fi
692*820c1a8dSHiroo HAYASHI     rm -f conftest*
693*820c1a8dSHiroo HAYASHI    ])
694*820c1a8dSHiroo HAYASHI  case "$gl_cv_cc_wallow" in
695*820c1a8dSHiroo HAYASHI    none) GL_CFLAG_ALLOW_WARNINGS='' ;;
696*820c1a8dSHiroo HAYASHI    *)    GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;;
697*820c1a8dSHiroo HAYASHI  esac
698*820c1a8dSHiroo HAYASHI  AC_SUBST([GL_CFLAG_ALLOW_WARNINGS])
699*820c1a8dSHiroo HAYASHI])
700*820c1a8dSHiroo HAYASHI
701*820c1a8dSHiroo HAYASHI# gl_CXX_ALLOW_WARNINGS
702*820c1a8dSHiroo HAYASHI# sets and substitutes a variable GL_CXXFLAG_ALLOW_WARNINGS, to a $(CC) option
703*820c1a8dSHiroo HAYASHI# that reverts a preceding '-Werror' option, if available.
704*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_CXX_ALLOW_WARNINGS],
705*820c1a8dSHiroo HAYASHI[
706*820c1a8dSHiroo HAYASHI  dnl Requires AC_PROG_CXX or gl_PROG_ANSI_CXX.
707*820c1a8dSHiroo HAYASHI  if test -n "$CXX" && test "$CXX" != no; then
708*820c1a8dSHiroo HAYASHI    AC_CACHE_CHECK([for C++ compiler option to allow warnings],
709*820c1a8dSHiroo HAYASHI      [gl_cv_cxx_wallow],
710*820c1a8dSHiroo HAYASHI      [rm -f conftest*
711*820c1a8dSHiroo HAYASHI       echo 'int dummy;' > conftest.cc
712*820c1a8dSHiroo HAYASHI       AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -c conftest.cc 2>conftest1.err]) >/dev/null
713*820c1a8dSHiroo HAYASHI       AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -Wno-error -c conftest.cc 2>conftest2.err]) >/dev/null
714*820c1a8dSHiroo HAYASHI       dnl Test the number of error output lines, because AIX xlC accepts the
715*820c1a8dSHiroo HAYASHI       dnl option '-Wno-error', just to produce a warning
716*820c1a8dSHiroo HAYASHI       dnl "Option -Wno-error was incorrectly specified. The option will be ignored."
717*820c1a8dSHiroo HAYASHI       dnl afterwards.
718*820c1a8dSHiroo HAYASHI       if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
719*820c1a8dSHiroo HAYASHI         gl_cv_cxx_wallow='-Wno-error'
720*820c1a8dSHiroo HAYASHI       else
721*820c1a8dSHiroo HAYASHI         gl_cv_cxx_wallow=none
722*820c1a8dSHiroo HAYASHI       fi
723*820c1a8dSHiroo HAYASHI       rm -f conftest*
724*820c1a8dSHiroo HAYASHI      ])
725*820c1a8dSHiroo HAYASHI    case "$gl_cv_cxx_wallow" in
726*820c1a8dSHiroo HAYASHI      none) GL_CXXFLAG_ALLOW_WARNINGS='' ;;
727*820c1a8dSHiroo HAYASHI      *)    GL_CXXFLAG_ALLOW_WARNINGS="$gl_cv_cxx_wallow" ;;
728*820c1a8dSHiroo HAYASHI    esac
729*820c1a8dSHiroo HAYASHI  else
730*820c1a8dSHiroo HAYASHI    GL_CXXFLAG_ALLOW_WARNINGS=''
731*820c1a8dSHiroo HAYASHI  fi
732*820c1a8dSHiroo HAYASHI  AC_SUBST([GL_CXXFLAG_ALLOW_WARNINGS])
733*820c1a8dSHiroo HAYASHI])
734*820c1a8dSHiroo HAYASHI
735*820c1a8dSHiroo HAYASHIdnl Expands to some code for use in .c programs that, on native Windows, defines
736*820c1a8dSHiroo HAYASHIdnl the Microsoft deprecated alias function names to the underscore-prefixed
737*820c1a8dSHiroo HAYASHIdnl actual function names. With this macro, these function names are available
738*820c1a8dSHiroo HAYASHIdnl without linking with '-loldnames' and without generating warnings.
739*820c1a8dSHiroo HAYASHIdnl Usage: Use it after all system header files are included.
740*820c1a8dSHiroo HAYASHIdnl          #include <...>
741*820c1a8dSHiroo HAYASHIdnl          #include <...>
742*820c1a8dSHiroo HAYASHIdnl          ]GL_MDA_DEFINES[
743*820c1a8dSHiroo HAYASHIdnl          ...
744*820c1a8dSHiroo HAYASHIAC_DEFUN([GL_MDA_DEFINES],[
745*820c1a8dSHiroo HAYASHIAC_REQUIRE([_GL_MDA_DEFINES])
746*820c1a8dSHiroo HAYASHI[$gl_mda_defines]
747*820c1a8dSHiroo HAYASHI])
748*820c1a8dSHiroo HAYASHIAC_DEFUN([_GL_MDA_DEFINES],
749*820c1a8dSHiroo HAYASHI[gl_mda_defines='
750*820c1a8dSHiroo HAYASHI#if defined _WIN32 && !defined __CYGWIN__
751*820c1a8dSHiroo HAYASHI#define access    _access
752*820c1a8dSHiroo HAYASHI#define chdir     _chdir
753*820c1a8dSHiroo HAYASHI#define chmod     _chmod
754*820c1a8dSHiroo HAYASHI#define close     _close
755*820c1a8dSHiroo HAYASHI#define creat     _creat
756*820c1a8dSHiroo HAYASHI#define dup       _dup
757*820c1a8dSHiroo HAYASHI#define dup2      _dup2
758*820c1a8dSHiroo HAYASHI#define ecvt      _ecvt
759*820c1a8dSHiroo HAYASHI#define execl     _execl
760*820c1a8dSHiroo HAYASHI#define execle    _execle
761*820c1a8dSHiroo HAYASHI#define execlp    _execlp
762*820c1a8dSHiroo HAYASHI#define execv     _execv
763*820c1a8dSHiroo HAYASHI#define execve    _execve
764*820c1a8dSHiroo HAYASHI#define execvp    _execvp
765*820c1a8dSHiroo HAYASHI#define execvpe   _execvpe
766*820c1a8dSHiroo HAYASHI#define fcloseall _fcloseall
767*820c1a8dSHiroo HAYASHI#define fcvt      _fcvt
768*820c1a8dSHiroo HAYASHI#define fdopen    _fdopen
769*820c1a8dSHiroo HAYASHI#define fileno    _fileno
770*820c1a8dSHiroo HAYASHI#define gcvt      _gcvt
771*820c1a8dSHiroo HAYASHI#define getcwd    _getcwd
772*820c1a8dSHiroo HAYASHI#define getpid    _getpid
773*820c1a8dSHiroo HAYASHI#define getw      _getw
774*820c1a8dSHiroo HAYASHI#define isatty    _isatty
775*820c1a8dSHiroo HAYASHI#define j0        _j0
776*820c1a8dSHiroo HAYASHI#define j1        _j1
777*820c1a8dSHiroo HAYASHI#define jn        _jn
778*820c1a8dSHiroo HAYASHI#define lfind     _lfind
779*820c1a8dSHiroo HAYASHI#define lsearch   _lsearch
780*820c1a8dSHiroo HAYASHI#define lseek     _lseek
781*820c1a8dSHiroo HAYASHI#define memccpy   _memccpy
782*820c1a8dSHiroo HAYASHI#define mkdir     _mkdir
783*820c1a8dSHiroo HAYASHI#define mktemp    _mktemp
784*820c1a8dSHiroo HAYASHI#define open      _open
785*820c1a8dSHiroo HAYASHI#define putenv    _putenv
786*820c1a8dSHiroo HAYASHI#define putw      _putw
787*820c1a8dSHiroo HAYASHI#define read      _read
788*820c1a8dSHiroo HAYASHI#define rmdir     _rmdir
789*820c1a8dSHiroo HAYASHI#define strdup    _strdup
790*820c1a8dSHiroo HAYASHI#define swab      _swab
791*820c1a8dSHiroo HAYASHI#define tempnam   _tempnam
792*820c1a8dSHiroo HAYASHI#define tzset     _tzset
793*820c1a8dSHiroo HAYASHI#define umask     _umask
794*820c1a8dSHiroo HAYASHI#define unlink    _unlink
795*820c1a8dSHiroo HAYASHI#define utime     _utime
796*820c1a8dSHiroo HAYASHI#define wcsdup    _wcsdup
797*820c1a8dSHiroo HAYASHI#define write     _write
798*820c1a8dSHiroo HAYASHI#define y0        _y0
799*820c1a8dSHiroo HAYASHI#define y1        _y1
800*820c1a8dSHiroo HAYASHI#define yn        _yn
801*820c1a8dSHiroo HAYASHI#endif
802*820c1a8dSHiroo HAYASHI'
803*820c1a8dSHiroo HAYASHI])
804